ZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NzkyZGQKLS0tIC9kZXYvbnVsbAorKysgYi9DT1BZSU5HCkBAIC0wLDAgKzEsNTE1IEBACisKKyAgICAgICAgICAgICAgICAgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMSwgRmVicnVhcnkgMTk5OQorCisgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKK1tUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBMZXNzZXIgR1BMLiAgSXQgYWxzbyBjb3VudHMKKyBhcyB0aGUgc3VjY2Vzc29yIG9mIHRoZSBHTlUgTGlicmFyeSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBoZW5jZQorIHRoZSB2ZXJzaW9uIG51bWJlciAyLjEuXQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQorZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgorCisgIFRoaXMgbGljZW5zZSwgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKK3NwZWNpYWxseSBkZXNpZ25hdGVkIHNvZnR3YXJlIHBhY2thZ2VzLS10eXBpY2FsbHkgbGlicmFyaWVzLS1vZiB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgb3RoZXIgYXV0aG9ycyB3aG8gZGVjaWRlIHRvIHVzZSBpdC4gIFlvdQorY2FuIHVzZSBpdCB0b28sIGJ1dCB3ZSBzdWdnZXN0IHlvdSBmaXJzdCB0aGluayBjYXJlZnVsbHkgYWJvdXQgd2hldGhlcgordGhpcyBsaWNlbnNlIG9yIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIHRoZSBiZXR0ZXIKK3N0cmF0ZWd5IHRvIHVzZSBpbiBhbnkgcGFydGljdWxhciBjYXNlLCBiYXNlZCBvbiB0aGUgZXhwbGFuYXRpb25zCitiZWxvdy4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSBvZiB1c2UsCitub3QgcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0Cit5b3UgaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlCitmb3IgdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKTsgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0CitpdCBpZiB5b3Ugd2FudCBpdDsgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgYW5kIHVzZSBwaWVjZXMgb2YKK2l0IGluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3UgYXJlIGluZm9ybWVkIHRoYXQgeW91IGNhbiBkbwordGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2Rpc3RyaWJ1dG9ycyB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlc2UKK3JpZ2h0cy4gIFRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvcgoreW91IGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIHdoZXRoZXIgZ3JhdGlzCitvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB3ZSBnYXZlCit5b3UuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlCitjb2RlLiAgSWYgeW91IGxpbmsgb3RoZXIgY29kZSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCitjb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMsIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0KK3dpdGggdGhlIGxpYnJhcnkgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCitpdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggYSB0d28tc3RlcCBtZXRob2Q6ICgxKSB3ZSBjb3B5cmlnaHQgdGhlCitsaWJyYXJ5LCBhbmQgKDIpIHdlIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2UsIHdoaWNoIGdpdmVzIHlvdSBsZWdhbAorcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIGxpYnJhcnkuCisKKyAgVG8gcHJvdGVjdCBlYWNoIGRpc3RyaWJ1dG9yLCB3ZSB3YW50IHRvIG1ha2UgaXQgdmVyeSBjbGVhciB0aGF0Cit0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIGZyZWUgbGlicmFyeS4gIEFsc28sIGlmIHRoZSBsaWJyYXJ5IGlzCittb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgdGhlIHJlY2lwaWVudHMgc2hvdWxkIGtub3cKK3RoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCB2ZXJzaW9uLCBzbyB0aGF0IHRoZSBvcmlnaW5hbAorYXV0aG9yJ3MgcmVwdXRhdGlvbiB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBwcm9ibGVtcyB0aGF0IG1pZ2h0IGJlCitpbnRyb2R1Y2VkIGJ5IG90aGVycy4KK15MCisgIEZpbmFsbHksIHNvZnR3YXJlIHBhdGVudHMgcG9zZSBhIGNvbnN0YW50IHRocmVhdCB0byB0aGUgZXhpc3RlbmNlIG9mCithbnkgZnJlZSBwcm9ncmFtLiAgV2Ugd2lzaCB0byBtYWtlIHN1cmUgdGhhdCBhIGNvbXBhbnkgY2Fubm90CitlZmZlY3RpdmVseSByZXN0cmljdCB0aGUgdXNlcnMgb2YgYSBmcmVlIHByb2dyYW0gYnkgb2J0YWluaW5nIGEKK3Jlc3RyaWN0aXZlIGxpY2Vuc2UgZnJvbSBhIHBhdGVudCBob2xkZXIuICBUaGVyZWZvcmUsIHdlIGluc2lzdCB0aGF0CithbnkgcGF0ZW50IGxpY2Vuc2Ugb2J0YWluZWQgZm9yIGEgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBtdXN0IGJlCitjb25zaXN0ZW50IHdpdGggdGhlIGZ1bGwgZnJlZWRvbSBvZiB1c2Ugc3BlY2lmaWVkIGluIHRoaXMgbGljZW5zZS4KKworICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIGxpY2Vuc2UsIHRoZSBHTlUgTGVzc2VyCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIGNlcnRhaW4gZGVzaWduYXRlZCBsaWJyYXJpZXMsIGFuZAoraXMgcXVpdGUgZGlmZmVyZW50IGZyb20gdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBXZSB1c2UKK3RoaXMgbGljZW5zZSBmb3IgY2VydGFpbiBsaWJyYXJpZXMgaW4gb3JkZXIgdG8gcGVybWl0IGxpbmtpbmcgdGhvc2UKK2xpYnJhcmllcyBpbnRvIG5vbi1mcmVlIHByb2dyYW1zLgorCisgIFdoZW4gYSBwcm9ncmFtIGlzIGxpbmtlZCB3aXRoIGEgbGlicmFyeSwgd2hldGhlciBzdGF0aWNhbGx5IG9yIHVzaW5nCithIHNoYXJlZCBsaWJyYXJ5LCB0aGUgY29tYmluYXRpb24gb2YgdGhlIHR3byBpcyBsZWdhbGx5IHNwZWFraW5nIGEKK2NvbWJpbmVkIHdvcmssIGEgZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeS4gIFRoZSBvcmRpbmFyeQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0aGVyZWZvcmUgcGVybWl0cyBzdWNoIGxpbmtpbmcgb25seSBpZiB0aGUKK2VudGlyZSBjb21iaW5hdGlvbiBmaXRzIGl0cyBjcml0ZXJpYSBvZiBmcmVlZG9tLiAgVGhlIExlc3NlciBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBwZXJtaXRzIG1vcmUgbGF4IGNyaXRlcmlhIGZvciBsaW5raW5nIG90aGVyIGNvZGUgd2l0aAordGhlIGxpYnJhcnkuCisKKyAgV2UgY2FsbCB0aGlzIGxpY2Vuc2UgdGhlICJMZXNzZXIiIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYmVjYXVzZSBpdAorZG9lcyBMZXNzIHRvIHByb3RlY3QgdGhlIHVzZXIncyBmcmVlZG9tIHRoYW4gdGhlIG9yZGluYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlLiAgSXQgYWxzbyBwcm92aWRlcyBvdGhlciBmcmVlIHNvZnR3YXJlIGRldmVsb3BlcnMgTGVzcworb2YgYW4gYWR2YW50YWdlIG92ZXIgY29tcGV0aW5nIG5vbi1mcmVlIHByb2dyYW1zLiAgVGhlc2UgZGlzYWR2YW50YWdlcworYXJlIHRoZSByZWFzb24gd2UgdXNlIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtYW55CitsaWJyYXJpZXMuICBIb3dldmVyLCB0aGUgTGVzc2VyIGxpY2Vuc2UgcHJvdmlkZXMgYWR2YW50YWdlcyBpbiBjZXJ0YWluCitzcGVjaWFsIGNpcmN1bXN0YW5jZXMuCisKKyAgRm9yIGV4YW1wbGUsIG9uIHJhcmUgb2NjYXNpb25zLCB0aGVyZSBtYXkgYmUgYSBzcGVjaWFsIG5lZWQgdG8KK2VuY291cmFnZSB0aGUgd2lkZXN0IHBvc3NpYmxlIHVzZSBvZiBhIGNlcnRhaW4gbGlicmFyeSwgc28gdGhhdCBpdAorYmVjb21lcworYSBkZS1mYWN0byBzdGFuZGFyZC4gIFRvIGFjaGlldmUgdGhpcywgbm9uLWZyZWUgcHJvZ3JhbXMgbXVzdCBiZQorYWxsb3dlZCB0byB1c2UgdGhlIGxpYnJhcnkuICBBIG1vcmUgZnJlcXVlbnQgY2FzZSBpcyB0aGF0IGEgZnJlZQorbGlicmFyeSBkb2VzIHRoZSBzYW1lIGpvYiBhcyB3aWRlbHkgdXNlZCBub24tZnJlZSBsaWJyYXJpZXMuICBJbiB0aGlzCitjYXNlLCB0aGVyZSBpcyBsaXR0bGUgdG8gZ2FpbiBieSBsaW1pdGluZyB0aGUgZnJlZSBsaWJyYXJ5IHRvIGZyZWUKK3NvZnR3YXJlIG9ubHksIHNvIHdlIHVzZSB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKyAgSW4gb3RoZXIgY2FzZXMsIHBlcm1pc3Npb24gdG8gdXNlIGEgcGFydGljdWxhciBsaWJyYXJ5IGluIG5vbi1mcmVlCitwcm9ncmFtcyBlbmFibGVzIGEgZ3JlYXRlciBudW1iZXIgb2YgcGVvcGxlIHRvIHVzZSBhIGxhcmdlIGJvZHkgb2YKK2ZyZWUgc29mdHdhcmUuICBGb3IgZXhhbXBsZSwgcGVybWlzc2lvbiB0byB1c2UgdGhlIEdOVSBDIExpYnJhcnkgaW4KK25vbi1mcmVlIHByb2dyYW1zIGVuYWJsZXMgbWFueSBtb3JlIHBlb3BsZSB0byB1c2UgdGhlIHdob2xlIEdOVQorb3BlcmF0aW5nIHN5c3RlbSwgYXMgd2VsbCBhcyBpdHMgdmFyaWFudCwgdGhlIEdOVS9MaW51eCBvcGVyYXRpbmcKK3N5c3RlbS4KKworICBBbHRob3VnaCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgTGVzcyBwcm90ZWN0aXZlIG9mIHRoZQordXNlcnMnIGZyZWVkb20sIGl0IGRvZXMgZW5zdXJlIHRoYXQgdGhlIHVzZXIgb2YgYSBwcm9ncmFtIHRoYXQgaXMKK2xpbmtlZCB3aXRoIHRoZSBMaWJyYXJ5IGhhcyB0aGUgZnJlZWRvbSBhbmQgdGhlIHdoZXJld2l0aGFsIHRvIHJ1bgordGhhdCBwcm9ncmFtIHVzaW5nIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeS4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCisid29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQorZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGVyZWFzIHRoZSBsYXR0ZXIgbXVzdAorYmUgY29tYmluZWQgd2l0aCB0aGUgbGlicmFyeSBpbiBvcmRlciB0byBydW4uCiteTAorICAgICAgICAgICAgICAgICAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgb3Igb3RoZXIKK3Byb2dyYW0gd2hpY2ggY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yCitvdGhlciBhdXRob3JpemVkIHBhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCit0aGlzIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuCitFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCitwcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKKyh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCisKKyAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKK3doaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCitjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQorcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAorc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcworaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKKworICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucworYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKK2ludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbAorY29tcGlsYXRpb24KK2FuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20KK3N1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5IChpbmRlcGVuZGVudCBvZiB0aGUgdXNlIG9mIHRoZSBMaWJyYXJ5IGluIGEgdG9vbCBmb3IKK3dyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMKK2FuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncworY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKK3lvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCithcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAorYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKK3dhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCitMaWJyYXJ5LgorCisgIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCithbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCitmZWUuCisMCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KKyAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQorICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKKyAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5CisgICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCisgICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCisgICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKKyAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCisKKyAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcworICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKKyAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQorICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0CisgICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKKyAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCitpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQord2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwordGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwordGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAoraW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQorb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQordGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgordGhlc2Ugbm90aWNlcy4KK15MCisgIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKK3RoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCitzdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgorCisgIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgordGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgorCisgIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCitkZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQordW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55CitpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCittdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KKworICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKK3NvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bworZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQorTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgorbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKK3dvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKK3RoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQorY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Citjb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQorbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCitTZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KKworICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQordGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCitkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KK1doZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCitsaW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQordGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KKworICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQorc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCitmdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0CitmaWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCit3b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQorTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKKworICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQorZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCitBbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKK3doZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KK15MCisgIDYuIEFzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21iaW5lIG9yCitsaW5rIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYQord29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKK3VuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHRoZSB0ZXJtcyBwZXJtaXQKK21vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBmb3IgdGhlIGN1c3RvbWVyJ3Mgb3duIHVzZSBhbmQgcmV2ZXJzZQorZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuCisKKyAgWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlCitMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlIGNvdmVyZWQgYnkKK3RoaXMgTGljZW5zZS4gIFlvdSBtdXN0IHN1cHBseSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYgdGhlIHdvcmsKK2R1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCitjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZyB0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlCitkaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgQWxzbywgeW91IG11c3QgZG8gb25lCitvZiB0aGVzZSB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZworICAgIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlcgorICAgIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCisgICAgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQKKyAgICB3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlICJ3b3JrIHRoYXQKKyAgICB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZQorICAgIHVzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkCisgICAgZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QKKyAgICB0aGF0IHRoZSB1c2VyIHdobyBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBkZWZpbml0aW9ucyBmaWxlcyBpbiB0aGUKKyAgICBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbgorICAgIHRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKQorCisgICAgYikgVXNlIGEgc3VpdGFibGUgc2hhcmVkIGxpYnJhcnkgbWVjaGFuaXNtIGZvciBsaW5raW5nIHdpdGggdGhlCisgICAgTGlicmFyeS4gIEEgc3VpdGFibGUgbWVjaGFuaXNtIGlzIG9uZSB0aGF0ICgxKSB1c2VzIGF0IHJ1biB0aW1lIGEKKyAgICBjb3B5IG9mIHRoZSBsaWJyYXJ5IGFscmVhZHkgcHJlc2VudCBvbiB0aGUgdXNlcidzIGNvbXB1dGVyIHN5c3RlbSwKKyAgICByYXRoZXIgdGhhbiBjb3B5aW5nIGxpYnJhcnkgZnVuY3Rpb25zIGludG8gdGhlIGV4ZWN1dGFibGUsIGFuZCAoMikKKyAgICB3aWxsIG9wZXJhdGUgcHJvcGVybHkgd2l0aCBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGlmCisgICAgdGhlIHVzZXIgaW5zdGFsbHMgb25lLCBhcyBsb25nIGFzIHRoZSBtb2RpZmllZCB2ZXJzaW9uIGlzCisgICAgaW50ZXJmYWNlLWNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiB0aGF0IHRoZSB3b3JrIHdhcyBtYWRlIHdpdGguCisKKyAgICBjKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAorICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscworICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKKyAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCisKKyAgICBkKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQorICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KKworICAgIGUpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQorICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgorCisgIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQorTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKK3JlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAordGhlIG1hdGVyaWFscyB0byBiZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMKK25vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgorY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbgord2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcwordGhlIGV4ZWN1dGFibGUuCisKKyAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UKK3Jlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkKK2FjY29tcGFueSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFN1Y2ggYSBjb250cmFkaWN0aW9uIG1lYW5zIHlvdSBjYW5ub3QKK3VzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UKK2Rpc3RyaWJ1dGUuCiteTAorICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQorZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAorbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCit0aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKK3Blcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yaworICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKKyAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAgICBTZWN0aW9ucyBhYm92ZS4KKworICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0CisgICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKKyAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCisKKyAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKK3RoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55CithdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgorcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAorb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwordGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5CitzdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoCit0aGlzIExpY2Vuc2UuCiteTAorICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5IGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkuCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHksIGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UKK2NvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Cit2ZXJzaW9ucyBvZiB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuCitTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCitidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZAorImFueSBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBMaWJyYXJ5IGRvZXMgbm90IHNwZWNpZnkgYQorbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiteTAorICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCit3cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcworY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKK2RlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKK29mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCithbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk8gV0FSUkFOVFkKKworICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KK1dBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCitFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgorT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKK0tJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKK0xJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCitUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KK1dSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCitBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQorRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKK0xJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKK1JFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCitGQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCitTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICitEQU1BR0VTLgorCisgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKK15MCisgICAgICAgICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKK2V2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZworcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMKK29mIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KKworICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4KK0l0IGlzIHNhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0CitlZmZlY3RpdmVseSBjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQKK2hhdmUgYXQgbGVhc3QgdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbAorbm90aWNlIGlzIGZvdW5kLgorCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgbGlicmFyeSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0Citkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyAgVVNBCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlcgorbWFpbC4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yCit5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCisgIGxpYnJhcnkgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzCitSYW5kb20gSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQorCisKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDhmZGFhCi0tLSAvZGV2L251bGwKKysrIGIvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMjU0IEBACisyMDA0LTA4LTEzICBNYXJ0aW4gU2rDtmdyZW4gIDxtc2pvZ3JlbkBnbWFpbC5jb20+CisKKwkqIFJlbGVhc2VkIHZlcnNpb24gMC42LgorCisyMDA0LTA4LTExICBNYXJ0aW4gU2rDtmdyZW4gIDxtc2pvZ3JlbkBnbWFpbC5jb20+CisKKwkqIGRvYy9weU9wZW5TU0wudGV4OiBVcGRhdGVzIHRvIHRoZSBkb2NzLgorCisyMDA0LTA4LTEwICBNYXJ0aW4gU2rDtmdyZW4gIDxtc2pvZ3JlbkBnbWFpbC5jb20+CisKKwkqIHNyYy9jcnlwdG8veDUwOS5jOiBBZGQgWDUwOS5hZGRfZXh0ZW5zaW9ucyBiYXNlZCBvbiBhIHBhdGNoCisJICBmcm9tIEhhbiBTLiBMZWUuCisJKiBzcmMvc3NsL3NzbC5jOiBBZGQgbW9yZSBTU0xfT1BfIGNvbnN0YW50cy4gUGF0Y2ggZnJvbSBNaWhhaQorCSAgSWJhbmVzY3UuCisKKzIwMDQtMDgtMDkgIE1hcnRpbiBTasO2Z3JlbiAgPG1zam9ncmVuQGdtYWlsLmNvbT4KKworCSogc2V0dXAucHkgc3JjL2NyeXB0by86IEFkZCBzdXBwb3J0IGZvciBOZXRzY2FwZSBTUEtJIGV4dGVuc2lvbnMKKwkgIGJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBUb2xsZWYgRm9nIEhlZW4uCisJKiBzcmMvY3J5cHRvL2NyeXB0by5jOiBBZGQgc3VwcG9ydCBmb3IgcHl0aG9uIHBhc3NwaHJhc2UgY2FsbGJhY2tzCisJICBiYXNlZCBvbiBhIHBhdGNoIGZyb20gUm9iZXJ0IE9sc29uLgorCisyMDA0LTA4LTAzICBNYXJ0aW4gU2rDtmdyZW4gIDxtc2pvZ3JlbkBnbWFpbC5jb20+CisKKwkqIHNyYy9zc2wvY29udGV4dC5jOiBBcHBsaWVkIHBhdGNoIGZyb20gRnJlZGVyaWMgUGV0ZXJzIHRvIGFkZAorCSAgQ29udGV4dC51c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZS4KKwkqIHNyYy9jcnlwdG8veDUwOS5jOiBBcHBsaWQgcGF0Y2ggZnJvbSBUb2xsZWYgRm9nIEhlZW4gdG8gYWRkCisJICBYNTA5LnN1YmplY3RfbmFtZV9oYXNoIGFuZCBYNTA5LmRpZ2VzdC4KKworMjAwNC0wOC0wMiAgTWFydGluIFNqw7ZncmVuICA8bXNqb2dyZW5AZ21haWwuY29tPgorCisJKiBzcmMvY3J5cHRvL2NyeXB0by5jIHNyYy9zc2wvc3NsLmM6IEFwcGxpZWQgcGF0Y2ggZnJvbSBCYXN0aWFuCisJICBLbGVpbmVpZGFtIHRvIGZpeCBmdWxsIG5hbWVzIG9mIGV4Y2VwdGlvbnMuCisKKzIwMDQtMDctMTkgIE1hcnRpbiBTasO2Z3JlbiAgPG1zam9ncmVuQGdtYWlsLmNvbT4KKworCSogZG9jL3B5T3BlblNTTC50ZXg6IEZpeCB0aGUgZXJyb3JzIHJlZ2FyZGluZyBYNTA5TmFtZSdzIGZpZWxkIG5hbWVzLgorCQorMjAwNC0wNy0xOCAgTWFydGluIFNqw7ZncmVuICA8bXNqb2dyZW5AZ21haWwuY29tPgorCisJKiBleGFtcGxlcy9jZXJ0Z2VuLnB5OiBGaXhlZCB3cm9uZyBhdHRyaWJ1dGVzIGluIGRvYyBzdHJpbmcsIHRoYW5rcworCSAgUmVteS4gKFNGYnVnIzkxMzMxNSkKKwkqIF9faW5pdF9fLnB5LCBzZXR1cC5weSwgdmVyc2lvbi5weTogQWRkIF9fdmVyc2lvbl9fLCBhcyBzdWdnZXN0ZWQgYnkKKwkgIFJvbmFsZCBPdXNzb3JlbiBpbiBTRmJ1ZyM4ODg3MjkuCisJKiBleGFtcGxlcy9wcm94eS5weTogRml4IHR5cG9zLCB0aGFua3MgTWloYWkgSWJhbmVzY3UuIChTRnBhdGNoIzg5NTgyMCkKKworMjAwMy0wMS0wOSAgTWFydGluIFNqw7ZncmVuICA8bWFydGluQHN0cmFrdC5jb20+CisKKwkqIFVzZSBjeWNsaWMgR0MgcHJvdG9jb2wgaW4gU1NMLkNvbm5lY3Rpb24sIFNTTC5Db250ZXh0LCBjcnlwdG8uUEtDUzEyCisJICBhbmQgY3J5cHRvLlg1MDlOYW1lLgorCisyMDAyLTEyLTAyICBNYXJ0aW4gU2rDtmdyZW4gIDxtYXJ0aW5Ac3RyYWt0LmNvbT4KKworCSogdHNhZmUucHk6IEFkZCBzb21lIG1pc3NpbmcgbWV0aG9kcy4KKworMjAwMi0xMC0wNiAgTWFydGluIFNqw7ZncmVuICA8bWFydGluQHN0cmFrdC5jb20+CisKKwkqIF9faW5pdF9fLnB5OiBJbXBvcnQgdHNhZmUgdG9vIQorCisyMDAyLTEwLTA1ICBNYXJ0aW4gU2rDtmdyZW4gIDxtYXJ0aW5Ac3RyYWt0LmNvbT4KKworCSogc3JjL2NyeXB0by94NTA5bmFtZS5jOiBVc2UgdW5pY29kZSBzdHJpbmdzIGluc3RlYWQgb2Ygb3JkaW5hcnkKKwkgIHN0cmluZ3MgaW4gZ2V0YXR0ci9zZXRhdHRyLiBOb3RlIHRoYXQgcGxhaW4gYXNjaWkgc3RyaW5ncyBzaG91bGQKKwkgIHN0aWxsIHdvcmsuCisKKzIwMDItMDktMTcgIE1hcnRpbiBTasO2Z3JlbiAgPG1hcnRpbkBzdHJha3QuY29tPgorCisJKiBSZWxlYXNlZCB2ZXJzaW9uIDAuNS4xLgorCisyMDAyLTA5LTA5ICBNYXJ0aW4gU2rDtmdyZW4gIDxtYXJ0aW5Ac3RyYWt0LmNvbT4KKworCSogc2V0dXAuY2ZnOiBGaXhlZCBidWlsZCByZXF1aXJlbWVudHMgZm9yIHJwbXMuCisKKzIwMDItMDktMDcgIE1hcnRpbiBTasO2Z3JlbiAgPG1hcnRpbkBzdHJha3QuY29tPgorCisJKiBzcmMvc3NsL2Nvbm5lY3Rpb24uYzogRml4IHNlbmRhbGwoKSBtZXRob2QuIEl0IHNlZ2ZhdWx0ZWQgYmVjYXVzZQorCSAgaXQgd2FzIHRvbyBnZW5lcm91cyBhYm91dCBnaXZpbmcgYXdheSB0aGUgR0lMLgorCSogQWRkZWQgU2VjdXJlWE1MUlBDU2VydmVyIGV4YW1wbGUsIGNvbnRyaWJ1dGVkIGJ5IE1pY2hhbCBXYWxsYWNlLgorCisyMDAyLTA5LTA2ICBNYXJ0aW4gU2rDtmdyZW4gIDxtYXJ0aW5Ac3RyYWt0LmNvbT4KKworCSogc2V0dXAuY2ZnOiBVcGRhdGVkIHRoZSBidWlsZCByZXF1aXJlbWVudHMuCisJKiBzcmMvc3NsL2Nvbm5lY3Rpb24uYzogRml4IGluY2x1ZGVzIGZvciBBSVguCisKKzIwMDItMDktMDQgIEFuZGVycyBIYW1tYXJxdWlzdCAgPGlrb0BzdHJha3QuY29tPgorCisJKiBBZGRlZCB0eXBlIGNoZWNrcyBpbiBhbGwgdGhlIG90aGVyIHBsYWNlcyB3aGVyZSB3ZSBleHBlY3QKKwkgIHNwZWNpZmljIHR5cGVzIG9mIG9iamVjdHMgcGFzc2VkLgorCisyMDAyLTA5LTA0ICBNYXJ0aW4gU2rDtmdyZW4gIDxtYXJ0aW5Ac3RyYWt0LmNvbT4KKworCSogc3JjL2NyeXB0by9jcnlwdG8uYzogQWRkZWQgYW4gZXhwbGljaXQgdHlwZSBjaGVjayBpbiB0aGUgZHVtcF8qCisJICBmdW5jdGlvbnMsIHNvIHRoYXQgdGhleSB3b24ndCBkaWUgd2hlbiBlLmcuIE5vbmUgaXMgcGFzc2VkIGluLgorCisyMDAyLTA4LTI1ICBNYXJ0aW4gU2rDtmdyZW4gIDxtYXJ0aW5Ac3RyYWt0LmNvbT4KKworCSogZG9jL3B5T3BlblNTTC50ZXg6IERvY3MgZm9yIFBLQ1MxMi4KKworMjAwMi0wOC0yNCAgTWFydGluIFNqw7ZncmVuICA8bWFydGluQHN0cmFrdC5jb20+CisKKwkqIHNyYy9jcnlwdG86IEFkZGVkIGJhc2ljIFBLQ1MxMiBzdXBwb3J0LCB0aGFua3MgdG8gTWFyayBXZWxjaAorCSAgPG1hcmtAY29sbGFiLm5ldD4KKworMjAwMi0wOC0xNiAgTWFydGluIFNqw7ZncmVuICA8bWFydGluQHN0cmFrdC5jb20+CisKKwkqIEQnb2ghIEZpeGVzIGZvciBweXRob24gMS41IGFuZCBweXRob24gMi4xLgorCisyMDAyLTA4LTE1ICBNYXJ0aW4gU2rDtmdyZW4gIDxtYXJ0aW5Ac3RyYWt0LmNvbT4KKworCSogVmVyc2lvbiAwLjUuIFlheSEKKworMjAwMi0wNy0yNSAgTWFydGluIFNqw7ZncmVuICA8bWFydGluQHN0cmFrdC5jb20+CisKKwkqIHNyYy9zc2wvY29udGV4dC5jOiBBZGRlZCBzZXRfb3B0aW9ucyBtZXRob2QuCisJKiBzcmMvc3NsL3NzbC5jOiBBZGRlZCBjb25zdGFudHMgZm9yIENvbnRleHQuc2V0X29wdGlvbnMgbWV0aG9kLgorCisyMDAyLTA3LTIzICBNYXJ0aW4gU2rDtmdyZW4gIDxtYXJ0aW5Ac3RyYWt0LmNvbT4KKworCSogVXBkYXRlZCBkb2NzCisJKiBzcmMvc3NsL2Nvbm5lY3Rpb24uYzogQ2hhbmdlZCB0aGUgZ2V0X2NpcGhlcl9saXN0IG1ldGhvZCB0byBhY3R1YWxseQorCSAgcmV0dXJuIGEgbGlzdCEgV0FSTklORzogVGhpcyBjaGFuZ2UgbWFrZXMgdGhlIEFQSSBpbmNvbXBhdGlibGUgd2l0aAorCSAgZWFybGllciB2ZXJzaW9ucyEKKworMjAwMi0wNy0xNSAgTWFydGluIFNqw7ZncmVuICA8bWFydGluQHN0cmFrdC5jb20+CisKKwkqIHNyYy9zc2wvY29ubmVjdGlvbi5bY2hdOiBSZW1vdmVkIHRoZSBmaWxlbm8gbWV0aG9kLCBpdCB1c2VzIHRoZQorCSAgdHJhbnNwb3J0IG9iamVjdCdzIGZpbGVubyBpbnN0ZWFkLgorCisyMDAyLTA3LTA5ICBNYXJ0aW4gU2rDtmdyZW4gIDxtYXJ0aW5Ac3RyYWt0LmNvbT4KKworCSogc3JjL2NyeXB0by94NTA5LmMgc3JjL2NyeXB0by94NTA5bmFtZS5jOiBGaXhlZCBzZWdmYXVsdCBidWcgd2hlcmUKKwkgIHlvdSB1c2VkIGFuIFg1MDlOYW1lIGFmdGVyIGl0cyBYNTA5IGhhZCBiZWVuIGRlc3Ryb3llZC4KKwkqIHNyYy9jcnlwdG8vY3J5cHRvLltjaF0gc3JjL2NyeXB0by94NTA5cmVxLmMgc3JjL2NyeXB0by94NTA5ZXh0LltjaF06CisJICBBZGRlZCBYNTA5IEV4dGVuc2lvbiBzdXBwb3J0LiBUaGFua3MgdG8gbWFhcy1NYWFydGVuIFplZW1hbgorCSAgPG1hYXNAYXdhbmltLmNvbT4KKwkqIHNyYy9jcnlwdG8vcGtleS5jOiBBZGRlZCBiaXRzKCkgYW5kIHR5cGUoKSBtZXRob2RzLgorCisyMDAyLTA3LTA4ICBNYXJ0aW4gU2rDtmdyZW4gIDxtYXJ0aW5Ac3RyYWt0LmNvbT4KKworCSogc3JjL3NzbC9jb25uZWN0aW9uLmM6IE1vdmVkIHRoZSBjb250ZW50cyBvZiBzZXR1cF9zc2wgaW50byB0aGUKKwkgIGNvbnN0cnVjdG9yLCB0aGVyZWJ5IGZpeGluZyBzb21lIHNlZ2ZhdWx0IGJ1Z3MgOikKKwkqIHNyYy9zc2wvY29ubmVjdGlvbi5jOiBBZGRlZCBjb25uZWN0X2V4IGFuZCBzZW5kYWxsIG1ldGhvZHMuCisJKiBzcmMvY3J5cHRvL3g1MDluYW1lLmM6IENsZWFuZWQgdXAgY29tcGFyaXNvbnMgYW5kIE5JRCBsb29rdXAuCisJICBUaGFuayB5b3UgTWFhcy1NYWFydGVuIFplZW1hbiA8bWFhc0Bhd2FuaW0uY29tPgorCSogc3JjL3JhbmQvcmFuZC5jOiBGaXggUkFORF9zY3JlZW4gaW1wb3J0LgorCSogc3JjL2NyeXB0by9jcnlwdG8uYyBzcmMvY3J5cHRvL3BrY3M3LltjaF06IEFkZGVkIFBLQ1M3IG1hbmFnZW1lbnQsCisJICBjb3VydGVzeSBvZiBNYWFzLU1hYXJ0ZW4gWmVlbWFuIDxtYWFzQGF3YW5pbS5jb20+CisJKiBzcmMvY3J5cHRvL3g1MDlyZXEuYzogQWRkZWQgdmVyaWZ5IG1ldGhvZC4KKworMjAwMi0wNi0xNyAgTWFydGluIFNqw7ZncmVuICA8bWFydGluQHN0cmFrdC5jb20+CisKKwkqIHJwbS8sIHNldHVwLmNmZzogQWRkZWQgaW1wcm92ZWQgUlBNLWJ1aWxkaW5nIHN0dWZmLCB0aGFua3MgdG8KKwkgIE1paGFpIEliYW5lc2N1IDxtaXNhQHJlZGhhdC5jb20+CisKKzIwMDItMDYtMTQgIE1hcnRpbiBTasO2Z3JlbiAgPG1hcnRpbkBzdHJha3QuY29tPgorCisJKiBleGFtcGxlcy9wcm94eS5weTogRXhhbXBsZSBjb2RlIGZvciB1c2luZyBPcGVuU1NMIHRocm91Z2ggYSBwcm94eQorCSAgY29udHJpYnV0ZWQgYnkgTWloYWkgSWJhbmVzY3UgPG1pc2FAcmVkaGF0LmNvbT4KKwkqIFVwZGF0ZWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9uIGFuZCBhZGRlZCB0aGVtIHRvIHRoZSBUZVggbWFudWFsLgorCisyMDAyLTA2LTEzICBNYXJ0aW4gU2rDtmdyZW4gIDxtYXJ0aW5Ac3RyYWt0LmNvbT4KKworCSogc3JjL3NzbC9jb250ZXh0LmM6IENoYW5nZWQgZ2xvYmFsX3ZlcmlmeV9jYWxsYmFjayBzbyB0aGF0IGl0IHVzZXMKKwkgIFB5T2JqZWN0X0lzVHJ1ZSBpbnN0ZWFkIG9mIHJlcXVyaW5nIGludHMuCisJKiBBZGRlZCBweW1lbWNvbXBhdC5oIHRvIG1ha2UgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHVuaWZvcm0gYW5kCisJICBiYWNrd2FyZHMtY29tcGF0aWJsZS4KKwkqIHNyYy91dGlsLmg6IEFkZGVkIGNvbmRpdGlvbmFsIGRlZmluaXRpb24gb2YgUHlNb2R1bGVfQWRkT2JqZWN0IGFuZAorCSAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQKKwkqIHNyYy9zc2wvY29ubmVjdGlvbi5jOiBTb2NrZXQgbWV0aG9kcyBhcmUgbm8gbG9uZ2VyIGV4cGxpY2l0bHkKKwkgIHdyYXBwZWQuIGZpbGVubygpIGlzIHRoZSBvbmx5IG1ldGhvZCB0aGUgdHJhbnNwb3J0IGxheWVyIG9iamVjdCBIQVMKKwkgIHRvIHN1cHBvcnQsIGJ1dCBpZiB5b3Ugd2FudCB0byB1c2UgY29ubmVjdCwgYWNjZXB0IG9yIHNvY2tfc2h1dGRvd24sCisJICB0aGVuIHRoZSB0cmFuc3BvcnQgbGF5ZXIgb2JqZWN0IGhhcyB0byBzdXBwbHkgY29ubmVjdCwgYWNjZXB0CisJICBhbmQgc2h1dGRvd24gcmVzcGVjdGl2ZWx5LgorCisyMDAyLTA2LTEyICBNYXJ0aW4gU2rDtmdyZW4gIDxtYXJ0aW5Ac3RyYWt0LmNvbT4KKworCSogQ2hhbmdlZCBjb21tZW50cyB0byBkb2NzdHJpbmdzIHRoYXQgYXJlIHZpc2libGUgaW4gUHl0aG9uLgorCSogc3JjL3NzbC9jb25uZWN0aW9uLmM6IEFkZGVkIHNldF9jb25uZWN0X3N0YXRlIGFuZCBzZXRfYWNjZXB0X3N0YXRlCisJICBtZXRob2RzLiBUaGFua3MgdG8gTWFyayBXZWxjaCA8bWFya0Bjb2xsYWIubmV0PiBmb3IgdGhpcy4KKworMjAwMi0wNi0xMSAgTWFydGluIFNqw7ZncmVuICA8bWFydGluQHN0cmFrdC5jb20+CisKKwkqIHNyYy9zc2wvY29ubmVjdGlvbi5jOiBhY2NlcHQgYW5kIGNvbm5lY3Qgbm93IHVzZSBTU0xfc2V0X2FjY2VwdF9zdGF0ZQorCSAgYW5kIFNTTF9zZXRfY29ubmVjdF9zdGF0ZSByZXNwZWN0aXZlbHksIGluc3RlYWQgb2YgU1NMX2FjY2VwdCBhbmQKKwkgIFNTTF9jb25uZWN0LgorCSogc3JjL3NzbC9jb25uZWN0aW9uLmM6IEFkZGVkIHdhbnRfcmVhZCBhbmQgd2FudF93cml0ZSBtZXRob2RzLgorCisyMDAyLTA2LTA1ICBNYXJ0aW4gU2rDtmdyZW4gIDxtYXJ0aW5Ac3RyYWt0LmNvbT4KKworCSogc3JjL3NzbC9jb25uZWN0aW9uLmM6IEFkZGVkIGVycm9yIG1lc3NhZ2VzIGZvciB3aW5kb3dzLiBUaGUgY29kZSBpcworCSAgY29waWVkIGZyb20gUHl0aG9uJ3Mgc29ja2V0bW9kdWxlLmMuIEljay4KKwkqIHNyYy9zc2wvY29ubmVjdGlvbi5jOiBDaGFuZ2VkIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBTeXNDYWxsRXJyb3IuIEl0CisJICBhbHdheXMgaGFzIGEgdHVwbGUgKG51bWJlciwgc3RyaW5nKSBub3csIGV2ZW4gdGhvdWdoIHRoZSBudW1iZXIKKwkgIG1pZ2h0IG5vdCBhbHdheXMgYmUgdXNlZnVsLgorCisyMDAyLTA0LTA1ICBNYXJ0aW4gU2rDtmdyZW4gIDxtZDltc0BtZHN0dWQuY2hhbG1lcnMuc2U+CisKKwkqIFdvcmtlZCBtb3JlIG9uIHRoZSBEZWJpYW4gcGFja2FnaW5nLCBob3BlZnVsbHkgdGhlIHBhY2thZ2VzCisJICBhcmUgZ2V0dGluZyBpbnRvIHRoZSBtYWluIERlYmlhbiBhcmNoaXZlIHNvb24uCisKKzIwMDItMDEtMTAgIE1hcnRpbiBTasO2Z3JlbiAgPG1hcnRpbkBzdHJha3QuY29tPgorCisJKiBXb3JrZWQgc29tZSBtb3JlIG9uIHRoZSBEZWJpYW4gcGFja2FnaW5nLCBpdCdzIHR1cm5pbmcgb3V0IHJlYWwKKwkgIG5pY2UuCisJKiBDaGFuZ2VkIGZvcm1hdCBvbiB0aGlzIGZpbGUsIEknbSBnb2luZyB0byB0cnkgdG8gYmUgYSBiaXQgbW9yZQorCSAgdmVyYm9zZSBhYm91dCBteSBjaGFuZ2VzLCBhbmQgdGhpcyBmb3JtYXQgbWFrZXMgaXQgZWFzaWVyLgorCisyMDAyLTAxLTA4ICBNYXJ0aW4gU2rDtmdyZW4gIDxtYXJ0aW5Ac3RyYWt0LmNvbT4KKworCSogVmVyc2lvbiAwLjQuMQorCSogQWRkZWQgc29tZSBleGFtcGxlIGNvZGUKKwkqIEFkZGVkIHRoZSB0aHJlYWQgc2FmZSBDb25uZWN0aW9uIG9iamVjdCBpbiB0aGUgJ3RzYWZlJyBzdWJtb2R1bGUKKwkqIE5ldyBEZWJpYW4gcGFja2FnaW5nCisKKzIwMDEtMDgtMDkgIE1hcnRpbiBTasO2Z3JlbiAgPG1hcnRpbkBzdHJha3QuY29tPgorCisJKiBWZXJzaW9uIDAuNAorCSogQWRkZWQgYSBjb21wYXJlIGZ1bmN0aW9uIGZvciBYNTA5TmFtZSBzdHJ1Y3R1cmVzLgorCSogTW92ZWQgdGhlIHN1Ym1vZHVsZXMgdG8gc2VwYXJhdGUgLnNvIGZpbGVzLCB3aXRoIHRpbnkgQyBBUElzIHNvIHRoZXkKKwkgIGNhbiBjb21tdW5pY2F0ZQorCSogU2tlbGV0YWwgT3BlblNTTC9fX2luaXRfXy5weQorCSogUmVtb3ZlZCB0aGUgZXJyIHN1Ym1vZHVsZSwgdXNlIGNyeXB0by5FcnJvciBhbmQgU1NMLkVycm9yIGluc3RlYWQKKworMjAwMS0wOC0wNiAgTWFydGluIFNqw7ZncmVuICA8bWFydGluQHN0cmFrdC5jb20+CisKKwkqIFZlcnNpb24gMC4zCisJKiBBZGRlZCBtb3JlIHR5cGVzIGZvciBkZWFsaW5nIHdpdGggY2VydGlmaWNhdGVzIChYNTA5U3RvcmUsIFg1MDlSZXEsCisJICBQS2V5KQorCSogRnVuY3Rpb25hbGl0eSB0byBsb2FkIHByaXZhdGUga2V5cywgY2VydGlmaWNhdGVzIGFuZCBjZXJ0aWZpY2F0ZQorCSAgcmVxdWVzdHMgZnJvbSBtZW1vcnkgYnVmZmVycywgYW5kIHN0b3JlIHRoZW0gdG9vCisJKiBYNTA5IGFuZCBYNTA5TmFtZSBvYmplY3RzIGNhbiBub3cgYmUgbW9kaWZpZWQgYXMgd2VsbCwgdmVyeSBuZWF0IHdoZW4KKwkgIGNyZWF0aW5nIGNlcnRpZmljYXRlcyA7KQorCSogQWRkZWQgU1NMX01PREVfQVVUT19SRVRSWSB0byBzbW9vdGggdGhpbmdzIGZvciBibG9ja2luZyBzb2NrZXRzCisJKiBBZGRlZCBhIHNvY2tfc2h1dGRvd24oKSBtZXRob2QgdG8gdGhlIENvbm5lY3Rpb24gdHlwZQorCSogSSBkb24ndCB1bmRlcnN0YW5kIHdoeSwgYnV0IEkgY2FuJ3QgdXNlIFB5X0luaXRNb2R1bGUoKSB0byBjcmVhdGUKKwkgIHN1Ym1vZHVsZXMgaW4gUHl0aG9uIDIuMCwgdGhlIGludGVycHJldGVyIHNlZ2ZhdWx0cyBvbiB0aGUgY2xlYW51cAorCSAgcHJvY2VzcyB3aGVuIEkgZG8uIEkgYWRkZWQgYSBjb25kaXRpb25hbCBjb21waWxlIG9uIHRoZSB2ZXJzaW9uCisJICBudW1iZXIsIGZhbGxpbmcgYmFjayB0byBteSBvd24gcm91dGluZS4gSXQgd291bGQgb2YgY291cnNlIGJlIG5pY2UgdG8KKwkgIGludmVzdGlnYXRlIHdoYXQgaXMgaGFwcGVuaW5nLCBidXQgSSBkb24ndCBoYXZlIHRoZSB0aW1lIHRvIGRvIHNvCisJKiBEbyBJTkNSRUYgb24gdGhlIHR5cGUgb2JqZWN0cyBiZWZvcmUgaW5zZXJ0aW5nIHRoZW0gaW4gdGhlCisJICBkaWN0aW9uYXJ5LCBzbyB0aGV5IHdpbGwgbmV2ZXIgcmVhY2ggcmVmY291bnQgMCAodGhleSBhcmUsIGFmdGVyIGFsbCwKKwkgIHN0YXRpY2FsbHkgYWxsb2NhdGVkKQorCisyMDAxLTA3LTMwICBNYXJ0aW4gU2rDtmdyZW4gIDxtYXJ0aW5Ac3RyYWt0LmNvbT4KKworCSogVmVyc2lvbiAwLjIKKwkqIExvdHMgb2YgdHdlYWtpbmcgYW5kIGNvbW1lbnRzIGluIHRoZSBjb2RlCisJKiBOb3cgdXNlcyBkaXN0dXRpbHMgaW5zdGVhZCBvZiB0aGUgc3R1cGlkIFNldHVwIGZpbGUKKwkqIEhhY2tlZCBkb2MvdG9vbHMvbWtob3d0bywgaHRtbCBnZW5lcmF0aW9uIHNob3VsZCBub3cgd29yaworCisyMDAxLTA3LTE2ICBNYXJ0aW4gU2rDtmdyZW4gIDxtYXJ0aW5Ac3RyYWt0LmNvbT4KKworCSogSW5pdGlhbCByZWxlYXNlICgwLjEsIGRvbid0IGV4cGVjdCBtdWNoIGZyb20gdGhpcyBvbmUgOi0pCisKZGlmZiAtLWdpdCBhL0lOU1RBTEwgYi9JTlNUQUxMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5M2I5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9JTlNUQUxMCkBAIC0wLDAgKzEsODQgQEAKKworSU5TVEFMTEFUSU9OIElOU1RSVUNUSU9OUyBGT1IgcHlPcGVuU1NMCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSSBoYXZlIHRlc3RlZCB0aGlzIG9uIERlYmlhbiBMaW51eCBzeXN0ZW1zICh3b29keSBhbmQgc2lkKSwgU29sYXJpcyAyLjYgYW5kCisyLjcuIE90aGVycyBoYXZlIHN1Y2Nlc3NmdWxseSBjb21waWxlZCBpdCBvbiBXaW5kb3dzIGFuZCBOVC4KKworCistLSBCdWlsZGluZyB0aGUgTW9kdWxlIG9uIGEgVW5peCBTeXN0ZW0gLS0KKworcHlPcGVuU1NMIHVzZXMgZGlzdHV0aWxzLCBzbyB0aGVyZSByZWFsbHkgc2hvdWxkbid0IGJlIGFueSBwcm9ibGVtcy4gVG8gYnVpbGQKK3RoZSBsaWJyYXJ5OgorCisgICAgcHl0aG9uIHNldHVwLnB5IGJ1aWxkCisKK0lmIHlvdXIgT3BlblNTTCBoZWFkZXIgZmlsZXMgYXJlbid0IGluIC91c3IvaW5jbHVkZSwgeW91IG1heSBuZWVkIHRvIHN1cHBseQordGhlIC1JIGZsYWcgdG8gbGV0IHRoZSBzZXR1cCBzY3JpcHQga25vdyB3aGVyZSB0byBsb29rLiBUaGUgc2FtZSBnb2VzIGZvciB0aGUKK2xpYnJhcmllcyBvZiBjb3Vyc2UsIHVzZSB0aGUgLUwgZmxhZy4gTm90ZSB0aGF0IGJ1aWxkIHdvbid0IGFjY2VwdCB0aGVzZQorZmxhZ3MsIHNvIHlvdSBoYXZlIHRvIHJ1biBmaXJzdCBidWlsZF9leHQgYW5kIHRoZW4gYnVpbGQhIEV4YW1wbGU6CisKKyAgICBweXRob24gc2V0dXAucHkgYnVpbGRfZXh0IC1JL3Vzci9sb2NhbC9zc2wvaW5jbHVkZSAtTC91c3IvbG9jYWwvc3NsL2xpYgorICAgIHB5dGhvbiBzZXR1cC5weSBidWlsZAorCitOb3cgeW91IHNob3VsZCBoYXZlIGEgZGlyZWN0b3J5IGNhbGxlZCBPcGVuU1NMIHRoYXQgY29udGFpbnMgZS5nLiBTU0wuc28gYW5kCitfX2luaXRfXy5weSBzb21ld2hlcmUgaW4gdGhlIGJ1aWxkIGRpY3JlY3RvcnksIHNvIGp1c3Q6CisKKyAgICBweXRob24gc2V0dXAucHkgaW5zdGFsbAorCitJZiB5b3UsIGZvciBzb21lIGFyY2FuZSByZWFzb24sIGRvbid0IHdhbnQgdGhlIG1vZHVsZSB0byBhcHBlYXIgaW4gdGhlCitzaXRlLXBhY2thZ2VzIGRpcmVjdG9yeSwgdXNlIHRoZSAtLXByZWZpeCBvcHRpb24uCisKK1lvdSBjYW4sIG9mIGNvdXJzZSwgZG8KKworICAgIHB5dGhvbiBzZXR1cC5weSAtLWhlbHAKKwordG8gZmluZCBvdXQgbW9yZSBhYm91dCBob3cgdG8gdXNlIHRoZSBzY3JpcHQuCisKKworLS0gQnVpbGRpbmcgdGhlIE1vZHVsZSBvbiBhIFdpbmRvd3MgU3lzdGVtIC0tCisKK0JpZyB0aGFua3MgdG8gSXRhbWFyIFNodHVsbC1UcmF1cmluZyBhbmQgT2xlZyBPcmxvdiBmb3IgdGhlaXIgaGVscCB3aXRoCitXaW5kb3dzIGJ1aWxkIGluc3RydWN0aW9ucy4gU2FtZSBhcyBmb3IgVW5peCBzeXN0ZW1zLCB3ZSBoYXZlIHRvIHNlcGFyYXRlCit0aGUgYnVpbGRfZXh0IGFuZCB0aGUgYnVpbGQuCisKK0J1aWxkaW5nIHRoZSBsaWJyYXJ5OgorCisgICAgc2V0dXAucHkgYnVpbGRfZXh0IC1JIC4uLlxvcGVuc3NsXGluYzMyIC1MIC4uLlxvcGVuc3NsXG91dDMyZGxsCisgICAgc2V0dXAucHkgYnVpbGQKKworV2hlcmUgLi4uXG9wZW5zc2wgaXMgb2YgY291cnNlIHRoZSBsb2NhdGlvbiBvZiB5b3VyIE9wZW5TU0wgaW5zdGFsbGF0aW9uLgorCitJbnN0YWxsYXRpb24gaXMgdGhlIHNhbWUgYXMgZm9yIFVuaXggc3lzdGVtczoKKworICAgIHNldHVwLnB5IGluc3RhbGwKKworQW5kIHNpbWlsYXJpbHksIHlvdSBjYW4gZG8KKworICAgIHNldHVwLnB5IC0taGVscAorCit0byBnZXQgbW9yZSBpbmZvcm1hdGlvbi4KKworCistLSBEb2N1bWVudGF0aW9uIC0tCisKK1RoZSBkb2N1bWVudGF0aW9uIGlzIHdyaXR0ZW4gaW4gTGFUZVgsIHVzaW5nIHRoZSBzdGFuZGFyZCBQeXRob24gdGVtcGxhdGVzLAorYW5kIHRvb2xzIHRvIGNvbXBpbGUgaXQgaW50byBhIG51bWJlciBvZiBmb3JtcyBhcmUgaW5jbHVkZWQuICBZb3UgbmVlZCB0bworc3VwcGx5IHRoaW5ncyBsaWtlIGR2aXBzLCBsYXRleDJodG1sIHlvdXJzZWxmIG9mIGNvdXJzZSEKKworVG8gYnVpbGQgdGhlIHRleHQsIGh0bWwsIHBvc3RzY3JpcHQgb3IgZHZpIGZvcm1zIG9mIHRoZSBkb2N1bWVudGF0aW9uLCB0aGlzIGlzCit3aGF0IHlvdSBkbzoKKworICAgIGNkIGRvYworICAgICMgVG8gbWFrZSB0aGUgdGV4dC1vbmx5IGRvY3VtZW50YXRpb246CisgICAgbWFrZSB0ZXh0CisgICAgIyBUbyBtYWtlIHRoZSBkdmkgZm9ybToKKyAgICBtYWtlIGR2aQorCitJdCdzIGFzIHNpbXBsZSBhcyB0aGF0LiAgTm90ZSB0aGF0IHNpbmNlIFB5dGhvbidzIG1raG93dG8gc2NyaXB0IGlzIHVzZWQsIGlmCit5b3UgZG8gZmlyc3QgYGBtYWtlIGR2aScnIGFuZCB0aGVuIGBgbWFrZSBwcycnLCB0aGUgZHZpIGZpbGUgd2lsbCBkaXNhcHBlYXIuCitJIGluY2x1ZGVkIGEgc3BlY2lhbCBidWlsZCB0YXJnZXQgYGBtYWtlIGFsbCcnIHRoYXQgd2lsbCBidWlsZCBhbGwgdGhlCitkb2N1bWVudGF0aW9uIGluIGFuIG9yZGVyIHRoYXQgd29uJ3QgbGV0IGFueXRoaW5nIGRpc2FwcGVhci4KKworCitAKCMpICRJZDogSU5TVEFMTCx2IDEuNyAyMDAyLzA2LzE0IDEyOjE0OjE5IG1hcnRpbiBFeHAgJApkaWZmIC0tZ2l0IGEvTUFOSUZFU1QuaW4gYi9NQU5JRkVTVC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTA2YjdiCi0tLSAvZGV2L251bGwKKysrIGIvTUFOSUZFU1QuaW4KQEAgLTAsMCArMSwxMCBAQAorcmVjdXJzaXZlLWluY2x1ZGUgICAgICAgc3JjICAgICAqLmgKK2luY2x1ZGUgICAgIENPUFlJTkcgQ2hhbmdlTG9nIElOU1RBTEwgUkVBRE1FIFRPRE8gTUFOSUZFU1QuaW4gc3JjL1JBVElPTkFMRQoraW5jbHVkZSAgICAgZG9jL3B5T3BlblNTTC50ZXggZG9jL01ha2VmaWxlCityZWN1cnNpdmUtaW5jbHVkZSAgIGRvYy90b29scyAgICoKK3JlY3Vyc2l2ZS1pbmNsdWRlICAgZXhhbXBsZXMgICAgKgorcmVjdXJzaXZlLWluY2x1ZGUgICBycG0gICAgICAgICAqCitnbG9iYWwtZXhjbHVkZSAgLmN2c2lnbm9yZQorZ2xvYmFsLWV4Y2x1ZGUgICoucHljCisKKyMgQCgjKSAkSWQ6IE1BTklGRVNULmluLHYgMS4xMSAyMDAzLzA2LzE1IDA5OjUxOjE5IG1hcnRpbiBFeHAgJApkaWZmIC0tZ2l0IGEvUEtHLUlORk8gYi9QS0ctSU5GTwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGZmZDAwCi0tLSAvZGV2L251bGwKKysrIGIvUEtHLUlORk8KQEAgLTAsMCArMSwxNSBAQAorTWV0YWRhdGEtVmVyc2lvbjogMS4wCitOYW1lOiBweU9wZW5TU0wKK1ZlcnNpb246IDAuNgorU3VtbWFyeTogUHl0aG9uIHdyYXBwZXIgbW9kdWxlIGFyb3VuZCB0aGUgT3BlblNTTCBsaWJyYXJ5CitIb21lLXBhZ2U6IGh0dHA6Ly9weW9wZW5zc2wuc291cmNlZm9yZ2UubmV0LworQXV0aG9yOiBNYXJ0aW4gU2rDtmdyZW4sIEFCIFN0cmFrdAorQXV0aG9yLWVtYWlsOiBtc2pvZ3JlbkBnbWFpbC5jb20KK0xpY2Vuc2U6IExHUEwKK0Rlc2NyaXB0aW9uOiBIaWdoLWxldmVsIHdyYXBwZXIgYXJvdW5kIGEgc3Vic2V0IG9mIHRoZSBPcGVuU1NMIGxpYnJhcnksIGluY2x1ZGVzCisgICAgICAgICogU1NMLkNvbm5lY3Rpb24gb2JqZWN0cywgd3JhcHBpbmcgdGhlIG1ldGhvZHMgb2YgUHl0aG9uJ3MgcG9ydGFibGUKKyAgICAgICAgc29ja2V0cworICAgICAgICAqIENhbGxiYWNrcyB3cml0dGVuIGluIFB5dGhvbgorICAgICAgICAqIEV4dGVuc2l2ZSBlcnJvci1oYW5kbGluZyBtZWNoYW5pc20sIG1pcnJvcmluZyBPcGVuU1NMJ3MgZXJyb3IgY29kZXMKKyAgICAgICAgLi4uICBhbmQgbXVjaCBtb3JlIDspCitQbGF0Zm9ybTogVU5LTk9XTgpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZTBhZTEKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUKQEAgLTAsMCArMSwzMCBAQAorCitweU9wZW5TU0wgLSBBIFB5dGhvbiB3cmFwcGVyIGFyb3VuZCB0aGUgT3BlblNTTCBsaWJyYXJ5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ29weXJpZ2h0IChDKSBBQiBTdHJha3QgMjAwMSwgQWxsIHJpZ2h0cyByZXNlcnZlZAorCitJIHdyb3RlIHRoaXMgbW9kdWxlIHdvcmtpbmcgZm9yIEFCIFN0cmFrdCAoaHR0cDovL3d3dy5zdHJha3QuY29tLykgYW5kIHRoZXkKK3BhaWQgbWUgdG8gZG8gaXQsIGFuZCBpdCBpcyB3aXRoIHRoZWlyIGNvbnNlbnQgdGhpcyBtb2R1bGUgaXMgcmVsZWFzZWQgdG8gdGhlCitnZW5lcmFsIHB1YmxpYy4KKworU2VlIHRoZSBmaWxlIElOU1RBTEwgZm9yIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCisKK0kgYXBwcmVjaWF0ZSBidWcgcmVwb3J0cyBhbmQgcGF0Y2hlcywganVzdCBtYWlsIG1lIQorCisKK1RoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgordmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworQSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKHZlcnNpb24gMi4xKSBpcyBpbmNsdWRlZCBpbgordGhlIGZpbGUgQ09QWUlORy4KKworCitAKCMpICRJZDogUkVBRE1FLHYgMS4yIDIwMDEvMDcvMjUgMTA6NDI6NTcgbWFydGluIEV4cCAkCmRpZmYgLS1naXQgYS9UT0RPIGIvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjY4ZWEwCi0tLSAvZGV2L251bGwKKysrIGIvVE9ETwpAQCAtMCwwICsxLDkgQEAKK1RPRE8gbGlzdAorCisqIFRoaW5rIG1vcmUgY2FyZWZ1bGx5IGFib3V0IHRoZSByZWxhdGlvbiBiZXR3ZWVuIFg1MDkgYW5kIFg1MDlfTkFNRQorICBfc2V0X3tzdWJqZWN0LGlzc3Vlcn0gZHVwIHRoZSBuZXcgbmFtZSBhbmQgZnJlZSB0aGUgb2xkIG9uZS4KKyogQ29uc2lkZXIgUHlyZXgKKyogVXBkYXRlIHRzYWZlLkNvbm5lY3Rpb24gYW5kIG1ha2Ugc3VyZSB0aGUgZG9jcyBhcmUgY29ycmVjdAorKiBVcGRhdGVkIGRvY3MhIChycG0sIC4uLikKKyogX1NvbWVob3dfIGdldCBtYWtlZmlsZSB0byB3b3JrIQorKiBodHRwc2xpYiwgaW1hcHNsaWIsIGZ0cHNsaWI/CmRpZmYgLS1naXQgYS9fX2luaXRfXy5weSBiL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMzkzZmYKLS0tIC9kZXYvbnVsbAorKysgYi9fX2luaXRfXy5weQpAQCAtMCwwICsxLDEyIEBACisjCisjIF9faW5pdF9fLnB5CisjCisjIENvcHlyaWdodCAoQykgQUIgU3RyYWt0IDIwMDEsIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyMKKyMgJElkOiBfX2luaXRfXy5weSx2IDEuNCAyMDA0LzA3LzIyIDEyOjAxOjI1IG1hcnRpbiBFeHAgJAorIworIiIiCitweU9wZW5TU0wgLSBBIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCB0aGUgT3BlblNTTCBsaWJyYXJ5CisiIiIKK2ltcG9ydCByYW5kLCBjcnlwdG8sIFNTTCwgdHNhZmUKK2Zyb20gdmVyc2lvbiBpbXBvcnQgX192ZXJzaW9uX18KZGlmZiAtLWdpdCBhL2RlYmlhbi9SRUFETUUuRGViaWFuIGIvZGViaWFuL1JFQURNRS5EZWJpYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg0ZGViOAotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9SRUFETUUuRGViaWFuCkBAIC0wLDAgKzEsMTMgQEAKK0RlYmlhbiBub3RlcyAtLSBweU9wZW5TU0wKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHNvdXJjZSBwYWNrYWdlIGlzIHNwbGl0IHVwIG92ZXIgZm91ciBiaW5hcnkgcGFja2FnZXM6CisKKyogcHl0aG9uMi4yLXB5b3BlbnNzbCAtLSBjb21waWxlZCBmb3IgUHl0aG9uIDIuMgorKiBweXRob24yLjMtcHlvcGVuc3NsIC0tIGNvbXBpbGVkIGZvciBQeXRob24gMi4zCisqIHB5dGhvbi1weW9wZW5zc2wgICAgLS0gZHVtbXkgcGFja2FnZSB0aGF0IGRlcGVuZHMgb24gdGhlIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeXRob24gdmVyc2lvbiAoY3VycmVudGx5IDIuMykKKyogcHlvcGVuc3NsLWRvYyAgICAgICAtLSBkb2N1bWVudGF0aW9uIGZvciBweU9wZW5TU0wKKworCitNYXJ0aW4gU2rDtmdyZW4gPHNqb2dyZW5AZGViaWFuLm9yZz4KZGlmZiAtLWdpdCBhL2RlYmlhbi9jaGFuZ2Vsb2cgYi9kZWJpYW4vY2hhbmdlbG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYWZjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vY2hhbmdlbG9nCkBAIC0wLDAgKzEsMjA5IEBACitweW9wZW5zc2wgKDAuNi0yLjN1YnVudHUxKSBmZWlzdHk7IHVyZ2VuY3k9bG93CisKKyAgKiBCdWlsZCBhIHB5dGhvbi10d2lzdGVkLWRiZyBwYWNrYWdlLgorICAqIEJ1bXAgZGViaGVscGVyIGNvbXBhdGliaWxpdHkgdG8gdjUuCisgICogU2V0IFVidW50dSBtYWludGFpbmVyIGFkZHJlc3MuCisKKyAtLSBNYXR0aGlhcyBLbG9zZSA8ZG9rb0B1YnVudHUuY29tPiAgU2F0LCAxNyBGZWIgMjAwNyAwMjo1OToxNyArMDEwMAorCitweW9wZW5zc2wgKDAuNi0yLjNidWlsZDIpIGVkZ3k7IHVyZ2VuY3k9bG93CisKKyAgKiBSZWJ1aWxkIHRvIGFkZCBzdXBwb3J0IGZvciBweXRob24yLjUuCisKKyAtLSBNYXR0aGlhcyBLbG9zZSA8ZG9rb0B1YnVudHUuY29tPiAgRnJpLCAgOCBTZXAgMjAwNiAxMzozMjoyMiArMDAwMAorCitweW9wZW5zc2wgKDAuNi0yLjNidWlsZDEpIGVkZ3k7IHVyZ2VuY3k9bG93CisKKyAgKiBSZWJ1aWxkICh1c2luZyBuZXcgcHl0aG9uLWRlZmF1bHRzKS4gVWJ1bnR1ICM1MjMyMC4KKworIC0tIE1hdHRoaWFzIEtsb3NlIDxkb2tvQHVidW50dS5jb20+ICBTYXQsICA4IEp1bCAyMDA2IDExOjMzOjU1ICswMDAwCisKK3B5b3BlbnNzbCAoMC42LTIuMykgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBOb24tbWFpbnRhaW5lciB1cGxvYWQuCisgICogVXBkYXRlIFBhY2thZ2UgZm9yIGxhc3QgcHl0aG9uIHBvbGljeSAoQ2xvc2VzOiAjMzczNTQ4KS4KKworIC0tIFBpZXJyZSBIYWJvdXppdCA8bWFkY29kZXJAZGViaWFuLm9yZz4gIEZyaSwgMzAgSnVuIDIwMDYgMTM6MzE6MTAgKzAyMDAKKworcHlvcGVuc3NsICgwLjYtMi4yKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIE5vbi1tYWludGFpbmVyIHVwbG9hZC4KKyAgKiBJbmNsdWRlIHBhdGNoIGZyb20gQ3lyaWwgTGFjb3V4IDxjbGFjb3V4QGVhc3Rlci1lZ2dzLmNvbT4sCisgICAgZml4aW5nIFNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIGNyZWF0aW5nIHg1MDkgZXh0ZW5zaW9uLgorICAgIChDbG9zZXM6ICMzNTU5NDcpCisKKyAtLSBKdWxpZW4gRGFuam91IDxhY2lkQGRlYmlhbi5vcmc+ICBGcmksIDEyIE1heSAyMDA2IDE2OjQyOjQ3ICswMjAwCisKK3B5b3BlbnNzbCAoMC42LTIuMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBOb24tbWFpbnRhaW5lciB1cGxvYWQuCisgICogU3RvcCBidWlsZGluZyBtb2R1bGVzIGZvciBweXRob24yLjIuIChDbG9zZXM6ICMzNTExMzMpCisgICogQWxzbyByZWJ1aWxkIG1vZHVsZSB1c2luZyBsaWJzc2wwLjkuOC4gKENsb3NlczogIzM0NzU0MSkKKworIC0tIFBpZXJyZSBIYWJvdXppdCA8bWFkY29kZXJAZGViaWFuLm9yZz4gIFN1biwgIDkgQXByIDIwMDYgMTk6NDU6MTYgKzAyMDAKKworcHlvcGVuc3NsICgwLjYtMikgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBBZGQgc3VwcG9ydCBmb3IgcHl0aG9uIDIuNC4gKENsb3NlczogIzI5Nzg3MCkKKyAgKiBCdWlsZC1kZXBlbmQgb24gdjAuOS43IG9mIG9wZW5zc2wuCisKKyAtLSBNYXJ0aW4gU2pvZ3JlbiA8c2pvZ3JlbkBkZWJpYW4ub3JnPiAgTW9uLCAxNCBNYXIgMjAwNSAwODo1NjoyNyArMDEwMAorCitweW9wZW5zc2wgKDAuNi0xKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIE5ldyB1cHN0cmVhbSByZWxlYXNlLCBpbmNsdWRpbmc6CisgICAgLSBBZGQgTmV0c2NhcGUgU1BLSSBleHRlbnNpb25zLiAoQ2xvc2VzOiAjMjA1MTMyKQorICAgIC0gQWRkIFg1MDkuc3ViamVjdF9uYW1lX2hhc2gsIFg1MDkuZGlnZXN0LiAoQ2xvc2VzOiAjMjA1MTM2KQorICAgIC0gRml4IGZ1bGwgbmFtZXMgb2YgZXhjZXB0aW9ucy4gKENsb3NlczogIzI1MDM0MikKKyAgICAtIEFkZCBTU0wuQ29udGV4dC51c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZS4gKENsb3NlczogIzI2MDEzNCkKKyAgKiBEb2NzIGFyZSBidWlsdCB1cHN0cmVhbSwgc28gdGhlIGJ1aWxkLWRlcHMgaGF2ZSBiZWVuIHRyaW1tZWQuCisgICAgVGhpcyBhbHNvIG1lYW5zIHRoYXQgSFRNTCBhbmQgdGV4dCBkb2N1bWVudGF0aW9uIGFyZSBiYWNrLgorICAqIEJ1bXBlZCBzdGFuZGFyZHMtdmVyc2lvbi4KKyAgKiBVc2UgZGhfcHl0aG9uLgorCisgLS0gTWFydGluIFNqb2dyZW4gPHNqb2dyZW5AZGViaWFuLm9yZz4gIEZyaSwgMTMgQXVnIDIwMDQgMjA6NTM6MjcgKzAyMDAKKworcHlvcGVuc3NsICgwLjUuMS00KSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIERyb3AgSFRNTCBhbmQgdGV4dCBkb2N1bWVudGF0aW9uIHNpbmNlIGxhdGV4Mmh0bWwgbW92ZWQgdG8gbm9uLWZyZWUuCisgICAgVGhpcyBpcyBhIHRlbXBvcmFyeSBzb2x1dGlvbiwgdW50aWwgSSBjYW4gaGFjayBta2hvd3RvIHRvIHVzZSBzb21ldGhpbmcKKyAgICBlbHNlLiAoQ2xvc2VzOiAjMjIxMzQ0KQorICAqIEZpeCB0aGUgY29weXJpZ2h0IGZpbGUgdG8gbWVudGlvbiB0aGUgY29weXJpZ2h0IGhvbGRlci4KKworIC0tIE1hcnRpbiBTam9ncmVuIDxzam9ncmVuQGRlYmlhbi5vcmc+ICBNb24sIDE1IERlYyAyMDAzIDIwOjE2OjI1ICswMTAwCisKK3B5b3BlbnNzbCAoMC41LjEtMykgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBNQU5JRkVTVC5pbjogSW5jbHVkZSB0aGUgc3JjL1JBVElPTkFMRSBmaWxlLiAoQ2xvc2VzOiAjMTk3NDAxKQorICAqIGRvYy9weU9wZW5TU0wudGV4OiBGaXggdHlwby4gKENsb3NlczogIzE5NzQzNSkKKyAgKiBEcm9wIFB5dGhvbiAxLjUgYW5kIDIuMSBzdXBwb3J0LgorICAqIE1ha2UgcHl0aG9uLXB5b3BlbnNzbCBkZXBlbmQgb24gcHl0aG9uMi4zLXB5b3BlbnNzbCwgd2hpY2ggaXMgbm8gbG9uZ2VyCisgICAgImV4cGVyaW1lbnRhbCIuCisKKyAtLSBNYXJ0aW4gU2pvZ3JlbiA8c2pvZ3JlbkBkZWJpYW4ub3JnPiAgTW9uLCAxMSBBdWcgMjAwMyAxODozNzowNyArMDIwMAorCitweW9wZW5zc2wgKDAuNS4xLTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTWFrZSBzdXJlIG5hbWVzIGluIGNvbnRyb2wgYW5kIGNoYW5nZWxvZyBtYXRjaC4gU3R1cGlkIGNoYW5nZWxvZ3MsIGJsZWguCisgICogQ2hhbmdlIHNlY3Rpb24gdG8gJ3B5dGhvbicuCisgICogUmVidWlsZCB3aXRoIG9wZW5zc2wgMC45LjcuIChDbG9zZXM6ICMxODk4MjYpCisgICogX19pbml0X18ucHk6IEltcG9ydCB0c2FmZSBtb2R1bGUuCisgICogdHNhZmUucHk6IEFkZCBzb21lIG1pc3NpbmcgbWV0aG9kcy4KKyAgKiBkZWJpYW4vY29weXJpZ2h0OiBGaXggQXV0aG9yKHMpIGJvaWxlcnBsYXRlIHRoaW5neSB0byBzaHV0IGxpbnRpYW4gdXAuCisKKyAtLSBNYXJ0aW4gU2pvZ3JlbiA8c2pvZ3JlbkBkZWJpYW4ub3JnPiAgU3VuLCAyMCBBcHIgMjAwMyAxNzo1MDoyNCArMDIwMAorCitweW9wZW5zc2wgKDAuNS4xLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTmV3IHVwc3RyZWFtIHZlcnNpb24uIChDbG9zZXM6ICMxNTk1MzApCisgICogQWRkZWQgYSBweXRob24tcHlvcGVuc3NsIGR1bW15IHBhY2thZ2UuCisgICogQWRkZWQgYW4gZXhwZXJpbWVudGFsIHB5dGhvbjIuMy1weW9wZW5zc2wgcGFja2FnZS4KKworIC0tIE1hcnRpbiBTasO2Z3JlbiA8bWFydGluQHN0cmFrdC5jb20+ICBTdW4sIDI1IEF1ZyAyMDAyIDEyOjA4OjMxICswMjAwCisKK3B5b3BlbnNzbCAoMC41LTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTmV3IHVwc3RyZWFtIHZlcnNpb24KKyAgKiBTdXBwb3J0IGZvciBweXRob24xLjUuCisgICogRml4IHN0dXBpZCBtaXN0YWtlcyBmb3IgcHl0aG9uIDEuNSBhbmQgcHl0aG9uIDIuMS4KKworIC0tIE1hcnRpbiBTasO2Z3JlbiA8bWFydGluQHN0cmFrdC5jb20+ICBXZWQsIDI0IEp1bCAyMDAyIDA5OjA1OjI4ICswMjAwCisKK3B5b3BlbnNzbCAoMC40LjEtOCkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBBZGRlZCBleGFtcGxlcyB0byBweW9wZW5zc2wtZG9jCisKKyAtLSBNYXJ0aW4gU2rDtmdyZW4gPG1hcnRpbkBzdHJha3QuY29tPiAgV2VkLCAgNSBKdW4gMjAwMiAxNDo1ODowNCArMDIwMAorCitweW9wZW5zc2wgKDAuNC4xLTcpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogVGhlIGN1dGUgYXJyb3cgaWNvbnMgaW4gdGhlIEhUTUwgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgdGhlcmUgbm93IHRvby4KKworIC0tIE1hcnRpbiBTasO2Z3JlbiA8bWFydGluQHN0cmFrdC5jb20+ICBUaHUsIDMwIE1heSAyMDAyIDAwOjUzOjQ0ICswMjAwCisKK3B5b3BlbnNzbCAoMC40LjEtNikgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBDb21tZW50ZWQgb3V0IHNvbWUgdW51c2VkIHRoaW5ncyBpbiBkZWJpYW4vcnVsZXMKKworIC0tIE1hcnRpbiBTasO2Z3JlbiA8bWFydGluQHN0cmFrdC5jb20+ICBXZWQsIDI5IE1heSAyMDAyIDExOjIwOjMzICswMjAwCisKK3B5b3BlbnNzbCAoMC40LjEtNSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBBZGRpbmcgdG8gdGhlIGJ1aWxkLWRlcGVuZHMuCisgICogSW5pdGlhbCB1cGxvYWQgKENsb3NlczogIzE0MDY4NykKKworIC0tIE1hcnRpbiBTasO2Z3JlbiA8bWFydGluQHN0cmFrdC5jb20+ICBTYXQsICA2IEFwciAyMDAyIDE0OjE1OjQ5ICswMjAwCisKK3B5b3BlbnNzbCAoMC40LjEtNCkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBGaXhlcyBpbiBwYWNrYWdpbmcsIGl0IHNob3VsZG4ndCBiZSByZWdhcmRlZCBhIG5hdGl2ZSBwYWNrYWdlIG5vdy4KKworIC0tIE1hcnRpbiBTasO2Z3JlbiA8bWFydGluQHN0cmFrdC5jb20+ICBTYXQsICA2IEFwciAyMDAyIDExOjI2OjM5ICswMjAwCisKK3B5b3BlbnNzbCAoMC40LjEtMykgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBNb3ZlZCBmcm9tIG5vbi1VUyB0byBtYWluL2RldmVsCisKKyAtLSBNYXJ0aW4gU2rDtmdyZW4gPG1hcnRpbkBzdHJha3QuY29tPiAgRnJpLCAgNSBBcHIgMjAwMiAyMjo0NDoxMCArMDIwMAorCitweW9wZW5zc2wgKDAuNC4xLTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogRml4ZXMgaW4gdGhlIHBhY2thZ2luZywgZGVwZW5kZW5jaWVzIGFuZCBidWlsZCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlCisgICAgYWxsIHJpZ2h0IG5vdy4KKworIC0tIE1hcnRpbiBTasO2Z3JlbiA8bWFydGluQHN0cmFrdC5jb20+ICBUaHUsIDEwIEphbiAyMDAyIDEwOjAwOjA2ICswMTAwCisKK3B5b3BlbnNzbCAoMC40LjEtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBOZXcgInVwc3RyZWFtIiByZWxlYXNlCisgICogTmV3IHBhY2thZ2luZywgcHl0aG9uMi4xLXB5b3BlbnNzbCwgcHl0aG9uMi4yLXB5b3BlbnNzbCwgcHlvcGVuc3NsLWRvYworCisgLS0gTWFydGluIFNqw7ZncmVuIDxtYXJ0aW5Ac3RyYWt0LmNvbT4gIE1vbiwgIDcgSmFuIDIwMDIgMTU6Mzg6NTEgKzAxMDAKKworcHlvcGVuc3NsICgwLjQtNCkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBHcnJyLCB0aGlzIHRpbWUgdGhlbi4uLgorCisgLS0gTWFydGluIFNqw7ZncmVuIDxtYXJ0aW5Ac3RyYWt0LmNvbT4gIEZyaSwgMTcgQXVnIDIwMDEgMTQ6NTM6MTkgKzAyMDAKKworcHlvcGVuc3NsICgwLjQtMykgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBGaXhlZCBhIGJpZyBuYXN0eSBidWcKKworIC0tIE1hcnRpbiBTasO2Z3JlbiA8bWFydGluQHN0cmFrdC5jb20+ICBGcmksIDE3IEF1ZyAyMDAxIDE0OjMzOjA2ICswMjAwCisKK3B5b3BlbnNzbCAoMC40LTIpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogRml4ZXMKKworIC0tIE1hcnRpbiBTasO2Z3JlbiA8bWFydGluQHN0cmFrdC5jb20+ICBGcmksIDE3IEF1ZyAyMDAxIDEzOjUzOjExICswMjAwCisKK3B5b3BlbnNzbCAoMC40LTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTmV3ICJ1cHN0cmVhbSIgdmVyc2lvbgorCisgLS0gTWFydGluIFNqw7ZncmVuIDxtYXJ0aW5Ac3RyYWt0LmNvbT4gIFRodSwgIDkgQXVnIDIwMDEgMTI6MzI6NDcgKzAyMDAKKworcHlvcGVuc3NsICgwLjMtMykgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBYNTA5IG9iamVjdHMgbm93IGhhcyBhIGhhc19leHBpcmVkIG1ldGhvZAorCisgLS0gTWFydGluIFNqw7ZncmVuIDxtYXJ0aW5Ac3RyYWt0LmNvbT4gIFR1ZSwgIDcgQXVnIDIwMDEgMTQ6MTY6MTMgKzAyMDAKKworcHlvcGVuc3NsICgwLjMtMikgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBYNTA5TmFtZSBvYmplY3RzIG5vdyBoYXMgYSBjb21wYXJlIG1ldGhvZCAKKworIC0tIE1hcnRpbiBTasO2Z3JlbiA8bWFydGluQHN0cmFrdC5jb20+ICBUdWUsICA3IEF1ZyAyMDAxIDEwOjUzOjU4ICswMjAwCisKK3B5b3BlbnNzbCAoMC4zLTEpIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogTmV3ICJ1cHN0cmVhbSIgdmVyc2lvbgorCisgLS0gTWFydGluIFNqw7ZncmVuIDxtYXJ0aW5Ac3RyYWt0LmNvbT4gIEZyaSwgIDMgQXVnIDIwMDEgMTY6MzY6MjYgKzAyMDAKKworcHlvcGVuc3NsICgwLjEtMSkgdW5zdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiBJbml0aWFsIHZlcnNpb24uCisKKyAtLSBBbmRlcnMgSGFtbWFycXVpc3QgPGlrb0BzdHJha3QuY29tPiAgTW9uLCAyMyBKdWwgMjAwMSAxNToxNzozOCArMDIwMApkaWZmIC0tZ2l0IGEvZGViaWFuL2NvbXBhdCBiL2RlYmlhbi9jb21wYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VkNmZmOAotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9jb21wYXQKQEAgLTAsMCArMSBAQAorNQpkaWZmIC0tZ2l0IGEvZGViaWFuL2NvbnRyb2wgYi9kZWJpYW4vY29udHJvbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmM1NGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL2NvbnRyb2wKQEAgLTAsMCArMSw0MCBAQAorU291cmNlOiBweW9wZW5zc2wKK1NlY3Rpb246IHB5dGhvbgorUHJpb3JpdHk6IG9wdGlvbmFsCitNYWludGFpbmVyOiBVYnVudHUgQ29yZSBkZXZlbG9wZXJzIDx1YnVudHUtZGV2ZWwtZGlzY3Vzc0BsaXN0cy51YnVudHUuY29tPgorWFNCQy1PcmlnaW5hbC1NYWludGFpbmVyOiBNYXJ0aW4gU2pvZ3JlbiA8c2pvZ3JlbkBkZWJpYW4ub3JnPgorQnVpbGQtRGVwZW5kczogZGViaGVscGVyICg+PSA1LjAuMzcuMiksIHB5dGhvbi1hbGwtZGV2ICg+PSAyLjMuNS0xMSksIHB5dGhvbi1hbGwtZGJnICg+PSAyLjUtMHVidW50dTUpLAorIHB5dGhvbi1zdXBwb3J0ICg+PSAwLjMpLCBsaWJzc2wtZGV2ICg+PSAwLjkuOCkKK1N0YW5kYXJkcy1WZXJzaW9uOiAzLjcuMgorCitQYWNrYWdlOiBweXRob24tcHlvcGVuc3NsCitBcmNoaXRlY3R1cmU6IGFueQorRGVwZW5kczogJHtweXRob246RGVwZW5kc30sICR7c2hsaWJzOkRlcGVuZHN9CitQcm92aWRlczogJHtweXRob246UHJvdmlkZXN9CitTdWdnZXN0czogcHlvcGVuc3NsLWRvYywgcHl0aG9uLXB5b3BlbnNzbC1kYmcKK1JlcGxhY2VzOiBweXRob24yLXB5b3BlbnNzbCwgcHl0aG9uMi4zLXB5b3BlbnNzbCAoPDwgMC42LTIuMyksIHB5dGhvbjIuNC1weW9wZW5zc2wgKDw8IDAuNi0yLjMpCitDb25mbGljdHM6IHB5dGhvbjItcHlvcGVuc3NsLCBweXRob24yLjMtcHlvcGVuc3NsICg8PCAwLjYtMi4zKSwgcHl0aG9uMi40LXB5b3BlbnNzbCAoPDwgMC42LTIuMykKK1hCLVB5dGhvbi1WZXJzaW9uOiAke3B5dGhvbjpWZXJzaW9uc30KK0Rlc2NyaXB0aW9uOiBQeXRob24gd3JhcHBlciBhcm91bmQgdGhlIE9wZW5TU0wgbGlicmFyeQorIEluY2x1ZGVzOiBTU0wgQ29udGV4dCBvYmplY3RzLCBTU0wgQ29ubmVjdGlvbiBvYmplY3RzLCB1c2luZworIFB5dGhvbiBzb2NrZXRzIGFzIHRyYW5zcG9ydCBsYXllci4gVGhlIENvbm5lY3Rpb24gb2JqZWN0Cisgd3JhcHMgYWxsIHRoZSBzb2NrZXQgbWV0aG9kcyBhbmQgY2FuIHRoZXJlZm9yZSBiZSB1c2VkCisgaW50ZXJjaGFuZ2VhYmx5LgorCitQYWNrYWdlOiBweXRob24tcHlvcGVuc3NsLWRiZworUHJpb3JpdHk6IGV4dHJhCitBcmNoaXRlY3R1cmU6IGFueQorRGVwZW5kczogcHl0aG9uLXB5b3BlbnNzbCAoPSAke1NvdXJjZS1WZXJzaW9ufSksIHB5dGhvbi1kYmcsICR7c2hsaWJzOkRlcGVuZHN9CitEZXNjcmlwdGlvbjogUHl0aG9uIHdyYXBwZXIgYXJvdW5kIHRoZSBPcGVuU1NMIGxpYnJhcnkgKGRlYnVnIGV4dGVuc2lvbikKKyBJbmNsdWRlczogU1NMIENvbnRleHQgb2JqZWN0cywgU1NMIENvbm5lY3Rpb24gb2JqZWN0cywgdXNpbmcKKyBQeXRob24gc29ja2V0cyBhcyB0cmFuc3BvcnQgbGF5ZXIuIFRoZSBDb25uZWN0aW9uIG9iamVjdAorIHdyYXBzIGFsbCB0aGUgc29ja2V0IG1ldGhvZHMgYW5kIGNhbiB0aGVyZWZvcmUgYmUgdXNlZAorIGludGVyY2hhbmdlYWJseS4KKworUGFja2FnZTogcHlvcGVuc3NsLWRvYworU2VjdGlvbjogZG9jCitBcmNoaXRlY3R1cmU6IGFsbAorU3VnZ2VzdHM6IHB5dGhvbi1weW9wZW5zc2wKK0Rlc2NyaXB0aW9uOiBEb2N1bWVudGF0aW9uIGZvciBweU9wZW5TU0wKKyBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHB5T3BlblNTTCBwYWNrYWdlLAorIGluIEhUTUwsIHBvc3RzY3JpcHQgYW5kIHRleHQgZm9ybWF0cy4KZGlmZiAtLWdpdCBhL2RlYmlhbi9jb3B5cmlnaHQgYi9kZWJpYW4vY29weXJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MDUzOTkKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vY29weXJpZ2h0CkBAIC0wLDAgKzEsMjIgQEAKK1RoaXMgcGFja2FnZSB3YXMgZGViaWFuaXplZCBieSBNYXJ0aW4gU2rDtmdyZW4gPHNqb2dyZW5AZGViaWFuLm9yZz4gb24KK01vbiwgIDcgSmFuIDIwMDIgMTY6MjU6NTggKzAxMDAuCisKK0l0IHdhcyBkb3dubG9hZGVkIGZyb20gcHlvcGVuc3NsLnNvdXJjZWZvcmdlLm5ldAorCitVcHN0cmVhbSBBdXRob3I6IE1hcnRpbiBTasO2Z3JlbiA8bXNqb2dyZW5AZ21haWwuY29tPgorCitDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBBQiBTdHJha3QKKworVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCit2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitBIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAodmVyc2lvbiAyLjEpCitjYW4gYmUgZm91bmQgaW4gL3Vzci9zaGFyZS9jb21tb24tbGljZW5zZXMvTEdQTCBvbiBEZWJpYW4gc3lzdGVtcywKK29yIGluIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHNvdXJjZSBwYWNrYWdlLgpkaWZmIC0tZ2l0IGEvZGViaWFuL3B5Y29tcGF0IGIvZGViaWFuL3B5Y29tcGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZmJmMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vcHljb21wYXQKQEAgLTAsMCArMSBAQAorMgpkaWZmIC0tZ2l0IGEvZGViaWFuL3B5b3BlbnNzbC1kb2MuZG9jLWJhc2UgYi9kZWJpYW4vcHlvcGVuc3NsLWRvYy5kb2MtYmFzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTdlYjNmCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL3B5b3BlbnNzbC1kb2MuZG9jLWJhc2UKQEAgLTAsMCArMSwxMyBAQAorRG9jdW1lbnQ6IHB5b3BlbnNzbC1tYW51YWwKK1RpdGxlOiBQeXRob24gT3BlblNTTCBNYW51YWwKK0F1dGhvcjogTWFydGluIFNq9mdyZW4KK0Fic3RyYWN0OiBNYW51YWwgZm9yIHRoZSBweU9wZW5TU0wgcGFja2FnZS4KKyAgVGhpcyBtb2R1bGUgaXMgYSByYXRoZXIgdGhpbiB3cmFwcGVyIGFyb3VuZCAoYSBzdWJzZXQgb2YpIHRoZQorICBPcGVuU1NMIGxpYnJhcnkuIFdpdGggdGhpbiB3cmFwcGVyIEkgbWVhbiB0aGF0IGEgbG90IG9mIHRoZQorICBvYmplY3QgbWV0aG9kcyBkbyBub3RoaW5nIG1vcmUgdGhhbiBjYWxsaW5nIGEgY29ycmVzcG9uZGluZworICBmdW5jdGlvbiBpbiB0aGUgT3BlblNTTCBsaWJyYXJ5LgorU2VjdGlvbjogQXBwcy9wcm9ncmFtbWluZworCitGb3JtYXQ6IEhUTUwKK0luZGV4OiAvdXNyL3NoYXJlL2RvYy9weW9wZW5zc2wtZG9jL2h0bWwvaW5kZXguaHRtbAorRmlsZXM6IC91c3Ivc2hhcmUvZG9jL3B5b3BlbnNzbC1kb2MvaHRtbC8qCmRpZmYgLS1naXQgYS9kZWJpYW4vcHlvcGVuc3NsLWRvYy5kb2NzIGIvZGViaWFuL3B5b3BlbnNzbC1kb2MuZG9jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTQ5ZGIxCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL3B5b3BlbnNzbC1kb2MuZG9jcwpAQCAtMCwwICsxLDQgQEAKK2RvYy9weU9wZW5TU0wucHMKK2RvYy9weU9wZW5TU0wudHh0Citkb2MvaHRtbAorZGViaWFuL1JFQURNRS5EZWJpYW4KZGlmZiAtLWdpdCBhL2RlYmlhbi9weW9wZW5zc2wtZG9jLmV4YW1wbGVzIGIvZGViaWFuL3B5b3BlbnNzbC1kb2MuZXhhbXBsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5NzIxZQotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9weW9wZW5zc2wtZG9jLmV4YW1wbGVzCkBAIC0wLDAgKzEgQEAKK2V4YW1wbGVzLyoKZGlmZiAtLWdpdCBhL2RlYmlhbi9weXRob24tcHlvcGVuc3NsLmRvY3MgYi9kZWJpYW4vcHl0aG9uLXB5b3BlbnNzbC5kb2NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNzQ3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vcHl0aG9uLXB5b3BlbnNzbC5kb2NzCkBAIC0wLDAgKzEgQEAKK2RlYmlhbi9SRUFETUUuRGViaWFuCmRpZmYgLS1naXQgYS9kZWJpYW4vcnVsZXMgYi9kZWJpYW4vcnVsZXMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTg4NmI0OAotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9ydWxlcwpAQCAtMCwwICsxLDEwMiBAQAorIyEvdXNyL2Jpbi9tYWtlIC1mCisjIFNhbXBsZSBkZWJpYW4vcnVsZXMgdGhhdCB1c2VzIGRlYmhlbHBlci4gCisjIEdOVSBjb3B5cmlnaHQgMTk5NyBieSBKb2V5IEhlc3MuCisjCisjIFRoaXMgdmVyc2lvbiBpcyBmb3IgYSBoeXBvdGhldGljYWwgcGFja2FnZSB0aGF0IGJ1aWxkcyBhbgorIyBhcmNoaXRlY3R1cmUtZGVwZW5kYW50IHBhY2thZ2UsIGFzIHdlbGwgYXMgYW4gYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50CisjIHBhY2thZ2UuCisKKyMgVW5jb21tZW50IHRoaXMgdG8gdHVybiBvbiB2ZXJib3NlIG1vZGUuIAorI2V4cG9ydCBESF9WRVJCT1NFPTEKKworUFlWRVJTIDo9ICQoc2hlbGwgcHl2ZXJzaW9ucyAtcikKKworYnVpbGQ6IGJ1aWxkLXN0YW1wCitidWlsZC1zdGFtcDoKKwlkaF90ZXN0ZGlyCisKKwlzZXQgLWU7IFwKKwlmb3IgcHkgaW4gJChQWVZFUlMpOyBkbyAgXAorCSAgICAkJHB5IHNldHVwLnB5IGJ1aWxkOyBcCisJICAgICQkcHktZGJnIHNldHVwLnB5IGJ1aWxkOyBcCisJZG9uZQorCisJdG91Y2ggYnVpbGQtc3RhbXAKKworY2xlYW46CisJZGhfdGVzdGRpcgorCWRoX3Rlc3Ryb290CisJcm0gLWYgYnVpbGQtc3RhbXAKKworCS1mb3IgcHkgaW4gJChQWVZFUlMpOyBkbyBcCisJICAgICQkcHkgc2V0dXAucHkgY2xlYW4gLS1hbGw7IFwKKwkgICAgJCRweS1kYmcgc2V0dXAucHkgY2xlYW4gLS1hbGw7IFwKKwlkb25lCisJcm0gLXJmIGJ1aWxkIHZlcnNpb24ucHljCisKKwlkaF9jbGVhbgorCitpbnN0YWxsOiBESF9PUFRJT05TPQoraW5zdGFsbDogYnVpbGQKKwlkaF90ZXN0ZGlyCisJZGhfdGVzdHJvb3QKKwlkaF9jbGVhbiAtaworCWRoX2luc3RhbGxkaXJzCisKKwlzZXQgLWU7IFwKKwlmb3IgcHkgaW4gJChQWVZFUlMpOyBkbyBcCisJICAgIGVjaG8gImluc3RhbGxpbmcgZm9yICQkcHkgLi4uIjsgXAorCSAgICAkJHB5IHNldHVwLnB5IGluc3RhbGwgLS1yb290PSQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXB5b3BlbnNzbDsgXAorCSAgICBlY2hvICJpbnN0YWxsaW5nIGZvciAkJHB5LWRiZyAuLi4iOyBcCisJICAgICQkcHktZGJnIHNldHVwLnB5IGluc3RhbGwgLS1yb290PSQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXB5b3BlbnNzbC1kYmc7IFwKKwlkb25lCisJZmluZCBkZWJpYW4vcHl0aG9uLXB5b3BlbnNzbC1kYmcgISAtdHlwZSBkICEgLW5hbWUgJypfZC5zbycgfCB4YXJncyBybSAtZgorCWZpbmQgZGViaWFuL3B5dGhvbi1weW9wZW5zc2wtZGJnIC1kZXB0aCAtZW1wdHkgLWV4ZWMgcm1kaXIge30gXDsKKworIyBCdWlsZCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaGVyZS4KKyMgUGFzcyAtaSB0byBhbGwgZGViaGVscGVyIGNvbW1hbmRzIGluIHRoaXMgdGFyZ2V0IHRvIHJlZHVjZSBjbHV0dGVyLgorYmluYXJ5LWluZGVwOiBidWlsZCBpbnN0YWxsCisJZGhfdGVzdGRpciAtaQorCWRoX3Rlc3Ryb290IC1pCisJZGhfaW5zdGFsbGRvY3MgLWkKKwlkaF9pbnN0YWxsZXhhbXBsZXMgLWkKKyMJZGhfaW5zdGFsbG1lbnUgLWkKKyMJZGhfaW5zdGFsbGNyb24gLWkKKyMJZGhfaW5zdGFsbGluZm8gLWkKKwlkaF9pbnN0YWxsY2hhbmdlbG9ncyBDaGFuZ2VMb2cgLWkKKyMJZGhfbGluayAtaQorCWRoX2NvbXByZXNzIC1pCisJZGhfZml4cGVybXMgLWkKKwlkaF9weXN1cHBvcnQgLWkKKwlkaF9weXRob24gLWkKKwlkaF9pbnN0YWxsZGViIC1pCisJZGhfZ2VuY29udHJvbCAtaQorCWRoX21kNXN1bXMgLWkKKwlkaF9idWlsZGRlYiAtaQorCisjIEJ1aWxkIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaGVyZS4KK2JpbmFyeS1hcmNoOiBidWlsZCBpbnN0YWxsCisJZGhfdGVzdGRpciAtYQorCWRoX3Rlc3Ryb290IC1hCisJZGhfaW5zdGFsbGRvY3MgLWEKKwlkaF9pbnN0YWxsZXhhbXBsZXMgLWEKKyMJZGhfaW5zdGFsbG1lbnUgLWEKKyMJZGhfaW5zdGFsbGNyb24gLWEKKyMJZGhfaW5zdGFsbGluZm8gLWEKKwlkaF9pbnN0YWxsY2hhbmdlbG9ncyBDaGFuZ2VMb2cgLWEKKwlkaF9zdHJpcCAtcHB5dGhvbi1weW9wZW5zc2wgLS1kYmctcGFja2FnZT1weXRob24tcHlvcGVuc3NsLWRiZworIwlkaF9saW5rIC1hCisJcm0gLXJmIGRlYmlhbi9weXRob24tcHlvcGVuc3NsLWRiZy91c3Ivc2hhcmUvZG9jL3B5dGhvbi1weW9wZW5zc2wtZGJnCisJbG4gLXMgcHl0aG9uLXB5b3BlbnNzbCBkZWJpYW4vcHl0aG9uLXB5b3BlbnNzbC1kYmcvdXNyL3NoYXJlL2RvYy9weXRob24tcHlvcGVuc3NsLWRiZworCWRoX2NvbXByZXNzIC1hCisJZGhfZml4cGVybXMgLWEKKwlkaF9weXN1cHBvcnQgLWEKKwlkaF9tYWtlc2hsaWJzIC1hCisJZGhfaW5zdGFsbGRlYiAtYQorCWRoX3NobGliZGVwcyAtYQorCWRoX2dlbmNvbnRyb2wgLWEKKwlkaF9tZDVzdW1zIC1hCisJZGhfYnVpbGRkZWIgLWEKKworYmluYXJ5OiBiaW5hcnktaW5kZXAgYmluYXJ5LWFyY2gKKy5QSE9OWTogYnVpbGQgY2xlYW4gYmluYXJ5LWluZGVwIGJpbmFyeS1hcmNoIGJpbmFyeSBpbnN0YWxsCmRpZmYgLS1naXQgYS9kb2MvTWFrZWZpbGUgYi9kb2MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhYWJkYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9NYWtlZmlsZQpAQCAtMCwwICsxLDIwIEBACitQQVBFUiA9IGE0CitNS0hPV1RPID0gcHl0aG9uIHRvb2xzL21raG93dG8gLS0kKFBBUEVSKQorCitkZWZhdWx0OiBodG1sCisKK2FsbDogcHMgaHRtbCB0ZXh0IGR2aQorCitkdmkgcHMgdGV4dDogcHlPcGVuU1NMLnRleAorCSQoTUtIT1dUTykgLS0kQCAkXgorCitodG1sOiBweU9wZW5TU0wudGV4CisJJChNS0hPV1RPKSAtLWh0bWwgLS1pY29uc2VydmVyIC4gJF4KKwktcm0gLXJmIGh0bWwKKwltdiBweU9wZW5TU0wgaHRtbAorCitjbGVhbjoKKwlybSAtcmYgaHRtbCBweU9wZW5TU0wuZHZpIHB5T3BlblNTTC5wcyBweU9wZW5TU0wudHh0IFwKKwkgICAgcHlPcGVuU1NMLmwyaCBweU9wZW5TU0wuaG93CisKKy5QSE9OWTogZGVmYXVsdCBhbGwgaHRtbCBkdmkgcHMgdGV4dCBjbGVhbgpkaWZmIC0tZ2l0IGEvZG9jL2h0bWwvYWJvdXQuaHRtbCBiL2RvYy9odG1sL2Fib3V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhNTVjZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9odG1sL2Fib3V0Lmh0bWwKQEAgLTAsMCArMSwxMDMgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPkFib3V0IHRoaXMgZG9jdW1lbnQgLi4uPC90aXRsZT4KKzxNRVRBIE5BTUU9ImRlc2NyaXB0aW9uIiBDT05URU5UPSJBYm91dCB0aGlzIGRvY3VtZW50IC4uLiI+Cis8TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0icHlPcGVuU1NMIj4KKzxNRVRBIE5BTUU9InJlc291cmNlLXR5cGUiIENPTlRFTlQ9ImRvY3VtZW50Ij4KKzxNRVRBIE5BTUU9ImRpc3RyaWJ1dGlvbiIgQ09OVEVOVD0iZ2xvYmFsIj4KKzxsaW5rIHJlbD0iU1RZTEVTSEVFVCIgaHJlZj0icHlPcGVuU1NMLmNzcyI+Cis8TElOSyBSRUw9InByZXZpb3VzIiBocmVmPSJpbnRlcm5hbHMuaHRtbCI+Cis8TElOSyBSRUw9InVwIiBIUkVGPSJweU9wZW5TU0wuaHRtbCI+Cis8L2hlYWQ+Cis8Ym9keT4KKzxESVYgQ0xBU1M9Im5hdmlnYXRpb24iPgorPHRhYmxlIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjIiPgorPHRyPgorPHRkPjxBIGhyZWY9InNvY2tldC1tZXRob2RzLmh0bWwiPjxpbWcgc3JjPSJwcmV2aW91cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iUHJldmlvdXMgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBIUkVGPSJweU9wZW5TU0wuaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj5QeXRob24gT3BlblNTTCBNYW51YWw8L3RkPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJjb250ZW50cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iQ29udGVudHMiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzwvdHI+PC90YWJsZT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+UHJldmlvdXM6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ic29ja2V0LW1ldGhvZHMuaHRtbCI+NC4zIEFjZXNzaW5nIFNvY2tldCBNZXRob2RzPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5VcDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBIUkVGPSJweU9wZW5TU0wuaHRtbCI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC9BPgorPGJyPjxocj4KKzwvRElWPgorPCEtLUVuZCBvZiBOYXZpZ2F0aW9uIFBhbmVsLS0+CisKKzxIMT48QSBOQU1FPSJTRUNUSU9OMDAwNjAwMDAwMDAwMDAwMDAwMDAwIj4KK0Fib3V0IHRoaXMgZG9jdW1lbnQgLi4uPC9BPgorPC9IMT48c3Ryb25nPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvc3Ryb25nPgorPHA+IFRoaXMgZG9jdW1lbnQgd2FzIGdlbmVyYXRlZCB1c2luZyB0aGUgPGEKKyAgICBocmVmPSJodHRwOi8vc2FmdHNhY2suZnMudW5pLWJheXJldXRoLmRlL35sYXRleDJodC8iPgorICAgIDxzdHJvbmc+TGFUZVg8L3N0cm9uZz4yPHR0PkhUTUw8L3R0PjwvYT4gdHJhbnNsYXRvci4KKzwvcD4KKworPHA+IDxhCisgICAgaHJlZj0iaHR0cDovL3NhZnRzYWNrLmZzLnVuaS1iYXlyZXV0aC5kZS9+bGF0ZXgyaHQvIj4KKyAgICA8c3Ryb25nPkxhVGVYPC9zdHJvbmc+Mjx0dD5IVE1MPC90dD48L2E+IGlzIENvcHlyaWdodCAmY29weTsKKyAgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgPGEKKyAgICBocmVmPSJodHRwOi8vY2JsLmxlZWRzLmFjLnVrL25pa29zL3BlcnNvbmFsLmh0bWwiPk5pa29zCisgICAgRHJha29zPC9hPiwgQ29tcHV0ZXIgQmFzZWQgTGVhcm5pbmcgVW5pdCwgVW5pdmVyc2l0eSBvZgorICBMZWVkcywgYW5kIENvcHlyaWdodCAmY29weTsgMTk5NywgMTk5OCwgPGEKKyAgICBocmVmPSJodHRwOi8vd3d3Lm1hdGhzLm1xLmVkdS5hdS9+cm9zcy8iPlJvc3MKKyAgICBNb29yZTwvYT4sIE1hdGhlbWF0aWNzIERlcGFydG1lbnQsIE1hY3F1YXJpZSBVbml2ZXJzaXR5LAorICBTeWRuZXkuCis8L3A+CisKKzxwPiBUaGUgYXBwbGljYXRpb24gb2YgPGEKKyAgICBocmVmPSJodHRwOi8vc2FmdHNhY2suZnMudW5pLWJheXJldXRoLmRlL35sYXRleDJodC8iPgorICAgIDxzdHJvbmc+TGFUZVg8L3N0cm9uZz4yPHR0PkhUTUw8L3R0PjwvYT4gdG8gdGhlIFB5dGhvbgorICBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIGhlYXZpbHkgdGFpbG9yZWQgYnkgRnJlZCBMLiBEcmFrZSwKKyAgSnIuICBPcmlnaW5hbCBuYXZpZ2F0aW9uIGljb25zIHdlcmUgY29udHJpYnV0ZWQgYnkgQ2hyaXN0b3BoZXIKKyAgUGV0cmlsbGkuCis8L3A+CisKKzxESVYgQ0xBU1M9Im5hdmlnYXRpb24iPgorPHA+PGhyPgorPHRhYmxlIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjIiPgorPHRyPgorPHRkPjxBIGhyZWY9InNvY2tldC1tZXRob2RzLmh0bWwiPjxpbWcgc3JjPSJwcmV2aW91cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iUHJldmlvdXMgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBIUkVGPSJweU9wZW5TU0wuaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj5QeXRob24gT3BlblNTTCBNYW51YWw8L3RkPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJjb250ZW50cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iQ29udGVudHMiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzwvdHI+PC90YWJsZT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+UHJldmlvdXM6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ic29ja2V0LW1ldGhvZHMuaHRtbCI+NC4zIEFjZXNzaW5nIFNvY2tldCBNZXRob2RzPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5VcDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBIUkVGPSJweU9wZW5TU0wuaHRtbCI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC9BPgorPGhyPgorPHNwYW4gY2xhc3M9InJlbGVhc2UtaW5mbyI+UmVsZWFzZSAwLjYuPC9zcGFuPgorPC9ESVY+Cis8IS0tRW5kIG9mIE5hdmlnYXRpb24gUGFuZWwtLT4KKworPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jL2h0bWwvYmxhbmsuZ2lmIGIvZG9jL2h0bWwvYmxhbmsuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMzFmNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaHRtbC9ibGFuay5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2h0bWwvYnVpbGRpbmctdW5peC5odG1sIGIvZG9jL2h0bWwvYnVpbGRpbmctdW5peC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNTVjNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaHRtbC9idWlsZGluZy11bml4Lmh0bWwKQEAgLTAsMCArMSwxMjUgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPjIuMSBCdWlsZGluZyB0aGUgTW9kdWxlIG9uIGEgVW5peCBTeXN0ZW0gPC90aXRsZT4KKzxNRVRBIE5BTUU9ImRlc2NyaXB0aW9uIiBDT05URU5UPSIyLjEgQnVpbGRpbmcgdGhlIE1vZHVsZSBvbiBhIFVuaXggU3lzdGVtICI+Cis8TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0icHlPcGVuU1NMIj4KKzxNRVRBIE5BTUU9InJlc291cmNlLXR5cGUiIENPTlRFTlQ9ImRvY3VtZW50Ij4KKzxNRVRBIE5BTUU9ImRpc3RyaWJ1dGlvbiIgQ09OVEVOVD0iZ2xvYmFsIj4KKzxsaW5rIHJlbD0iU1RZTEVTSEVFVCIgaHJlZj0icHlPcGVuU1NMLmNzcyI+Cis8TElOSyBSRUw9Im5leHQiIGhyZWY9ImJ1aWxkaW5nLXdpbmRvd3MuaHRtbCI+Cis8TElOSyBSRUw9InByZXZpb3VzIiBocmVmPSJidWlsZGluZy5odG1sIj4KKzxMSU5LIFJFTD0idXAiIGhyZWY9ImJ1aWxkaW5nLmh0bWwiPgorPExJTksgUkVMPSJuZXh0IiBocmVmPSJidWlsZGluZy13aW5kb3dzLmh0bWwiPgorPC9oZWFkPgorPGJvZHk+Cis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJidWlsZGluZy5odG1sIj48aW1nIHNyYz0icHJldmlvdXMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlByZXZpb3VzIFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0iYnVpbGRpbmcuaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0iYnVpbGRpbmctd2luZG93cy5odG1sIj48aW1nIHNyYz0ibmV4dC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iTmV4dCBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj5QeXRob24gT3BlblNTTCBNYW51YWw8L3RkPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJjb250ZW50cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iQ29udGVudHMiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzwvdHI+PC90YWJsZT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+UHJldmlvdXM6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0iYnVpbGRpbmcuaHRtbCI+MiBCdWlsZGluZyBhbmQgSW5zdGFsbGluZzwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+VXA6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0iYnVpbGRpbmcuaHRtbCI+MiBCdWlsZGluZyBhbmQgSW5zdGFsbGluZzwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+TmV4dDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJidWlsZGluZy13aW5kb3dzLmh0bWwiPjIuMiBCdWlsZGluZyB0aGUgTW9kdWxlPC9BPgorPGJyPjxocj4KKzwvRElWPgorPCEtLUVuZCBvZiBOYXZpZ2F0aW9uIFBhbmVsLS0+CisKKzxIMj48QSBOQU1FPSJTRUNUSU9OMDAwMzEwMDAwMDAwMDAwMDAwMDAwIj4mbmJzcDs8L0E+Cis8QlI+CisyLjEgQnVpbGRpbmcgdGhlIE1vZHVsZSBvbiBhIFVuaXggU3lzdGVtIAorPC9IMj4KKworPFA+CitweU9wZW5TU0wgdXNlcyBkaXN0dXRpbHMsIHNvIHRoZXJlIHJlYWxseSBzaG91bGRuJ3QgYmUgYW55IHByb2JsZW1zLiBUbyBidWlsZAordGhlIGxpYnJhcnk6Cis8ZGw+PGRkPjxwcmUgY2xhc3M9InZlcmJhdGltIj4KK3B5dGhvbiBzZXR1cC5weSBidWlsZAorPC9wcmU+PC9kbD4KKworPFA+CitJZiB5b3VyIE9wZW5TU0wgaGVhZGVyIGZpbGVzIGFyZW4ndCBpbiA8Y29kZT4vdXNyL2luY2x1ZGU8L2NvZGU+LCB5b3UgbWF5IG5lZWQgdG8KK3N1cHBseSB0aGUgPGNvZGU+LUk8L2NvZGU+IGZsYWcgdG8gbGV0IHRoZSBzZXR1cCBzY3JpcHQga25vdyB3aGVyZSB0byBsb29rLiBUaGUgc2FtZQorZ29lcyBmb3IgdGhlIGxpYnJhcmllcyBvZiBjb3Vyc2UsIHVzZSB0aGUgPGNvZGU+LUw8L2NvZGU+IGZsYWcuIE5vdGUgdGhhdAorPGNvZGU+YnVpbGQ8L2NvZGU+IHdvbid0IGFjY2VwdCB0aGVzZSBmbGFncywgc28geW91IGhhdmUgdG8gcnVuIGZpcnN0Cis8Y29kZT5idWlsZF9leHQ8L2NvZGU+IGFuZCB0aGVuIDxjb2RlPmJ1aWxkPC9jb2RlPiEgRXhhbXBsZToKKzxkbD48ZGQ+PHByZSBjbGFzcz0idmVyYmF0aW0iPgorcHl0aG9uIHNldHVwLnB5IGJ1aWxkX2V4dCAtSS91c3IvbG9jYWwvc3NsL2luY2x1ZGUgLUwvdXNyL2xvY2FsL3NzbC9saWIKK3B5dGhvbiBzZXR1cC5weSBidWlsZAorPC9wcmU+PC9kbD4KKworPFA+CitOb3cgeW91IHNob3VsZCBoYXZlIGEgZGlyZWN0b3J5IGNhbGxlZCA8Y29kZT5PcGVuU1NMPC9jb2RlPiB0aGF0IGNvbnRhaW5zIGUuZy4KKzxjb2RlPlNTTC5zbzwvY29kZT4gYW5kIDxjb2RlPl9faW5pdF9fLnB5PC9jb2RlPiBzb21ld2hlcmUgaW4gdGhlIGJ1aWxkIGRpY3JlY3RvcnksCitzbyBqdXN0OgorPGRsPjxkZD48cHJlIGNsYXNzPSJ2ZXJiYXRpbSI+CitweXRob24gc2V0dXAucHkgaW5zdGFsbAorPC9wcmU+PC9kbD4KKworPFA+CitJZiB5b3UsIGZvciBzb21lIGFyY2FuZSByZWFzb24sIGRvbid0IHdhbnQgdGhlIG1vZHVsZSB0byBhcHBlYXIgaW4gdGhlCis8Y29kZT5zaXRlLXBhY2thZ2VzPC9jb2RlPiBkaXJlY3RvcnksIHVzZSB0aGUgPGNvZGU+LS1wcmVmaXg8L2NvZGU+IG9wdGlvbi4KKworPFA+CitZb3UgY2FuLCBvZiBjb3Vyc2UsIGRvCis8ZGw+PGRkPjxwcmUgY2xhc3M9InZlcmJhdGltIj4KK3B5dGhvbiBzZXR1cC5weSAtLWhlbHAKKzwvcHJlPjwvZGw+CisKKzxQPgordG8gZmluZCBvdXQgbW9yZSBhYm91dCBob3cgdG8gdXNlIHRoZSBzY3JpcHQuCisKKzxQPgorCis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzxwPjxocj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJidWlsZGluZy5odG1sIj48aW1nIHNyYz0icHJldmlvdXMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlByZXZpb3VzIFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0iYnVpbGRpbmcuaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0iYnVpbGRpbmctd2luZG93cy5odG1sIj48aW1nIHNyYz0ibmV4dC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iTmV4dCBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj5QeXRob24gT3BlblNTTCBNYW51YWw8L3RkPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJjb250ZW50cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iQ29udGVudHMiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzwvdHI+PC90YWJsZT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+UHJldmlvdXM6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0iYnVpbGRpbmcuaHRtbCI+MiBCdWlsZGluZyBhbmQgSW5zdGFsbGluZzwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+VXA6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0iYnVpbGRpbmcuaHRtbCI+MiBCdWlsZGluZyBhbmQgSW5zdGFsbGluZzwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+TmV4dDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJidWlsZGluZy13aW5kb3dzLmh0bWwiPjIuMiBCdWlsZGluZyB0aGUgTW9kdWxlPC9BPgorPGhyPgorPHNwYW4gY2xhc3M9InJlbGVhc2UtaW5mbyI+UmVsZWFzZSAwLjYuPC9zcGFuPgorPC9ESVY+Cis8IS0tRW5kIG9mIE5hdmlnYXRpb24gUGFuZWwtLT4KKworPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jL2h0bWwvYnVpbGRpbmctd2luZG93cy5odG1sIGIvZG9jL2h0bWwvYnVpbGRpbmctd2luZG93cy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOGY4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaHRtbC9idWlsZGluZy13aW5kb3dzLmh0bWwKQEAgLTAsMCArMSwxMTcgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPjIuMiBCdWlsZGluZyB0aGUgTW9kdWxlIG9uIGEgV2luZG93cyBTeXN0ZW0gPC90aXRsZT4KKzxNRVRBIE5BTUU9ImRlc2NyaXB0aW9uIiBDT05URU5UPSIyLjIgQnVpbGRpbmcgdGhlIE1vZHVsZSBvbiBhIFdpbmRvd3MgU3lzdGVtICI+Cis8TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0icHlPcGVuU1NMIj4KKzxNRVRBIE5BTUU9InJlc291cmNlLXR5cGUiIENPTlRFTlQ9ImRvY3VtZW50Ij4KKzxNRVRBIE5BTUU9ImRpc3RyaWJ1dGlvbiIgQ09OVEVOVD0iZ2xvYmFsIj4KKzxsaW5rIHJlbD0iU1RZTEVTSEVFVCIgaHJlZj0icHlPcGVuU1NMLmNzcyI+Cis8TElOSyBSRUw9InByZXZpb3VzIiBocmVmPSJidWlsZGluZy11bml4Lmh0bWwiPgorPExJTksgUkVMPSJ1cCIgaHJlZj0iYnVpbGRpbmcuaHRtbCI+Cis8TElOSyBSRUw9Im5leHQiIGhyZWY9Im9wZW5zc2wuaHRtbCI+Cis8L2hlYWQ+Cis8Ym9keT4KKzxESVYgQ0xBU1M9Im5hdmlnYXRpb24iPgorPHRhYmxlIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjIiPgorPHRyPgorPHRkPjxBIGhyZWY9ImJ1aWxkaW5nLXVuaXguaHRtbCI+PGltZyBzcmM9InByZXZpb3VzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJQcmV2aW91cyBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9ImJ1aWxkaW5nLmh0bWwiPjxpbWcgc3JjPSJ1cC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iVXAgT25lIExldmVsIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wuaHRtbCI+PGltZyBzcmM9Im5leHQuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9Ik5leHQgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC90ZD4KKzx0ZD48QSBocmVmPSJjb250ZW50cy5odG1sIj48aW1nIHNyYz0iY29udGVudHMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IkNvbnRlbnRzIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8L3RyPjwvdGFibGU+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlByZXZpb3VzOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImJ1aWxkaW5nLXVuaXguaHRtbCI+Mi4xIEJ1aWxkaW5nIHRoZSBNb2R1bGU8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlVwOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImJ1aWxkaW5nLmh0bWwiPjIgQnVpbGRpbmcgYW5kIEluc3RhbGxpbmc8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPk5leHQ6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC5odG1sIj4zIE9wZW5TU0wgIDwvQT4KKzxicj48aHI+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorCis8SDI+PEEgTkFNRT0iU0VDVElPTjAwMDMyMDAwMDAwMDAwMDAwMDAwMCI+Jm5ic3A7PC9BPgorPEJSPgorMi4yIEJ1aWxkaW5nIHRoZSBNb2R1bGUgb24gYSBXaW5kb3dzIFN5c3RlbSAKKzwvSDI+CisKKzxQPgorQmlnIHRoYW5rcyB0byBJdGFtYXIgU2h0dWxsLVRyYXVyaW5nIGFuZCBPbGVnIE9ybG92IGZvciB0aGVpciBoZWxwIHdpdGgKK1dpbmRvd3MgYnVpbGQgaW5zdHJ1Y3Rpb25zLiAgU2FtZSBhcyBmb3IgVW5peCBzeXN0ZW1zLCB3ZSBoYXZlIHRvIHNlcGFyYXRlCit0aGUgPGNvZGU+YnVpbGRfZXh0PC9jb2RlPiBhbmQgdGhlIDxjb2RlPmJ1aWxkPC9jb2RlPi4KKworPFA+CitCdWlsZGluZyB0aGUgbGlicmFyeToKKworPFA+Cis8ZGw+PGRkPjxwcmUgY2xhc3M9InZlcmJhdGltIj4KK3NldHVwLnB5IGJ1aWxkX2V4dCAtSSAuLi5cb3BlbnNzbFxpbmMzMiAtTCAuLi5cb3BlbnNzbFxvdXQzMmRsbAorc2V0dXAucHkgYnVpbGQKKzwvcHJlPjwvZGw+CisKKzxQPgorV2hlcmUgPGNvZGU+Li4uXG9wZW5zc2w8L2NvZGU+IGlzIG9mIGNvdXJzZSB0aGUgbG9jYXRpb24gb2YgeW91ciBPcGVuU1NMIGluc3RhbGxhdGlvbi4KKworPFA+CitJbnN0YWxsYXRpb24gaXMgdGhlIHNhbWUgYXMgZm9yIFVuaXggc3lzdGVtczoKKzxkbD48ZGQ+PHByZSBjbGFzcz0idmVyYmF0aW0iPgorc2V0dXAucHkgaW5zdGFsbAorPC9wcmU+PC9kbD4KKworPFA+CitBbmQgc2ltaWxhcmlseSwgeW91IGNhbiBkbworPGRsPjxkZD48cHJlIGNsYXNzPSJ2ZXJiYXRpbSI+CitzZXR1cC5weSAtLWhlbHAKKzwvcHJlPjwvZGw+CisKKzxQPgordG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24uCisKKzxQPgorCis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzxwPjxocj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJidWlsZGluZy11bml4Lmh0bWwiPjxpbWcgc3JjPSJwcmV2aW91cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iUHJldmlvdXMgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJidWlsZGluZy5odG1sIj48aW1nIHNyYz0idXAuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlVwIE9uZSBMZXZlbCIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLmh0bWwiPjxpbWcgc3JjPSJuZXh0LmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJOZXh0IFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvdGQ+Cis8dGQ+PEEgaHJlZj0iY29udGVudHMuaHRtbCI+PGltZyBzcmM9ImNvbnRlbnRzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJDb250ZW50cyIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPC90cj48L3RhYmxlPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5QcmV2aW91czo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJidWlsZGluZy11bml4Lmh0bWwiPjIuMSBCdWlsZGluZyB0aGUgTW9kdWxlPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5VcDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJidWlsZGluZy5odG1sIj4yIEJ1aWxkaW5nIGFuZCBJbnN0YWxsaW5nPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wuaHRtbCI+MyBPcGVuU1NMICA8L0E+Cis8aHI+Cis8c3BhbiBjbGFzcz0icmVsZWFzZS1pbmZvIj5SZWxlYXNlIDAuNi48L3NwYW4+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kb2MvaHRtbC9idWlsZGluZy5odG1sIGIvZG9jL2h0bWwvYnVpbGRpbmcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzA4MTdjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2h0bWwvYnVpbGRpbmcuaHRtbApAQCAtMCwwICsxLDEwNSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+MiBCdWlsZGluZyBhbmQgSW5zdGFsbGluZyA8L3RpdGxlPgorPE1FVEEgTkFNRT0iZGVzY3JpcHRpb24iIENPTlRFTlQ9IjIgQnVpbGRpbmcgYW5kIEluc3RhbGxpbmcgIj4KKzxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJweU9wZW5TU0wiPgorPE1FVEEgTkFNRT0icmVzb3VyY2UtdHlwZSIgQ09OVEVOVD0iZG9jdW1lbnQiPgorPE1FVEEgTkFNRT0iZGlzdHJpYnV0aW9uIiBDT05URU5UPSJnbG9iYWwiPgorPGxpbmsgcmVsPSJTVFlMRVNIRUVUIiBocmVmPSJweU9wZW5TU0wuY3NzIj4KKzxMSU5LIFJFTD0ibmV4dCIgaHJlZj0ib3BlbnNzbC5odG1sIj4KKzxMSU5LIFJFTD0icHJldmlvdXMiIGhyZWY9ImludHJvLmh0bWwiPgorPExJTksgUkVMPSJ1cCIgSFJFRj0icHlPcGVuU1NMLmh0bWwiPgorPExJTksgUkVMPSJuZXh0IiBocmVmPSJidWlsZGluZy11bml4Lmh0bWwiPgorPC9oZWFkPgorPGJvZHk+Cis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJpbnRyby5odG1sIj48aW1nIHNyYz0icHJldmlvdXMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlByZXZpb3VzIFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgSFJFRj0icHlPcGVuU1NMLmh0bWwiPjxpbWcgc3JjPSJ1cC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iVXAgT25lIExldmVsIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9ImJ1aWxkaW5nLXVuaXguaHRtbCI+PGltZyBzcmM9Im5leHQuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9Ik5leHQgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC90ZD4KKzx0ZD48QSBocmVmPSJjb250ZW50cy5odG1sIj48aW1nIHNyYz0iY29udGVudHMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IkNvbnRlbnRzIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8L3RyPjwvdGFibGU+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlByZXZpb3VzOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImludHJvLmh0bWwiPjEgSW50cm9kdWN0aW9uPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5VcDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBIUkVGPSJweU9wZW5TU0wuaHRtbCI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImJ1aWxkaW5nLXVuaXguaHRtbCI+Mi4xIEJ1aWxkaW5nIHRoZSBNb2R1bGU8L0E+Cis8YnI+PGhyPgorPC9ESVY+Cis8IS0tRW5kIG9mIE5hdmlnYXRpb24gUGFuZWwtLT4KKzxIMT48QSBOQU1FPSJTRUNUSU9OMDAwMzAwMDAwMDAwMDAwMDAwMDAwIj4mbmJzcDs8L0E+Cis8QlI+CisyIEJ1aWxkaW5nIGFuZCBJbnN0YWxsaW5nIAorPC9IMT4KKworPFA+CitUaGVzZSBpbnN0cnVjdGlvbnMgY2FuIGFsc28gYmUgZm91bmQgaW4gdGhlIGZpbGUgPGNvZGU+SU5TVEFMTDwvY29kZT4uCisKKzxQPgorSSBoYXZlIHRlc3RlZCB0aGlzIG9uIERlYmlhbiBMaW51eCBzeXN0ZW1zICh3b29keSBhbmQgc2lkKSwgU29sYXJpcyAyLjYgYW5kCisyLjcuIE90aGVycyBoYXZlIHN1Y2Nlc3NmdWxseSBjb21waWxlZCBpdCBvbiBXaW5kb3dzIGFuZCBOVC4KKworPFA+CisKKzxwPjxocj4KKworPCEtLVRhYmxlIG9mIENoaWxkLUxpbmtzLS0+Cis8QSBOQU1FPSJDSElMRF9MSU5LUyI+PFNUUk9ORz5TdWJzZWN0aW9uczwvU1RST05HPjwvQT4KKworPFVMIENMQVNTPSJDaGlsZExpbmtzIj4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDc5IgorICBocmVmPSJidWlsZGluZy11bml4Lmh0bWwiPjIuMSBCdWlsZGluZyB0aGUgTW9kdWxlIG9uIGEgVW5peCBTeXN0ZW0gPC9BPgorPExJPjxBIE5BTUU9InRleDJodG1sODAiCisgIGhyZWY9ImJ1aWxkaW5nLXdpbmRvd3MuaHRtbCI+Mi4yIEJ1aWxkaW5nIHRoZSBNb2R1bGUgb24gYSBXaW5kb3dzIFN5c3RlbSA8L0E+Cis8L1VMPgorPCEtLUVuZCBvZiBUYWJsZSBvZiBDaGlsZC1MaW5rcy0tPgorCis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzxwPjxocj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJpbnRyby5odG1sIj48aW1nIHNyYz0icHJldmlvdXMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlByZXZpb3VzIFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgSFJFRj0icHlPcGVuU1NMLmh0bWwiPjxpbWcgc3JjPSJ1cC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iVXAgT25lIExldmVsIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9ImJ1aWxkaW5nLXVuaXguaHRtbCI+PGltZyBzcmM9Im5leHQuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9Ik5leHQgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC90ZD4KKzx0ZD48QSBocmVmPSJjb250ZW50cy5odG1sIj48aW1nIHNyYz0iY29udGVudHMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IkNvbnRlbnRzIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8L3RyPjwvdGFibGU+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlByZXZpb3VzOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImludHJvLmh0bWwiPjEgSW50cm9kdWN0aW9uPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5VcDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBIUkVGPSJweU9wZW5TU0wuaHRtbCI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImJ1aWxkaW5nLXVuaXguaHRtbCI+Mi4xIEJ1aWxkaW5nIHRoZSBNb2R1bGU8L0E+Cis8aHI+Cis8c3BhbiBjbGFzcz0icmVsZWFzZS1pbmZvIj5SZWxlYXNlIDAuNi48L3NwYW4+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kb2MvaHRtbC9jYWxsYmFja3MuaHRtbCBiL2RvYy9odG1sL2NhbGxiYWNrcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0M2JkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaHRtbC9jYWxsYmFja3MuaHRtbApAQCAtMCwwICsxLDEyNyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+NC4yIENhbGxiYWNrcyA8L3RpdGxlPgorPE1FVEEgTkFNRT0iZGVzY3JpcHRpb24iIENPTlRFTlQ9IjQuMiBDYWxsYmFja3MgIj4KKzxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJweU9wZW5TU0wiPgorPE1FVEEgTkFNRT0icmVzb3VyY2UtdHlwZSIgQ09OVEVOVD0iZG9jdW1lbnQiPgorPE1FVEEgTkFNRT0iZGlzdHJpYnV0aW9uIiBDT05URU5UPSJnbG9iYWwiPgorPGxpbmsgcmVsPSJTVFlMRVNIRUVUIiBocmVmPSJweU9wZW5TU0wuY3NzIj4KKzxMSU5LIFJFTD0ibmV4dCIgaHJlZj0ic29ja2V0LW1ldGhvZHMuaHRtbCI+Cis8TElOSyBSRUw9InByZXZpb3VzIiBocmVmPSJleGNlcHRpb25zLmh0bWwiPgorPExJTksgUkVMPSJ1cCIgaHJlZj0iaW50ZXJuYWxzLmh0bWwiPgorPExJTksgUkVMPSJuZXh0IiBocmVmPSJzb2NrZXQtbWV0aG9kcy5odG1sIj4KKzwvaGVhZD4KKzxib2R5PgorPERJViBDTEFTUz0ibmF2aWdhdGlvbiI+Cis8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMiI+Cis8dHI+Cis8dGQ+PEEgaHJlZj0iZXhjZXB0aW9ucy5odG1sIj48aW1nIHNyYz0icHJldmlvdXMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlByZXZpb3VzIFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0iaW50ZXJuYWxzLmh0bWwiPjxpbWcgc3JjPSJ1cC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iVXAgT25lIExldmVsIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9InNvY2tldC1tZXRob2RzLmh0bWwiPjxpbWcgc3JjPSJuZXh0LmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJOZXh0IFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvdGQ+Cis8dGQ+PEEgaHJlZj0iY29udGVudHMuaHRtbCI+PGltZyBzcmM9ImNvbnRlbnRzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJDb250ZW50cyIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPC90cj48L3RhYmxlPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5QcmV2aW91czo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJleGNlcHRpb25zLmh0bWwiPjQuMSBFeGNlcHRpb25zPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5VcDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJpbnRlcm5hbHMuaHRtbCI+NCBJbnRlcm5hbHM8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPk5leHQ6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ic29ja2V0LW1ldGhvZHMuaHRtbCI+NC4zIEFjZXNzaW5nIFNvY2tldCBNZXRob2RzPC9BPgorPGJyPjxocj4KKzwvRElWPgorPCEtLUVuZCBvZiBOYXZpZ2F0aW9uIFBhbmVsLS0+CisKKzxIMj48QSBOQU1FPSJTRUNUSU9OMDAwNTIwMDAwMDAwMDAwMDAwMDAwIj4mbmJzcDs8L0E+Cis8QlI+Cis0LjIgQ2FsbGJhY2tzIAorPC9IMj4KKzxQPgorPEVNPjxFTT48RU0+VGhlcmUgYXJlIGEgbnVtYmVyIG9mIHByb2JsZW1zIHdpdGggY2FsbGJhY2tzLiBGaXJzdCBvZiBhbGwsIE9wZW5TU0wgaXMgd3JpdHRlbgorYXMgYSBDIGxpYnJhcnksIGl0J3Mgbm90IG1lYW50IHRvIGhhdmUgUHl0aG9uIGNhbGxiYWNrcywgc28gYSB3YXkgYXJvdW5kIHRoYXQKK2lzIG5lZWRlZC4gQW5vdGhlciBwcm9ibGVtIGlzIHRocmVhZCBzdXBwb3J0LiBBIGxvdCBvZiB0aGUgT3BlblNTTCBJL08KK2Z1bmN0aW9ucyBjYW4gYmxvY2sgaWYgdGhlIHNvY2tldCBpcyBpbiBibG9ja2luZyBtb2RlLCBhbmQgdGhlbiB5b3Ugd2FudCBvdGhlcgorUHl0aG9uIHRocmVhZHMgdG8gYmUgYWJsZSB0byBkbyBvdGhlciB0aGluZ3MuIFRoZSByZWFsIHRyb3VibGUgaXMgaWYgeW91J3ZlCityZWxlYXNlZCB0aGUgdGhyZWFkIGxvY2sgdG8gZG8gYSBwb3RlbnRpYWxseSBibG9ja2luZyBvcGVyYXRpb24sIGFuZCB0aGUKK29wZXJhdGlvbiBjYWxscyBhIGNhbGxiYWNrLiBUaGVuIHdlIG11c3QgdGFrZSB0aGUgdGhyZWFkIGxvY2sgYmFjazxBIE5BTUU9InRleDJodG1sNiIKKyAgSFJFRj0iI2Zvb3Q5MTYiPjxTVVA+NTwvU1VQPjwvQT4uCis8L0VNPjwvRU0+PC9FTT4KKzxQPgorPEVNPjxFTT48RU0+VGhlcmUgYXJlIHR3byBzb2x1dGlvbnMgdG8gdGhlIGZpcnN0IHByb2JsZW0sIGJvdGggb2Ygd2hpY2ggYXJlIG5lY2Vzc2FyeS4gVGhlCitmaXJzdCBzb2x1dGlvbiB0byB1c2UgaXMgaWYgdGhlIEMgY2FsbGJhY2sgYWxsb3dzICcndXNlcmRhdGEnJyB0byBiZSBwYXNzZWQgdG8KK2l0IChhbiBhcmJpdHJhcnkgcG9pbnRlciBub3JtYWxseSkuIFRoaXMgaXMgZ3JlYXQhIFdlIGNhbiBzZXQgb3VyIFB5dGhvbgorZnVuY3Rpb24gb2JqZWN0IGFzIHRoZSByZWFsIHVzZXJkYXRhIGFuZCBlbXVsYXRlIHVzZXJkYXRhIGZvciB0aGUgUHl0aG9uCitmdW5jdGlvbiBpbiBhbm90aGVyIHdheS4gVGhlIG90aGVyIHNvbHV0aW9uIGNhbiBiZSB1c2VkIGlmIGFuIG9iamVjdCB3aXRoIGFuCisnJ2FwcF9kYXRhJycgc3lzdGVtIGFsd2F5cyBpcyBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLiBGb3IgZXhhbXBsZSwgdGhlIFNTTAorb2JqZWN0IGluIE9wZW5TU0wgaGFzIGFwcF9kYXRhIGZ1bmN0aW9ucyBhbmQgaW4gZS5nLiB0aGUgdmVyaWZpY2F0aW9uCitjYWxsYmFja3MsIHlvdSBjYW4gcmV0cmlldmUgdGhlIHJlbGF0ZWQgU1NMIG9iamVjdC4gV2hhdCB3ZSBkbyBpcyB0byBzZXQgb3VyCit3cmFwcGVyIDx0dCBjbGFzcz0iY2xhc3MiPkNvbm5lY3Rpb248L3R0PiBvYmplY3QgYXMgYXBwX2RhdGEgZm9yIHRoZSBTU0wgb2JqZWN0LCBhbmQgd2UgY2FuCitlYXNpbHkgZmluZCB0aGUgUHl0aG9uIGNhbGxiYWNrLgorPC9FTT48L0VNPjwvRU0+Cis8UD4KKzxFTT48RU0+PEVNPlRoZSBvdGhlciBwcm9ibGVtIGlzIGFsc28gcGFydGlhbGx5IHNvbHZlZCBieSBhcHBfZGF0YS4gU2luY2Ugd2UncmUgYXNzb2NpYXRpbmcKK291ciB3cmFwcGVyIG9iamVjdHMgd2l0aCB0aGUgJydyZWFsJycgb2JqZWN0cywgd2UgY2FuIGVhc2lseSBhY2Nlc3MgZGF0YSBmcm9tCit0aGUgPHR0IGNsYXNzPSJjbGFzcyI+Q29ubmVjdGlvbjwvdHQ+IG9iamVjdC4gVGhlIHNvbHV0aW9uIHRoZW4gaXMgdG8gc2ltcGx5IGluY2x1ZGUgYQorPHR0IGNsYXNzPSJjdHlwZSI+UHlUaHJlYWRTdGF0ZTwvdHQ+IHZhcmlhYmxlIGluIHRoZSA8dHQgY2xhc3M9ImNsYXNzIj5Db25uZWN0aW9uPC90dD4gZGVjbGFyYXRpb24sIGFuZCB3cml0ZQorbWFjcm9zIHNpbWlsYXIgdG8gPHR0IGNsYXNzPSJjZnVuY3Rpb24iPlB5X0JFR0lOX0FMTE9XX1RIUkVBRFM8L3R0PiBhbmQKKzx0dCBjbGFzcz0iY2Z1bmN0aW9uIj5QeV9FTkRfQUxMT1dfVEhSRUFEUzwvdHQ+IHRoYXQgYWxsb3dzIHNwZWNpZnlpbmcgb2YgdGhlCis8dHQgY2xhc3M9ImN0eXBlIj5QeVRocmVhZFN0YXRlPC90dD4gdmFyaWFibGUgdG8gdXNlLiBOb3cgd2UgY2FuIHNpbXBseSAnJ2JlZ2luIGFsbG93Cit0aHJlYWRzJycgYmVmb3JlIGEgcG90ZW50aWFsbHkgYmxvY2tpbmcgb3BlcmF0aW9uLCBhbmQgJydlbmQgYWxsb3cgdGhyZWFkcycnCitiZWZvcmUgY2FsbGluZyBhIGNhbGxiYWNrLgorPC9FTT48L0VNPjwvRU0+Cis8UD4KKzxCUj48SFI+PEg0PkZvb3Rub3RlczwvSDQ+Cis8REw+Cis8RFQ+PEEgTkFNRT0iZm9vdDkxNiI+Li4uIGJhY2s8L0E+PEEKKyBocmVmPSJjYWxsYmFja3MuaHRtbCN0ZXgyaHRtbDYiPjxTVVA+NTwvU1VQPjwvQT48L0RUPgorPEREPkknbQorbm90IHN1cmUgd2h5IHRoaXMgaXMgbmVjZXNzYXJ5LCBidXQgb3RoZXJ3aXNlIEkgZ2V0IGEgc2VnbWVudGF0aW9uIHZpb2xhdGlvbiBvbgorPHR0IGNsYXNzPSJjZnVuY3Rpb24iPlB5RXZhbF9DYWxsT2JqZWN0PC90dD4KKworPC9ERD4KKzwvREw+Cis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzxwPjxocj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJleGNlcHRpb25zLmh0bWwiPjxpbWcgc3JjPSJwcmV2aW91cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iUHJldmlvdXMgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJpbnRlcm5hbHMuaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ic29ja2V0LW1ldGhvZHMuaHRtbCI+PGltZyBzcmM9Im5leHQuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9Ik5leHQgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC90ZD4KKzx0ZD48QSBocmVmPSJjb250ZW50cy5odG1sIj48aW1nIHNyYz0iY29udGVudHMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IkNvbnRlbnRzIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8L3RyPjwvdGFibGU+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlByZXZpb3VzOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImV4Y2VwdGlvbnMuaHRtbCI+NC4xIEV4Y2VwdGlvbnM8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlVwOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImludGVybmFscy5odG1sIj40IEludGVybmFsczwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+TmV4dDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJzb2NrZXQtbWV0aG9kcy5odG1sIj40LjMgQWNlc3NpbmcgU29ja2V0IE1ldGhvZHM8L0E+Cis8aHI+Cis8c3BhbiBjbGFzcz0icmVsZWFzZS1pbmZvIj5SZWxlYXNlIDAuNi48L3NwYW4+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kb2MvaHRtbC9jb250ZW50cy5naWYgYi9kb2MvaHRtbC9jb250ZW50cy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQyOTljNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9odG1sL2NvbnRlbnRzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvaHRtbC9jb250ZW50cy5odG1sIGIvZG9jL2h0bWwvY29udGVudHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWY5ZTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2h0bWwvY29udGVudHMuaHRtbApAQCAtMCwwICsxLDExNCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+Q29udGVudHM8L3RpdGxlPgorPE1FVEEgTkFNRT0iZGVzY3JpcHRpb24iIENPTlRFTlQ9IkNvbnRlbnRzIj4KKzxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJweU9wZW5TU0wiPgorPE1FVEEgTkFNRT0icmVzb3VyY2UtdHlwZSIgQ09OVEVOVD0iZG9jdW1lbnQiPgorPE1FVEEgTkFNRT0iZGlzdHJpYnV0aW9uIiBDT05URU5UPSJnbG9iYWwiPgorPGxpbmsgcmVsPSJTVFlMRVNIRUVUIiBocmVmPSJweU9wZW5TU0wuY3NzIj4KKzxMSU5LIFJFTD0ibmV4dCIgaHJlZj0iaW50cm8uaHRtbCI+Cis8TElOSyBSRUw9InByZXZpb3VzIiBIUkVGPSJweU9wZW5TU0wuaHRtbCI+Cis8TElOSyBSRUw9InVwIiBIUkVGPSJweU9wZW5TU0wuaHRtbCI+Cis8TElOSyBSRUw9Im5leHQiIGhyZWY9ImludHJvLmh0bWwiPgorPC9oZWFkPgorPGJvZHk+Cis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBIUkVGPSJweU9wZW5TU0wuaHRtbCI+PGltZyBzcmM9InByZXZpb3VzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJQcmV2aW91cyBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIEhSRUY9InB5T3BlblNTTC5odG1sIj48aW1nIHNyYz0idXAuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlVwIE9uZSBMZXZlbCIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJpbnRyby5odG1sIj48aW1nIHNyYz0ibmV4dC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iTmV4dCBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj5QeXRob24gT3BlblNTTCBNYW51YWw8L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8L3RyPjwvdGFibGU+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlByZXZpb3VzOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIEhSRUY9InB5T3BlblNTTC5odG1sIj5QeXRob24gT3BlblNTTCBNYW51YWw8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlVwOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIEhSRUY9InB5T3BlblNTTC5odG1sIj5QeXRob24gT3BlblNTTCBNYW51YWw8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPk5leHQ6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0iaW50cm8uaHRtbCI+MSBJbnRyb2R1Y3Rpb248L0E+Cis8YnI+PGhyPgorPC9ESVY+Cis8IS0tRW5kIG9mIE5hdmlnYXRpb24gUGFuZWwtLT4KKzxCUj4KKzxCUj48SDI+PEEgTkFNRT0iU0VDVElPTjAwMDEwMDAwMDAwMDAwMDAwMDAwMCI+CitDb250ZW50czwvQT4KKzwvSDI+Cis8IS0tVGFibGUgb2YgQ29udGVudHMtLT4KKworPFVMIENMQVNTPSJUb2ZDIj4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDQ1IgorICBocmVmPSJpbnRyby5odG1sIj4xIEludHJvZHVjdGlvbiA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWw0NiIKKyAgaHJlZj0iYnVpbGRpbmcuaHRtbCI+MiBCdWlsZGluZyBhbmQgSW5zdGFsbGluZyA8L0E+Cis8VUw+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWw0NyIKKyAgaHJlZj0iYnVpbGRpbmctdW5peC5odG1sIj4yLjEgQnVpbGRpbmcgdGhlIE1vZHVsZSBvbiBhIFVuaXggU3lzdGVtIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDQ4IgorICBocmVmPSJidWlsZGluZy13aW5kb3dzLmh0bWwiPjIuMiBCdWlsZGluZyB0aGUgTW9kdWxlIG9uIGEgV2luZG93cyBTeXN0ZW0gPC9BPgorPC9VTD4KKzxCUj4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDQ5IgorICBocmVmPSJvcGVuc3NsLmh0bWwiPjMgT3BlblNTTCAtLSBQeXRob24gaW50ZXJmYWNlIHRvIE9wZW5TU0wgPC9BPgorPFVMPgorPExJPjxBIE5BTUU9InRleDJodG1sNTAiCisgIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPjMuMSBjcnlwdG8gLS0gR2VuZXJpYyBjcnlwdG9ncmFwaGljIG1vZHVsZSA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWw1MSIKKyAgaHJlZj0ib3BlbnNzbC1yYW5kLmh0bWwiPjMuMiByYW5kIC0tIEFuIGludGVyZmFjZSB0byB0aGUgT3BlblNTTCBwc2V1ZG8gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgPC9BPgorPExJPjxBIE5BTUU9InRleDJodG1sNTIiCisgIGhyZWY9Im9wZW5zc2wtc3NsLmh0bWwiPjMuMyBTU0wgLS0gQW4gaW50ZXJmYWNlIHRvIHRoZSBTU0wtc3BlY2lmaWMgcGFydHMgb2YgT3BlblNTTCA8L0E+Cis8L1VMPgorPEJSPgorPExJPjxBIE5BTUU9InRleDJodG1sNTMiCisgIGhyZWY9ImludGVybmFscy5odG1sIj40IEludGVybmFscyA8L0E+Cis8VUw+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWw1NCIKKyAgaHJlZj0iZXhjZXB0aW9ucy5odG1sIj40LjEgRXhjZXB0aW9ucyA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWw1NSIKKyAgaHJlZj0iY2FsbGJhY2tzLmh0bWwiPjQuMiBDYWxsYmFja3MgPC9BPgorPExJPjxBIE5BTUU9InRleDJodG1sNTYiCisgIGhyZWY9InNvY2tldC1tZXRob2RzLmh0bWwiPjQuMyBBY2Vzc2luZyBTb2NrZXQgTWV0aG9kcyA8L0E+Cis8L1VMPjwvVUw+Cis8IS0tRW5kIG9mIFRhYmxlIG9mIENvbnRlbnRzLS0+Cis8UD4KKworPERJViBDTEFTUz0ibmF2aWdhdGlvbiI+Cis8cD48aHI+Cis8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMiI+Cis8dHI+Cis8dGQ+PEEgSFJFRj0icHlPcGVuU1NMLmh0bWwiPjxpbWcgc3JjPSJwcmV2aW91cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iUHJldmlvdXMgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBIUkVGPSJweU9wZW5TU0wuaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0iaW50cm8uaHRtbCI+PGltZyBzcmM9Im5leHQuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9Ik5leHQgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPC90cj48L3RhYmxlPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5QcmV2aW91czo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBIUkVGPSJweU9wZW5TU0wuaHRtbCI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5VcDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBIUkVGPSJweU9wZW5TU0wuaHRtbCI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImludHJvLmh0bWwiPjEgSW50cm9kdWN0aW9uPC9BPgorPGhyPgorPHNwYW4gY2xhc3M9InJlbGVhc2UtaW5mbyI+UmVsZWFzZSAwLjYuPC9zcGFuPgorPC9ESVY+Cis8IS0tRW5kIG9mIE5hdmlnYXRpb24gUGFuZWwtLT4KKworPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jL2h0bWwvZXhjZXB0aW9ucy5odG1sIGIvZG9jL2h0bWwvZXhjZXB0aW9ucy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljODM0NWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaHRtbC9leGNlcHRpb25zLmh0bWwKQEAgLTAsMCArMSw5NiBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+NC4xIEV4Y2VwdGlvbnMgPC90aXRsZT4KKzxNRVRBIE5BTUU9ImRlc2NyaXB0aW9uIiBDT05URU5UPSI0LjEgRXhjZXB0aW9ucyAiPgorPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9InB5T3BlblNTTCI+Cis8TUVUQSBOQU1FPSJyZXNvdXJjZS10eXBlIiBDT05URU5UPSJkb2N1bWVudCI+Cis8TUVUQSBOQU1FPSJkaXN0cmlidXRpb24iIENPTlRFTlQ9Imdsb2JhbCI+Cis8bGluayByZWw9IlNUWUxFU0hFRVQiIGhyZWY9InB5T3BlblNTTC5jc3MiPgorPExJTksgUkVMPSJuZXh0IiBocmVmPSJjYWxsYmFja3MuaHRtbCI+Cis8TElOSyBSRUw9InByZXZpb3VzIiBocmVmPSJpbnRlcm5hbHMuaHRtbCI+Cis8TElOSyBSRUw9InVwIiBocmVmPSJpbnRlcm5hbHMuaHRtbCI+Cis8TElOSyBSRUw9Im5leHQiIGhyZWY9ImNhbGxiYWNrcy5odG1sIj4KKzwvaGVhZD4KKzxib2R5PgorPERJViBDTEFTUz0ibmF2aWdhdGlvbiI+Cis8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMiI+Cis8dHI+Cis8dGQ+PEEgaHJlZj0iaW50ZXJuYWxzLmh0bWwiPjxpbWcgc3JjPSJwcmV2aW91cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iUHJldmlvdXMgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJpbnRlcm5hbHMuaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0iY2FsbGJhY2tzLmh0bWwiPjxpbWcgc3JjPSJuZXh0LmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJOZXh0IFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvdGQ+Cis8dGQ+PEEgaHJlZj0iY29udGVudHMuaHRtbCI+PGltZyBzcmM9ImNvbnRlbnRzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJDb250ZW50cyIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPC90cj48L3RhYmxlPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5QcmV2aW91czo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJpbnRlcm5hbHMuaHRtbCI+NCBJbnRlcm5hbHM8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlVwOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImludGVybmFscy5odG1sIj40IEludGVybmFsczwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+TmV4dDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJjYWxsYmFja3MuaHRtbCI+NC4yIENhbGxiYWNrczwvQT4KKzxicj48aHI+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorCis8SDI+PEEgTkFNRT0iU0VDVElPTjAwMDUxMDAwMDAwMDAwMDAwMDAwMCI+Jm5ic3A7PC9BPgorPEJSPgorNC4xIEV4Y2VwdGlvbnMgCis8L0gyPgorPFA+Cis8RU0+PEVNPjxFTT5XZSByZWFsaXplZCBlYXJseSB0aGF0IG1vc3Qgb2YgdGhlIGV4Y2VwdGlvbnMgd291bGQgYmUgcmFpc2VkIGJ5IHRoZSBJL08KK2Z1bmN0aW9ucyBvZiBPcGVuU1NMLCBzbyBpdCBmZWx0IG5hdHVyYWwgdG8gbWltaWMgT3BlblNTTCdzIGVycm9yIGNvZGUgc3lzdGVtLAordHJhbnNsYXRpbmcgdGhlbSBpbnRvIFB5dGhvbiBleGNlcHRpb25zLiBUaGlzIG5hdHVyYWxseSBnaXZlcyB1cyB0aGUgZXhjZXB0aW9ucworPHR0IGNsYXNzPSJleGNlcHRpb24iPlNTTC5aZXJvUmV0dXJuRXJyb3I8L3R0PiwgPHR0IGNsYXNzPSJleGNlcHRpb24iPlNTTC5XYW50UmVhZEVycm9yPC90dD4sCis8dHQgY2xhc3M9ImV4Y2VwdGlvbiI+U1NMLldhbnRXcml0ZUVycm9yPC90dD4sIDx0dCBjbGFzcz0iZXhjZXB0aW9uIj5TU0wuV2FudFg1MDlMb29rdXBFcnJvcjwvdHQ+IGFuZAorPHR0IGNsYXNzPSJleGNlcHRpb24iPlNTTC5TeXNDYWxsRXJyb3I8L3R0Pi4KKzwvRU0+PC9FTT48L0VNPgorPFA+Cis8RU0+PEVNPjxFTT5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzLCBzZWUgc2VjdGlvbiA8QSBocmVmPSJvcGVuc3NsLXNzbC5odG1sI29wZW5zc2wtc3NsIj4zLjM8L0E+LgorPC9FTT48L0VNPjwvRU0+Cis8UD4KKworPERJViBDTEFTUz0ibmF2aWdhdGlvbiI+Cis8cD48aHI+Cis8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMiI+Cis8dHI+Cis8dGQ+PEEgaHJlZj0iaW50ZXJuYWxzLmh0bWwiPjxpbWcgc3JjPSJwcmV2aW91cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iUHJldmlvdXMgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJpbnRlcm5hbHMuaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0iY2FsbGJhY2tzLmh0bWwiPjxpbWcgc3JjPSJuZXh0LmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJOZXh0IFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvdGQ+Cis8dGQ+PEEgaHJlZj0iY29udGVudHMuaHRtbCI+PGltZyBzcmM9ImNvbnRlbnRzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJDb250ZW50cyIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPC90cj48L3RhYmxlPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5QcmV2aW91czo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJpbnRlcm5hbHMuaHRtbCI+NCBJbnRlcm5hbHM8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlVwOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImludGVybmFscy5odG1sIj40IEludGVybmFsczwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+TmV4dDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJjYWxsYmFja3MuaHRtbCI+NC4yIENhbGxiYWNrczwvQT4KKzxocj4KKzxzcGFuIGNsYXNzPSJyZWxlYXNlLWluZm8iPlJlbGVhc2UgMC42Ljwvc3Bhbj4KKzwvRElWPgorPCEtLUVuZCBvZiBOYXZpZ2F0aW9uIFBhbmVsLS0+CisKKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvYy9odG1sL2luZGV4LmdpZiBiL2RvYy9odG1sL2luZGV4LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmVlY2ZiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2h0bWwvaW5kZXguZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9odG1sL2luZGV4Lmh0bWwgYi9kb2MvaHRtbC9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzIwZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaHRtbC9pbmRleC5odG1sCkBAIC0wLDAgKzEsMTY3IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT5QeXRob24gT3BlblNTTCBNYW51YWw8L3RpdGxlPgorPE1FVEEgTkFNRT0iZGVzY3JpcHRpb24iIENPTlRFTlQ9IlB5dGhvbiBPcGVuU1NMIE1hbnVhbCI+Cis8TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0icHlPcGVuU1NMIj4KKzxNRVRBIE5BTUU9InJlc291cmNlLXR5cGUiIENPTlRFTlQ9ImRvY3VtZW50Ij4KKzxNRVRBIE5BTUU9ImRpc3RyaWJ1dGlvbiIgQ09OVEVOVD0iZ2xvYmFsIj4KKzxsaW5rIHJlbD0iU1RZTEVTSEVFVCIgaHJlZj0icHlPcGVuU1NMLmNzcyI+Cis8TElOSyBSRUw9Im5leHQiIGhyZWY9ImNvbnRlbnRzLmh0bWwiPgorPC9oZWFkPgorPGJvZHk+Cis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJuZXh0LmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJOZXh0IFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvdGQ+Cis8dGQ+PEEgaHJlZj0iY29udGVudHMuaHRtbCI+PGltZyBzcmM9ImNvbnRlbnRzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJDb250ZW50cyIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPC90cj48L3RhYmxlPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImNvbnRlbnRzLmh0bWwiPkNvbnRlbnRzPC9BPgorPGJyPjxocj4KKzwvRElWPgorPCEtLUVuZCBvZiBOYXZpZ2F0aW9uIFBhbmVsLS0+Cis8UD4KKworPGRpdiBjbGFzcz0idGl0bGVwYWdlIj4KKzxjZW50ZXI+Cis8aDE+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC9oMT4KKzxwPjxiPjxmb250IHNpemU9JysyJz5NYXJ0aW4gU2r2Z3JlbjwvZm9udD48L2I+PC9wPgorPHA+PHNwYW4gY2xhc3M9ImVtYWlsIj5tYXJ0aW5Ac3RyYWt0LmNvbTwvc3Bhbj48L3A+Cis8cD4KKzwvY2VudGVyPgorPC9kaXY+CisKKzxQPgorCis8SDM+QWJzdHJhY3Q6PC9IMz4KKzxESVYgQ0xBU1M9IkFCU1RSQUNUIj4KKworVGhpcyBtb2R1bGUgaXMgYSByYXRoZXIgdGhpbiB3cmFwcGVyIGFyb3VuZCAoYSBzdWJzZXQgb2YpIHRoZSBPcGVuU1NMIGxpYnJhcnkuCitXaXRoIHRoaW4gd3JhcHBlciBJIG1lYW4gdGhhdCBhIGxvdCBvZiB0aGUgb2JqZWN0IG1ldGhvZHMgZG8gbm90aGluZyBtb3JlIHRoYW4KK2NhbGxpbmcgYSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uIGluIHRoZSBPcGVuU1NMIGxpYnJhcnkuCis8L0RJVj4KKzxQPgorCis8UD4KKworPHA+PGhyPgorCis8IS0tVGFibGUgb2YgQ2hpbGQtTGlua3MtLT4KKworCis8VUwgQ0xBU1M9IkNoaWxkTGlua3MiPgorPExJPjxBIE5BTUU9InRleDJodG1sMTAiCisgIGhyZWY9ImNvbnRlbnRzLmh0bWwiPkNvbnRlbnRzPC9BPgorPExJPjxBIE5BTUU9InRleDJodG1sMTEiCisgIGhyZWY9ImludHJvLmh0bWwiPjEgSW50cm9kdWN0aW9uIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDEyIgorICBocmVmPSJidWlsZGluZy5odG1sIj4yIEJ1aWxkaW5nIGFuZCBJbnN0YWxsaW5nIDwvQT4KKzxVTD4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDEzIgorICBocmVmPSJidWlsZGluZy11bml4Lmh0bWwiPjIuMSBCdWlsZGluZyB0aGUgTW9kdWxlIG9uIGEgVW5peCBTeXN0ZW0gPC9BPgorPExJPjxBIE5BTUU9InRleDJodG1sMTQiCisgIGhyZWY9ImJ1aWxkaW5nLXdpbmRvd3MuaHRtbCI+Mi4yIEJ1aWxkaW5nIHRoZSBNb2R1bGUgb24gYSBXaW5kb3dzIFN5c3RlbSA8L0E+Cis8L1VMPgorPEJSPgorPExJPjxBIE5BTUU9InRleDJodG1sMTUiCisgIGhyZWY9Im9wZW5zc2wuaHRtbCI+MyA8dHQgY2xhc3M9Im1vZHVsZSI+T3BlblNTTDwvdHQ+IC0tIFB5dGhvbiBpbnRlcmZhY2UgdG8gT3BlblNTTCA8L0E+Cis8VUw+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwxNiIKKyAgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+My4xIDx0dCBjbGFzcz0ibW9kdWxlIj5jcnlwdG88L3R0PiAtLSBHZW5lcmljIGNyeXB0b2dyYXBoaWMgbW9kdWxlIDwvQT4KKzxVTD4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDE3IgorICBocmVmPSJvcGVuc3NsLXg1MDkuaHRtbCI+My4xLjEgWDUwOSBvYmplY3RzIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDE4IgorICBocmVmPSJvcGVuc3NsLXg1MDluYW1lLmh0bWwiPjMuMS4yIFg1MDlOYW1lIG9iamVjdHMgPC9BPgorPExJPjxBIE5BTUU9InRleDJodG1sMTkiCisgIGhyZWY9Im9wZW5zc2wteDUwOXJlcS5odG1sIj4zLjEuMyBYNTA5UmVxIG9iamVjdHMgPC9BPgorPExJPjxBIE5BTUU9InRleDJodG1sMjAiCisgIGhyZWY9Im9wZW5zc2wteDUwOXN0b3JlLmh0bWwiPjMuMS40IFg1MDlTdG9yZSBvYmplY3RzIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDIxIgorICBocmVmPSJvcGVuc3NsLXBrZXkuaHRtbCI+My4xLjUgUEtleSBvYmplY3RzIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDIyIgorICBocmVmPSJvcGVuc3NsLXBrY3M3Lmh0bWwiPjMuMS42IFBLQ1M3IG9iamVjdHMgPC9BPgorPExJPjxBIE5BTUU9InRleDJodG1sMjMiCisgIGhyZWY9Im9wZW5zc2wtcGtjczEyLmh0bWwiPjMuMS43IFBLQ1MxMiBvYmplY3RzIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDI0IgorICBocmVmPSJvcGVuc3NsLTUwOWV4dC5odG1sIj4zLjEuOCBYNTA5RXh0ZW5zaW9uIG9iamVjdHMgPC9BPgorPExJPjxBIE5BTUU9InRleDJodG1sMjUiCisgIGhyZWY9Im9wZW5zc2wtbmV0c2NhcGUtc3BraS5odG1sIj4zLjEuOSBOZXRzY2FwZVNQS0kgb2JqZWN0cyA8L0E+Cis8L1VMPgorPExJPjxBIE5BTUU9InRleDJodG1sMjYiCisgIGhyZWY9Im9wZW5zc2wtcmFuZC5odG1sIj4zLjIgPHR0IGNsYXNzPSJtb2R1bGUiPnJhbmQ8L3R0PiAtLSBBbiBpbnRlcmZhY2UgdG8gdGhlIE9wZW5TU0wgcHNldWRvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDI3IgorICBocmVmPSJvcGVuc3NsLXNzbC5odG1sIj4zLjMgPHR0IGNsYXNzPSJtb2R1bGUiPlNTTDwvdHQ+IC0tIEFuIGludGVyZmFjZSB0byB0aGUgU1NMLXNwZWNpZmljIHBhcnRzIG9mIE9wZW5TU0wgPC9BPgorPFVMPgorPExJPjxBIE5BTUU9InRleDJodG1sMjgiCisgIGhyZWY9Im9wZW5zc2wtY29udGV4dC5odG1sIj4zLjMuMSBDb250ZXh0IG9iamVjdHMgPC9BPgorPExJPjxBIE5BTUU9InRleDJodG1sMjkiCisgIGhyZWY9Im9wZW5zc2wtY29ubmVjdGlvbi5odG1sIj4zLjMuMiBDb25uZWN0aW9uIG9iamVjdHMgPC9BPgorPC9VTD4KKzwvVUw+Cis8QlI+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwzMCIKKyAgaHJlZj0iaW50ZXJuYWxzLmh0bWwiPjQgSW50ZXJuYWxzIDwvQT4KKzxVTD4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDMxIgorICBocmVmPSJleGNlcHRpb25zLmh0bWwiPjQuMSBFeGNlcHRpb25zIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDMyIgorICBocmVmPSJjYWxsYmFja3MuaHRtbCI+NC4yIENhbGxiYWNrcyA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwzMyIKKyAgaHJlZj0ic29ja2V0LW1ldGhvZHMuaHRtbCI+NC4zIEFjZXNzaW5nIFNvY2tldCBNZXRob2RzIDwvQT4KKzwvVUw+Cis8QlI+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwzNCIKKyAgaHJlZj0iYWJvdXQuaHRtbCI+QWJvdXQgdGhpcyBkb2N1bWVudCAuLi48L0E+Cis8L1VMPgorPCEtLUVuZCBvZiBUYWJsZSBvZiBDaGlsZC1MaW5rcy0tPgorCis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzxwPjxocj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJuZXh0LmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJOZXh0IFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvdGQ+Cis8dGQ+PEEgaHJlZj0iY29udGVudHMuaHRtbCI+PGltZyBzcmM9ImNvbnRlbnRzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJDb250ZW50cyIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPC90cj48L3RhYmxlPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImNvbnRlbnRzLmh0bWwiPkNvbnRlbnRzPC9BPgorPGhyPgorPHNwYW4gY2xhc3M9InJlbGVhc2UtaW5mbyI+UmVsZWFzZSAwLjYuPC9zcGFuPgorPC9ESVY+Cis8IS0tRW5kIG9mIE5hdmlnYXRpb24gUGFuZWwtLT4KKworPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jL2h0bWwvaW50ZXJuYWxzLmh0bWwgYi9kb2MvaHRtbC9pbnRlcm5hbHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWNmYjVkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2h0bWwvaW50ZXJuYWxzLmh0bWwKQEAgLTAsMCArMSwxMDMgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPjQgSW50ZXJuYWxzIDwvdGl0bGU+Cis8TUVUQSBOQU1FPSJkZXNjcmlwdGlvbiIgQ09OVEVOVD0iNCBJbnRlcm5hbHMgIj4KKzxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJweU9wZW5TU0wiPgorPE1FVEEgTkFNRT0icmVzb3VyY2UtdHlwZSIgQ09OVEVOVD0iZG9jdW1lbnQiPgorPE1FVEEgTkFNRT0iZGlzdHJpYnV0aW9uIiBDT05URU5UPSJnbG9iYWwiPgorPGxpbmsgcmVsPSJTVFlMRVNIRUVUIiBocmVmPSJweU9wZW5TU0wuY3NzIj4KKzxMSU5LIFJFTD0ibmV4dCIgaHJlZj0iYWJvdXQuaHRtbCI+Cis8TElOSyBSRUw9InByZXZpb3VzIiBocmVmPSJvcGVuc3NsLmh0bWwiPgorPExJTksgUkVMPSJ1cCIgSFJFRj0icHlPcGVuU1NMLmh0bWwiPgorPExJTksgUkVMPSJuZXh0IiBocmVmPSJleGNlcHRpb25zLmh0bWwiPgorPC9oZWFkPgorPGJvZHk+Cis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLWNvbm5lY3Rpb24uaHRtbCI+PGltZyBzcmM9InByZXZpb3VzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJQcmV2aW91cyBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIEhSRUY9InB5T3BlblNTTC5odG1sIj48aW1nIHNyYz0idXAuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlVwIE9uZSBMZXZlbCIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJleGNlcHRpb25zLmh0bWwiPjxpbWcgc3JjPSJuZXh0LmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJOZXh0IFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvdGQ+Cis8dGQ+PEEgaHJlZj0iY29udGVudHMuaHRtbCI+PGltZyBzcmM9ImNvbnRlbnRzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJDb250ZW50cyIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPC90cj48L3RhYmxlPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5QcmV2aW91czo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLWNvbm5lY3Rpb24uaHRtbCI+My4zLjIgQ29ubmVjdGlvbiBvYmplY3RzPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5VcDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBIUkVGPSJweU9wZW5TU0wuaHRtbCI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImV4Y2VwdGlvbnMuaHRtbCI+NC4xIEV4Y2VwdGlvbnM8L0E+Cis8YnI+PGhyPgorPC9ESVY+Cis8IS0tRW5kIG9mIE5hdmlnYXRpb24gUGFuZWwtLT4KKzxIMT48QSBOQU1FPSJTRUNUSU9OMDAwNTAwMDAwMDAwMDAwMDAwMDAwIj4mbmJzcDs8L0E+Cis8QlI+Cis0IEludGVybmFscyAKKzwvSDE+Cis8UD4KKzxFTT48RU0+PEVNPldlIHJhbiBpbnRvIHRocmVlIG1haW4gcHJvYmxlbXMgZGV2ZWxvcGluZyB0aGlzOiBFeGNlcHRpb25zLCBjYWxsYmFja3MgYW5kCithY2Nlc3Npbmcgc29ja2V0IG1ldGhvZHMuIFRoaXMgaXMgd2hhdCB0aGlzIGNoYXB0ZXIgaXMgYWJvdXQuCis8L0VNPjwvRU0+PC9FTT4KKzxQPgorCis8cD48aHI+CisKKzwhLS1UYWJsZSBvZiBDaGlsZC1MaW5rcy0tPgorPEEgTkFNRT0iQ0hJTERfTElOS1MiPjxTVFJPTkc+U3Vic2VjdGlvbnM8L1NUUk9ORz48L0E+CisKKzxVTCBDTEFTUz0iQ2hpbGRMaW5rcyI+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwyOTYiCisgIGhyZWY9ImV4Y2VwdGlvbnMuaHRtbCI+NC4xIEV4Y2VwdGlvbnMgPC9BPgorPExJPjxBIE5BTUU9InRleDJodG1sMjk3IgorICBocmVmPSJjYWxsYmFja3MuaHRtbCI+NC4yIENhbGxiYWNrcyA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwyOTgiCisgIGhyZWY9InNvY2tldC1tZXRob2RzLmh0bWwiPjQuMyBBY2Vzc2luZyBTb2NrZXQgTWV0aG9kcyA8L0E+Cis8L1VMPgorPCEtLUVuZCBvZiBUYWJsZSBvZiBDaGlsZC1MaW5rcy0tPgorCis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzxwPjxocj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLWNvbm5lY3Rpb24uaHRtbCI+PGltZyBzcmM9InByZXZpb3VzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJQcmV2aW91cyBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIEhSRUY9InB5T3BlblNTTC5odG1sIj48aW1nIHNyYz0idXAuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlVwIE9uZSBMZXZlbCIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJleGNlcHRpb25zLmh0bWwiPjxpbWcgc3JjPSJuZXh0LmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJOZXh0IFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvdGQ+Cis8dGQ+PEEgaHJlZj0iY29udGVudHMuaHRtbCI+PGltZyBzcmM9ImNvbnRlbnRzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJDb250ZW50cyIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPC90cj48L3RhYmxlPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5QcmV2aW91czo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLWNvbm5lY3Rpb24uaHRtbCI+My4zLjIgQ29ubmVjdGlvbiBvYmplY3RzPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5VcDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBIUkVGPSJweU9wZW5TU0wuaHRtbCI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImV4Y2VwdGlvbnMuaHRtbCI+NC4xIEV4Y2VwdGlvbnM8L0E+Cis8aHI+Cis8c3BhbiBjbGFzcz0icmVsZWFzZS1pbmZvIj5SZWxlYXNlIDAuNi48L3NwYW4+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kb2MvaHRtbC9pbnRyby5odG1sIGIvZG9jL2h0bWwvaW50cm8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2YzNzk3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2h0bWwvaW50cm8uaHRtbApAQCAtMCwwICsxLDExOCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+MSBJbnRyb2R1Y3Rpb24gPC90aXRsZT4KKzxNRVRBIE5BTUU9ImRlc2NyaXB0aW9uIiBDT05URU5UPSIxIEludHJvZHVjdGlvbiAiPgorPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9InB5T3BlblNTTCI+Cis8TUVUQSBOQU1FPSJyZXNvdXJjZS10eXBlIiBDT05URU5UPSJkb2N1bWVudCI+Cis8TUVUQSBOQU1FPSJkaXN0cmlidXRpb24iIENPTlRFTlQ9Imdsb2JhbCI+Cis8bGluayByZWw9IlNUWUxFU0hFRVQiIGhyZWY9InB5T3BlblNTTC5jc3MiPgorPExJTksgUkVMPSJuZXh0IiBocmVmPSJidWlsZGluZy5odG1sIj4KKzxMSU5LIFJFTD0icHJldmlvdXMiIGhyZWY9ImNvbnRlbnRzLmh0bWwiPgorPExJTksgUkVMPSJ1cCIgSFJFRj0icHlPcGVuU1NMLmh0bWwiPgorPExJTksgUkVMPSJuZXh0IiBocmVmPSJidWlsZGluZy5odG1sIj4KKzwvaGVhZD4KKzxib2R5PgorPERJViBDTEFTUz0ibmF2aWdhdGlvbiI+Cis8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMiI+Cis8dHI+Cis8dGQ+PEEgaHJlZj0iY29udGVudHMuaHRtbCI+PGltZyBzcmM9InByZXZpb3VzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJQcmV2aW91cyBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIEhSRUY9InB5T3BlblNTTC5odG1sIj48aW1nIHNyYz0idXAuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlVwIE9uZSBMZXZlbCIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJidWlsZGluZy5odG1sIj48aW1nIHNyYz0ibmV4dC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iTmV4dCBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj5QeXRob24gT3BlblNTTCBNYW51YWw8L3RkPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJjb250ZW50cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iQ29udGVudHMiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzwvdHI+PC90YWJsZT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+UHJldmlvdXM6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0iY29udGVudHMuaHRtbCI+Q29udGVudHM8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlVwOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIEhSRUY9InB5T3BlblNTTC5odG1sIj5QeXRob24gT3BlblNTTCBNYW51YWw8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPk5leHQ6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0iYnVpbGRpbmcuaHRtbCI+MiBCdWlsZGluZyBhbmQgSW5zdGFsbGluZzwvQT4KKzxicj48aHI+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorCis8SDE+PEEgTkFNRT0iU0VDVElPTjAwMDIwMDAwMDAwMDAwMDAwMDAwMCI+Jm5ic3A7PC9BPgorPEJSPgorMSBJbnRyb2R1Y3Rpb24gCis8L0gxPgorCis8UD4KK1RoZSByZWFzb24gdGhpcyBtb2R1bGUgZXhpc3RzIGF0IGFsbCBpcyB0aGF0IHRoZSBTU0wgc3VwcG9ydCBpbiB0aGUgc29ja2V0Cittb2R1bGUgaW4gdGhlIFB5dGhvbiAyLjEgZGlzdHJpYnV0aW9uICh3aGljaCBpcyB3aGF0IHdlIHVzZWQsIG9mIGNvdXJzZSBJCitjYW5ub3Qgc3BlYWsgZm9yIGxhdGVyIHZlcnNpb25zKSBpcyBzZXZlcmVseSBsaW1pdGVkLgorCis8UD4KK1doZW4gYXNraW5nIGFib3V0IFNTTCBvbiB0aGUgY29tcC5sYW5nLnB5dGhvbiBuZXdzZ3JvdXAgKG9yIG9uCitweXRob24tbGlzdEBweXRob24ub3JnKSBwZW9wbGUgdXN1YWxseSBwb2ludGVkIHlvdSB0byB0aGUgTTJDcnlwdG8gcGFja2FnZS4KK1RoZSBNMkNyeXB0by5TU0wgbW9kdWxlIGRvZXMgaW1wbGVtZW50IGEgbG90IG9mIE9wZW5TU0wncyBmdW5jdGlvbmFsaXR5IGJ1dAordW5mb3J0dW5hdGVseSBpdHMgZXJyb3IgaGFuZGxpbmcgc3lzdGVtIGRvZXMgbm90IHNlZW0gdG8gYmUgZmluaXNoZWQsCitlc3BlY2lhbGx5IGZvciBub24tYmxvY2tpbmcgSS9PLiAgSSB0aGluayB0aGF0IG11Y2ggb2YgdGhlIHJlYXNvbiBmb3IgdGhpcworaXMgdGhhdCBNMkNyeXB0bzxBIE5BTUU9InRleDJodG1sMSIKKyAgSFJFRj0iI2Zvb3Q4NzYiPjxTVVA+MTwvU1VQPjwvQT4gaXMKK2RldmVsb3BlZCB1c2luZyBTV0lHPEEgTkFNRT0idGV4Mmh0bWwyIgorICBIUkVGPSIjZm9vdDg3NyI+PFNVUD4yPC9TVVA+PC9BPi4gIFRoaXMKK21ha2VzIGl0IGF3a3dhcmQgdG8gY3JlYXRlIGZ1bmN0aW9ucyB0aGF0IGUuZy4gY2FuIHJldHVybiBib3RoIGFuIGludGVnZXIgYW5kCitOVUxMIHNpbmNlIChhcyBmYXIgYXMgSSBrbm93KSB5b3UgYmFzaWNhbGx5IHdyaXRlIEMgZnVuY3Rpb25zIGFuZCBTV0lHIG1ha2VzCit3cmFwcGVyIGZ1bmN0aW9ucyB0aGF0IHBhcnNlcyB0aGUgUHl0aG9uIGFyZ3VtZW50IGxpc3QgYW5kIGNhbGxzIHlvdXIgQworZnVuY3Rpb24sIGFuZCBmaW5hbGx5IHRyYW5zZm9ybXMgeW91ciByZXR1cm4gdmFsdWUgdG8gYSBQeXRob24gb2JqZWN0LgorCis8UD4KKzxCUj48SFI+PEg0PkZvb3Rub3RlczwvSDQ+Cis8REw+Cis8RFQ+PEEgTkFNRT0iZm9vdDg3NiI+Li4uIE0yQ3J5cHRvPC9BPjxBCisgaHJlZj0iaW50cm8uaHRtbCN0ZXgyaHRtbDEiPjxTVVA+MTwvU1VQPjwvQT48L0RUPgorPEREPlNlZSA8YSBjbGFzcz0idXJsIiBocmVmPSJodHRwOi8vd3d3LnBvc3QxLmNvbS9ob21lL25ncHMvbTIvIj5odHRwOi8vd3d3LnBvc3QxLmNvbS9ob21lL25ncHMvbTIvPC9hPgorCis8L0REPgorPERUPjxBIE5BTUU9ImZvb3Q4NzciPi4uLiBTV0lHPC9BPjxBCisgaHJlZj0iaW50cm8uaHRtbCN0ZXgyaHRtbDIiPjxTVVA+MjwvU1VQPjwvQT48L0RUPgorPEREPlNlZSA8YSBjbGFzcz0idXJsIiBocmVmPSJodHRwOi8vc3dpZy5zb3VyY2Vmb3JnZS5uZXQvIj5odHRwOi8vc3dpZy5zb3VyY2Vmb3JnZS5uZXQvPC9hPgorCis8L0REPgorPC9ETD4KKzxESVYgQ0xBU1M9Im5hdmlnYXRpb24iPgorPHA+PGhyPgorPHRhYmxlIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjIiPgorPHRyPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJwcmV2aW91cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iUHJldmlvdXMgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBIUkVGPSJweU9wZW5TU0wuaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0iYnVpbGRpbmcuaHRtbCI+PGltZyBzcmM9Im5leHQuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9Ik5leHQgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC90ZD4KKzx0ZD48QSBocmVmPSJjb250ZW50cy5odG1sIj48aW1nIHNyYz0iY29udGVudHMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IkNvbnRlbnRzIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8L3RyPjwvdGFibGU+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlByZXZpb3VzOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImNvbnRlbnRzLmh0bWwiPkNvbnRlbnRzPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5VcDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBIUkVGPSJweU9wZW5TU0wuaHRtbCI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImJ1aWxkaW5nLmh0bWwiPjIgQnVpbGRpbmcgYW5kIEluc3RhbGxpbmc8L0E+Cis8aHI+Cis8c3BhbiBjbGFzcz0icmVsZWFzZS1pbmZvIj5SZWxlYXNlIDAuNi48L3NwYW4+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kb2MvaHRtbC9tb2R1bGVzLmdpZiBiL2RvYy9odG1sL21vZHVsZXMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ODYwYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaHRtbC9tb2R1bGVzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvaHRtbC9uZXh0LmdpZiBiL2RvYy9odG1sL25leHQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkY2FmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaHRtbC9uZXh0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvaHRtbC9vcGVuc3NsLTUwOWV4dC5odG1sIGIvZG9jL2h0bWwvb3BlbnNzbC01MDlleHQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWE4YTNiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2h0bWwvb3BlbnNzbC01MDlleHQuaHRtbApAQCAtMCwwICsxLDkzIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT4zLjEuOCBYNTA5RXh0ZW5zaW9uIG9iamVjdHMgPC90aXRsZT4KKzxNRVRBIE5BTUU9ImRlc2NyaXB0aW9uIiBDT05URU5UPSIzLjEuOCBYNTA5RXh0ZW5zaW9uIG9iamVjdHMgIj4KKzxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJweU9wZW5TU0wiPgorPE1FVEEgTkFNRT0icmVzb3VyY2UtdHlwZSIgQ09OVEVOVD0iZG9jdW1lbnQiPgorPE1FVEEgTkFNRT0iZGlzdHJpYnV0aW9uIiBDT05URU5UPSJnbG9iYWwiPgorPGxpbmsgcmVsPSJTVFlMRVNIRUVUIiBocmVmPSJweU9wZW5TU0wuY3NzIj4KKzxMSU5LIFJFTD0ibmV4dCIgaHJlZj0ib3BlbnNzbC1uZXRzY2FwZS1zcGtpLmh0bWwiPgorPExJTksgUkVMPSJwcmV2aW91cyIgaHJlZj0ib3BlbnNzbC1wa2NzMTIuaHRtbCI+Cis8TElOSyBSRUw9InVwIiBocmVmPSJvcGVuc3NsLWNyeXB0by5odG1sIj4KKzxMSU5LIFJFTD0ibmV4dCIgaHJlZj0ib3BlbnNzbC1uZXRzY2FwZS1zcGtpLmh0bWwiPgorPC9oZWFkPgorPGJvZHk+Cis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLXBrY3MxMi5odG1sIj48aW1nIHNyYz0icHJldmlvdXMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlByZXZpb3VzIFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1uZXRzY2FwZS1zcGtpLmh0bWwiPjxpbWcgc3JjPSJuZXh0LmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJOZXh0IFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvdGQ+Cis8dGQ+PEEgaHJlZj0iY29udGVudHMuaHRtbCI+PGltZyBzcmM9ImNvbnRlbnRzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJDb250ZW50cyIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPC90cj48L3RhYmxlPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5QcmV2aW91czo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLXBrY3MxMi5odG1sIj4zLjEuNyBQS0NTMTIgb2JqZWN0czwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+VXA6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+My4xIGNyeXB0byAgPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wtbmV0c2NhcGUtc3BraS5odG1sIj4zLjEuOSBOZXRzY2FwZVNQS0kgb2JqZWN0czwvQT4KKzxicj48aHI+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorCis8SDM+PEEgTkFNRT0iU0VDVElPTjAwMDQxODAwMDAwMDAwMDAwMDAwMCI+Jm5ic3A7PC9BPgorPEJSPgorMy4xLjggWDUwOUV4dGVuc2lvbiBvYmplY3RzIAorPC9IMz4KKzxQPgorPEVNPjxFTT48RU0+WDUwOUV4dGVuc2lvbiBvYmplY3RzIGN1cnJlbnRseSBvbmx5IGhhdmUgb25lIG1ldGhvZDoKKzwvRU0+PC9FTT48L0VNPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC03NSc+PHR0IGNsYXNzPSdtZXRob2QnPmdldF9jcml0aWNhbDwvdHQ+PC9hPjwvYj4oKQorPGRkPgorUmV0dXJuIHRoZSBjcml0aWNhbCBmaWVsZCBvZiB0aGUgZXh0ZW5zaW9uIG9iamVjdC4KKzwvZGw+Cis8UD4KKworPERJViBDTEFTUz0ibmF2aWdhdGlvbiI+Cis8cD48aHI+Cis8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMiI+Cis8dHI+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1wa2NzMTIuaHRtbCI+PGltZyBzcmM9InByZXZpb3VzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJQcmV2aW91cyBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPjxpbWcgc3JjPSJ1cC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iVXAgT25lIExldmVsIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtbmV0c2NhcGUtc3BraS5odG1sIj48aW1nIHNyYz0ibmV4dC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iTmV4dCBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj5QeXRob24gT3BlblNTTCBNYW51YWw8L3RkPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJjb250ZW50cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iQ29udGVudHMiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzwvdHI+PC90YWJsZT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+UHJldmlvdXM6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1wa2NzMTIuaHRtbCI+My4xLjcgUEtDUzEyIG9iamVjdHM8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlVwOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPjMuMSBjcnlwdG8gIDwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+TmV4dDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLW5ldHNjYXBlLXNwa2kuaHRtbCI+My4xLjkgTmV0c2NhcGVTUEtJIG9iamVjdHM8L0E+Cis8aHI+Cis8c3BhbiBjbGFzcz0icmVsZWFzZS1pbmZvIj5SZWxlYXNlIDAuNi48L3NwYW4+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kb2MvaHRtbC9vcGVuc3NsLWNvbm5lY3Rpb24uaHRtbCBiL2RvYy9odG1sL29wZW5zc2wtY29ubmVjdGlvbi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NzU5MTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaHRtbC9vcGVuc3NsLWNvbm5lY3Rpb24uaHRtbApAQCAtMCwwICsxLDI2NCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+My4zLjIgQ29ubmVjdGlvbiBvYmplY3RzIDwvdGl0bGU+Cis8TUVUQSBOQU1FPSJkZXNjcmlwdGlvbiIgQ09OVEVOVD0iMy4zLjIgQ29ubmVjdGlvbiBvYmplY3RzICI+Cis8TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0icHlPcGVuU1NMIj4KKzxNRVRBIE5BTUU9InJlc291cmNlLXR5cGUiIENPTlRFTlQ9ImRvY3VtZW50Ij4KKzxNRVRBIE5BTUU9ImRpc3RyaWJ1dGlvbiIgQ09OVEVOVD0iZ2xvYmFsIj4KKzxsaW5rIHJlbD0iU1RZTEVTSEVFVCIgaHJlZj0icHlPcGVuU1NMLmNzcyI+Cis8TElOSyBSRUw9InByZXZpb3VzIiBocmVmPSJvcGVuc3NsLWNvbnRleHQuaHRtbCI+Cis8TElOSyBSRUw9InVwIiBocmVmPSJvcGVuc3NsLXNzbC5odG1sIj4KKzxMSU5LIFJFTD0ibmV4dCIgaHJlZj0iaW50ZXJuYWxzLmh0bWwiPgorPC9oZWFkPgorPGJvZHk+Cis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLWNvbnRleHQuaHRtbCI+PGltZyBzcmM9InByZXZpb3VzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJQcmV2aW91cyBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtc3NsLmh0bWwiPjxpbWcgc3JjPSJ1cC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iVXAgT25lIExldmVsIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9ImludGVybmFscy5odG1sIj48aW1nIHNyYz0ibmV4dC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iTmV4dCBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj5QeXRob24gT3BlblNTTCBNYW51YWw8L3RkPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJjb250ZW50cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iQ29udGVudHMiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzwvdHI+PC90YWJsZT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+UHJldmlvdXM6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1jb250ZXh0Lmh0bWwiPjMuMy4xIENvbnRleHQgb2JqZWN0czwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+VXA6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1zc2wuaHRtbCI+My4zIFNTTCAgPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImludGVybmFscy5odG1sIj40IEludGVybmFsczwvQT4KKzxicj48aHI+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorCis8SDM+PEEgTkFNRT0iU0VDVElPTjAwMDQzMjAwMDAwMDAwMDAwMDAwMCI+Jm5ic3A7PC9BPgorPEJSPgorMy4zLjIgQ29ubmVjdGlvbiBvYmplY3RzIAorPC9IMz4KKzxQPgorPEVNPjxFTT48RU0+Q29ubmVjdGlvbiBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorPC9FTT48L0VNPjwvRU0+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTEzNyc+PHR0IGNsYXNzPSdtZXRob2QnPmFjY2VwdDwvdHQ+PC9hPjwvYj4oKQorPGRkPgorQ2FsbCB0aGUgPHR0IGNsYXNzPSJtZXRob2QiPmFjY2VwdDwvdHQ+IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQgYW5kIHNldCB1cCBTU0wgb24gdGhlCityZXR1cm5lZCBzb2NrZXQsIHVzaW5nIHRoZSBDb250ZXh0IG9iamVjdCBzdXBwbGllZCB0byB0aGlzIENvbm5lY3Rpb24gb2JqZWN0IGF0CitjcmVhdGlvbi4gUmV0dXJucyBhIHBhaXIgPGNvZGU+KDx2YXI+Y29ubjwvdmFyPiwgPHZhcj5hZGRyZXNzPC92YXI+KTwvY29kZT4uIHdoZXJlIDx2YXI+Y29ubjwvdmFyPgoraXMgdGhlIG5ldyBDb25uZWN0aW9uIG9iamVjdCBjcmVhdGVkLCBhbmQgPHZhcj5hZGRyZXNzPC92YXI+IGlzIGFzIHJldHVybmVkIGJ5IHRoZQorc29ja2V0J3MgPHR0IGNsYXNzPSJtZXRob2QiPmFjY2VwdDwvdHQ+LgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTM4Jz48dHQgY2xhc3M9J21ldGhvZCc+YmluZDwvdHQ+PC9hPjwvYj4oPHZhcj5hZGRyZXNzPC92YXI+KQorPGRkPgorQ2FsbCB0aGUgPHR0IGNsYXNzPSJtZXRob2QiPmJpbmQ8L3R0PiBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTM5Jz48dHQgY2xhc3M9J21ldGhvZCc+Y2xvc2U8L3R0PjwvYT48L2I+KCkKKzxkZD4KK0NhbGwgdGhlIDx0dCBjbGFzcz0ibWV0aG9kIj5jbG9zZTwvdHQ+IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuIE5vdGU6IElmIHlvdSB3YW50Citjb3JyZWN0IFNTTCBjbG9zdXJlLCB5b3UgbmVlZCB0byBjYWxsIHRoZSA8dHQgY2xhc3M9Im1ldGhvZCI+c2h1dGRvd248L3R0PiBtZXRob2QgZmlyc3QuCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xNDAnPjx0dCBjbGFzcz0nbWV0aG9kJz5jb25uZWN0PC90dD48L2E+PC9iPig8dmFyPmFkZHJlc3M8L3Zhcj4pCis8ZGQ+CitDYWxsIHRoZSA8dHQgY2xhc3M9Im1ldGhvZCI+Y29ubmVjdDwvdHQ+IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQgYW5kIHNldCB1cCBTU0wgb24gdGhlCitzb2NrZXQsIHVzaW5nIHRoZSBDb250ZXh0IG9iamVjdCBzdXBwbGllZCB0byB0aGlzIENvbm5lY3Rpb24gb2JqZWN0IGF0CitjcmVhdGlvbi4KKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTE0MSc+PHR0IGNsYXNzPSdtZXRob2QnPmNvbm5lY3RfZXg8L3R0PjwvYT48L2I+KDx2YXI+YWRkcmVzczwvdmFyPikKKzxkZD4KK0NhbGwgdGhlIDx0dCBjbGFzcz0ibWV0aG9kIj5jb25uZWN0X2V4PC90dD4gbWV0aG9kIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBhbmQgc2V0IHVwIFNTTCBvbgordGhlIHNvY2tldCwgdXNpbmcgdGhlIENvbnRleHQgb2JqZWN0IHN1cHBsaWVkIHRvIHRoaXMgQ29ubmVjdGlvbiBvYmplY3QgYXQKK2NyZWF0aW9uLiBOb3RlIHRoYXQgaWYgdGhlIDx0dCBjbGFzcz0ibWV0aG9kIj5jb25uZWN0X2V4PC90dD4gbWV0aG9kIG9mIHRoZSBzb2NrZXQgZG9lc24ndAorcmV0dXJuIDAsIFNTTCB3b24ndCBiZSBpbml0aWFsaXplZC4KKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTE0Mic+PHR0IGNsYXNzPSdtZXRob2QnPmRvX2hhbmRzaGFrZTwvdHQ+PC9hPjwvYj4oKQorPGRkPgorUGVyZm9ybSBhbiBTU0wgaGFuZHNoYWtlICh1c3VhbGx5IGNhbGxlZCBhZnRlciA8dHQgY2xhc3M9Im1ldGhvZCI+cmVuZWdvdGlhdGU8L3R0PiBvciBvbmUgb2YKKzx0dCBjbGFzcz0ibWV0aG9kIj5zZXRfYWNjZXB0X3N0YXRlPC90dD4gb3IgPHR0IGNsYXNzPSJtZXRob2QiPnNldF9hY2NlcHRfc3RhdGU8L3R0PikuIFRoaXMgY2FuIHJhaXNlIHRoZQorc2FtZSBleGNlcHRpb25zIGFzIDx0dCBjbGFzcz0ibWV0aG9kIj5zZW5kPC90dD4gYW5kIDx0dCBjbGFzcz0ibWV0aG9kIj5yZWN2PC90dD4uCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xNDMnPjx0dCBjbGFzcz0nbWV0aG9kJz5maWxlbm88L3R0PjwvYT48L2I+KCkKKzxkZD4KK1JldHJpZXZlIHRoZSBmaWxlIGRlc2NyaXB0b3IgbnVtYmVyIGZvciB0aGUgdW5kZXJseWluZyBzb2NrZXQuCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xNDQnPjx0dCBjbGFzcz0nbWV0aG9kJz5saXN0ZW48L3R0PjwvYT48L2I+KDx2YXI+YmFja2xvZzwvdmFyPikKKzxkZD4KK0NhbGwgdGhlIDx0dCBjbGFzcz0ibWV0aG9kIj5saXN0ZW48L3R0PiBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTQ1Jz48dHQgY2xhc3M9J21ldGhvZCc+Z2V0X2FwcF9kYXRhPC90dD48L2E+PC9iPigpCis8ZGQ+CitSZXRyaWV2ZSBhcHBsaWNhdGlvbiBkYXRhIGFzIHNldCBieSA8dHQgY2xhc3M9Im1ldGhvZCI+c2V0X2FwcF9kYXRhPC90dD4uCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xNDYnPjx0dCBjbGFzcz0nbWV0aG9kJz5nZXRfY2lwaGVyX2xpc3Q8L3R0PjwvYT48L2I+KCkKKzxkZD4KK1JldHJpZXZlIHRoZSBsaXN0IG9mIGNpcGhlcnMgdXNlZCBieSB0aGUgQ29ubmVjdGlvbiBvYmplY3QuIFdBUk5JTkc6IFRoaXMgQVBJCitoYXMgY2hhbmdlZC4gSXQgdXNlZCB0byB0YWtlIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBhbmQganVzdCByZXR1cm4gYSBzdHJpbmcsCitidXQgbm90IGl0IHJldHVybnMgdGhlIGVudGlyZSBsaXN0IGluIG9uZSBnby4KKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTE0Nyc+PHR0IGNsYXNzPSdtZXRob2QnPmdldF9jb250ZXh0PC90dD48L2E+PC9iPigpCis8ZGQ+CitSZXRyaWV2ZSB0aGUgQ29udGV4dCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29ubmVjdGlvbi4KKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTE0OCc+PHR0IGNsYXNzPSdtZXRob2QnPmdldF9wZWVyX2NlcnRpZmljYXRlPC90dD48L2E+PC9iPigpCis8ZGQ+CitSZXRyaWV2ZSB0aGUgb3RoZXIgc2lkZSdzIGNlcnRpZmljYXRlIChpZiBhbnkpCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xNDknPjx0dCBjbGFzcz0nbWV0aG9kJz5nZXRwZWVybmFtZTwvdHQ+PC9hPjwvYj4oKQorPGRkPgorQ2FsbCB0aGUgPHR0IGNsYXNzPSJtZXRob2QiPmdldHBlZXJuYW1lPC90dD4gbWV0aG9kIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTE1MCc+PHR0IGNsYXNzPSdtZXRob2QnPmdldHNvY2tuYW1lPC90dD48L2E+PC9iPigpCis8ZGQ+CitDYWxsIHRoZSA8dHQgY2xhc3M9Im1ldGhvZCI+Z2V0c29ja25hbWU8L3R0PiBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTUxJz48dHQgY2xhc3M9J21ldGhvZCc+Z2V0c29ja29wdDwvdHQ+PC9hPjwvYj4oPHZhcj5sZXZlbCwgb3B0bmFtZTwvdmFyPjxiaWc+WzwvYmlnPjx2YXI+LCBidWZsZW48L3Zhcj48YmlnPl08L2JpZz4pCis8ZGQ+CitDYWxsIHRoZSA8dHQgY2xhc3M9Im1ldGhvZCI+Z2V0c29ja29wdDwvdHQ+IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xNTInPjx0dCBjbGFzcz0nbWV0aG9kJz5wZW5kaW5nPC90dD48L2E+PC9iPigpCis8ZGQ+CitSZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHNhZmVseSByZWFkIGZyb20gdGhlIFNTTCBidWZmZXIuCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xNTMnPjx0dCBjbGFzcz0nbWV0aG9kJz5yZWN2PC90dD48L2E+PC9iPig8dmFyPmJ1ZnNpemU8L3Zhcj4pCis8ZGQ+CitSZWNlaXZlIGRhdGEgZnJvbSB0aGUgQ29ubmVjdGlvbi4gVGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlCitkYXRhIHJlY2VpdmVkLiBUaGUgbWF4aW11bSBhbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZCBhdCBvbmNlLCBpcyBzcGVjaWZpZWQKK2J5IDx2YXI+YnVmc2l6ZTwvdmFyPi4KKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTE1NCc+PHR0IGNsYXNzPSdtZXRob2QnPnJlbmVnb3RpYXRlPC90dD48L2E+PC9iPigpCis8ZGQ+CitSZW5lZ290aWF0ZSB0aGUgU1NMIHNlc3Npb24uIENhbGwgdGhpcyBpZiB5b3Ugd2lzaCB0byBjaGFuZ2UgY2lwaGVyIHN1aXRlcyBvcgorYW55dGhpbmcgbGlrZSB0aGF0LgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTU1Jz48dHQgY2xhc3M9J21ldGhvZCc+c2VuZDwvdHQ+PC9hPjwvYj4oPHZhcj5zdHJpbmc8L3Zhcj4pCis8ZGQ+CitTZW5kIHRoZSA8dmFyPnN0cmluZzwvdmFyPiBkYXRhIHRvIHRoZSBDb25uZWN0aW9uLgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTU2Jz48dHQgY2xhc3M9J21ldGhvZCc+c2VuZGFsbDwvdHQ+PC9hPjwvYj4oPHZhcj5zdHJpbmc8L3Zhcj4pCis8ZGQ+CitTZW5kIGFsbCBvZiB0aGUgPHZhcj5zdHJpbmc8L3Zhcj4gZGF0YSB0byB0aGUgQ29ubmVjdGlvbi4gVGhpcyBjYWxscyA8dHQgY2xhc3M9Im1ldGhvZCI+c2VuZDwvdHQ+CityZXBlYXRlZGx5IHVudGlsIGFsbCBkYXRhIGlzIHNlbnQuIElmIGFuIGVycm9yIG9jY3VycywgaXQncyBpbXBvc3NpYmxlIHRvIHRlbGwKK2hvdyBtdWNoIGRhdGEgaGFzIGJlZW4gc2VudC4KKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTE1Nyc+PHR0IGNsYXNzPSdtZXRob2QnPnNldF9hY2NlcHRfc3RhdGU8L3R0PjwvYT48L2I+KCkKKzxkZD4KK1NldCB0aGUgY29ubmVjdGlvbiB0byB3b3JrIGluIHNlcnZlciBtb2RlLiBUaGUgaGFuZHNoYWtlIHdpbGwgYmUgaGFuZGxlZAorYXV0b21hdGljYWxseSBieSByZWFkL3dyaXRlLgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTU4Jz48dHQgY2xhc3M9J21ldGhvZCc+c2V0X2FwcF9kYXRhPC90dD48L2E+PC9iPig8dmFyPmRhdGE8L3Zhcj4pCis8ZGQ+CitBc3NvY2lhdGUgPHZhcj5kYXRhPC92YXI+IHdpdGggdGhpcyBDb25uZWN0aW9uIG9iamVjdC4gPHZhcj5kYXRhPC92YXI+IGNhbiBiZSByZXRyaWV2ZWQKK2xhdGVyIHVzaW5nIHRoZSA8dHQgY2xhc3M9Im1ldGhvZCI+Z2V0X2FwcF9kYXRhPC90dD4gbWV0aG9kLgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTU5Jz48dHQgY2xhc3M9J21ldGhvZCc+c2V0X2Nvbm5lY3Rfc3RhdGU8L3R0PjwvYT48L2I+KCkKKzxkZD4KK1NldCB0aGUgY29ubmVjdGlvbiB0byB3b3JrIGluIGNsaWVudCBtb2RlLiBUaGUgaGFuZHNoYWtlIHdpbGwgYmUgaGFuZGxlZAorYXV0b21hdGljYWxseSBieSByZWFkL3dyaXRlLgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTYwJz48dHQgY2xhc3M9J21ldGhvZCc+c2V0YmxvY2tpbmc8L3R0PjwvYT48L2I+KDx2YXI+ZmxhZzwvdmFyPikKKzxkZD4KK0NhbGwgdGhlIDx0dCBjbGFzcz0ibWV0aG9kIj5zZXRibG9ja2luZzwvdHQ+IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xNjEnPjx0dCBjbGFzcz0nbWV0aG9kJz5zZXRzb2Nrb3B0PC90dD48L2E+PC9iPig8dmFyPmxldmVsLCBvcHRuYW1lLCB2YWx1ZTwvdmFyPikKKzxkZD4KK0NhbGwgdGhlIDx0dCBjbGFzcz0ibWV0aG9kIj5zZXRzb2Nrb3B0PC90dD4gbWV0aG9kIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTE2Mic+PHR0IGNsYXNzPSdtZXRob2QnPnNodXRkb3duPC90dD48L2E+PC9iPigpCis8ZGQ+CitTZW5kIHRoZSBzaHV0ZG93biBtZXNzYWdlIHRvIHRoZSBDb25uZWN0aW9uLiBSZXR1cm5zIHRydWUgaWYgdGhlIHNodXRkb3duCittZXNzYWdlIGV4Y2hhbmdlIGlzIGNvbXBsZXRlZCBhbmQgZmFsc2Ugb3RoZXJ3aXNlIChpbiB3aGljaCBjYXNlIHlvdSBjYWxsCis8dHQgY2xhc3M9Im1ldGhvZCI+cmVjdigpPC90dD4gb3IgPHR0IGNsYXNzPSJtZXRob2QiPnNlbmQoKTwvdHQ+IHdoZW4gdGhlIGNvbm5lY3Rpb24gYmVjb21lcworcmVhZGFibGUvd3JpdGVhYmxlLgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTYzJz48dHQgY2xhc3M9J21ldGhvZCc+c29ja19zaHV0ZG93bjwvdHQ+PC9hPjwvYj4oPHZhcj5ob3c8L3Zhcj4pCis8ZGQ+CitDYWxsIHRoZSA8dHQgY2xhc3M9Im1ldGhvZCI+c2h1dGRvd248L3R0PiBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTY0Jz48dHQgY2xhc3M9J21ldGhvZCc+c3RhdGVfc3RyaW5nPC90dD48L2E+PC9iPigpCis8ZGQ+CitSZXRyaWV2ZSBhIHZlcmJvc2Ugc3RyaW5nIGRldGFpbGluZyB0aGUgc3RhdGUgb2YgdGhlIENvbm5lY3Rpb24uCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xNjUnPjx0dCBjbGFzcz0nbWV0aG9kJz53YW50X3JlYWQ8L3R0PjwvYT48L2I+KCkKKzxkZD4KK0NoZWNrcyBpZiBtb3JlIGRhdGEgaGFzIHRvIGJlIHJlYWQgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyIHRvIGNvbXBsZXRlIGFuCitvcGVyYXRpb24uCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xNjYnPjx0dCBjbGFzcz0nbWV0aG9kJz53YW50X3dyaXRlPC90dD48L2E+PC9iPigpCis8ZGQ+CitDaGVja3MgaWYgdGhlcmUgaXMgZGF0YSB0byB3cml0ZSB0byB0aGUgdHJhbnNwb3J0IGxheWVyIHRvIGNvbXBsZXRlIGFuCitvcGVyYXRpb24uCis8L2RsPgorPFA+CisKKzxESVYgQ0xBU1M9Im5hdmlnYXRpb24iPgorPHA+PGhyPgorPHRhYmxlIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjIiPgorPHRyPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtY29udGV4dC5odG1sIj48aW1nIHNyYz0icHJldmlvdXMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlByZXZpb3VzIFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1zc2wuaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0iaW50ZXJuYWxzLmh0bWwiPjxpbWcgc3JjPSJuZXh0LmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJOZXh0IFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvdGQ+Cis8dGQ+PEEgaHJlZj0iY29udGVudHMuaHRtbCI+PGltZyBzcmM9ImNvbnRlbnRzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJDb250ZW50cyIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPC90cj48L3RhYmxlPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5QcmV2aW91czo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLWNvbnRleHQuaHRtbCI+My4zLjEgQ29udGV4dCBvYmplY3RzPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5VcDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLXNzbC5odG1sIj4zLjMgU1NMICA8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPk5leHQ6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0iaW50ZXJuYWxzLmh0bWwiPjQgSW50ZXJuYWxzPC9BPgorPGhyPgorPHNwYW4gY2xhc3M9InJlbGVhc2UtaW5mbyI+UmVsZWFzZSAwLjYuPC9zcGFuPgorPC9ESVY+Cis8IS0tRW5kIG9mIE5hdmlnYXRpb24gUGFuZWwtLT4KKworPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jL2h0bWwvb3BlbnNzbC1jb250ZXh0Lmh0bWwgYi9kb2MvaHRtbC9vcGVuc3NsLWNvbnRleHQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGQ5YTE5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2h0bWwvb3BlbnNzbC1jb250ZXh0Lmh0bWwKQEAgLTAsMCArMSwyNTUgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPjMuMy4xIENvbnRleHQgb2JqZWN0cyA8L3RpdGxlPgorPE1FVEEgTkFNRT0iZGVzY3JpcHRpb24iIENPTlRFTlQ9IjMuMy4xIENvbnRleHQgb2JqZWN0cyAiPgorPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9InB5T3BlblNTTCI+Cis8TUVUQSBOQU1FPSJyZXNvdXJjZS10eXBlIiBDT05URU5UPSJkb2N1bWVudCI+Cis8TUVUQSBOQU1FPSJkaXN0cmlidXRpb24iIENPTlRFTlQ9Imdsb2JhbCI+Cis8bGluayByZWw9IlNUWUxFU0hFRVQiIGhyZWY9InB5T3BlblNTTC5jc3MiPgorPExJTksgUkVMPSJuZXh0IiBocmVmPSJvcGVuc3NsLWNvbm5lY3Rpb24uaHRtbCI+Cis8TElOSyBSRUw9InByZXZpb3VzIiBocmVmPSJvcGVuc3NsLXNzbC5odG1sIj4KKzxMSU5LIFJFTD0idXAiIGhyZWY9Im9wZW5zc2wtc3NsLmh0bWwiPgorPExJTksgUkVMPSJuZXh0IiBocmVmPSJvcGVuc3NsLWNvbm5lY3Rpb24uaHRtbCI+Cis8L2hlYWQ+Cis8Ym9keT4KKzxESVYgQ0xBU1M9Im5hdmlnYXRpb24iPgorPHRhYmxlIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjIiPgorPHRyPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtc3NsLmh0bWwiPjxpbWcgc3JjPSJwcmV2aW91cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iUHJldmlvdXMgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLXNzbC5odG1sIj48aW1nIHNyYz0idXAuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlVwIE9uZSBMZXZlbCIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLWNvbm5lY3Rpb24uaHRtbCI+PGltZyBzcmM9Im5leHQuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9Ik5leHQgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC90ZD4KKzx0ZD48QSBocmVmPSJjb250ZW50cy5odG1sIj48aW1nIHNyYz0iY29udGVudHMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IkNvbnRlbnRzIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8L3RyPjwvdGFibGU+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlByZXZpb3VzOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wtc3NsLmh0bWwiPjMuMyBTU0wgIDwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+VXA6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1zc2wuaHRtbCI+My4zIFNTTCAgPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wtY29ubmVjdGlvbi5odG1sIj4zLjMuMiBDb25uZWN0aW9uIG9iamVjdHM8L0E+Cis8YnI+PGhyPgorPC9ESVY+Cis8IS0tRW5kIG9mIE5hdmlnYXRpb24gUGFuZWwtLT4KKworPEgzPjxBIE5BTUU9IlNFQ1RJT04wMDA0MzEwMDAwMDAwMDAwMDAwMDAiPiZuYnNwOzwvQT4KKzxCUj4KKzMuMy4xIENvbnRleHQgb2JqZWN0cyAKKzwvSDM+Cis8UD4KKzxFTT48RU0+PEVNPkNvbnRleHQgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKzwvRU0+PC9FTT48L0VNPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xMTQnPjx0dCBjbGFzcz0nbWV0aG9kJz5jaGVja19wcml2YXRla2V5PC90dD48L2E+PC9iPigpCis8ZGQ+CitDaGVjayBpZiB0aGUgcHJpdmF0ZSBrZXkgKGxvYWRlZCB3aXRoIDx0dCBjbGFzcz0ibWV0aG9kIj51c2VfcHJpdmF0ZWtleTxiaWc+WzwvYmlnPl9maWxlPGJpZz5dPC9iaWc+PC90dD4pCittYXRjaGVzIHRoZSBjZXJ0aWZpY2F0ZSAobG9hZGVkIHdpdGggPHR0IGNsYXNzPSJtZXRob2QiPnVzZV9jZXJ0aWZpY2F0ZTxiaWc+WzwvYmlnPl9maWxlPGJpZz5dPC9iaWc+PC90dD4pLgorUmV0dXJucyB0cnVlIGlmIHRoZXkgbWF0Y2gsIGZhbHNlIG90aGVyd2lzZS4KKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTExNSc+PHR0IGNsYXNzPSdtZXRob2QnPmdldF9hcHBfZGF0YTwvdHQ+PC9hPjwvYj4oKQorPGRkPgorUmV0cmlldmUgYXBwbGljYXRpb24gZGF0YSBhcyBzZXQgYnkgPHR0IGNsYXNzPSJtZXRob2QiPnNldF9hcHBfZGF0YTwvdHQ+LgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTE2Jz48dHQgY2xhc3M9J21ldGhvZCc+Z2V0X2NlcnRfc3RvcmU8L3R0PjwvYT48L2I+KCkKKzxkZD4KK1JldHJpZXZlIHRoZSBjZXJ0aWZpY2F0ZSBzdG9yZSAoYSBYNTA5U3RvcmUgb2JqZWN0KSB0aGF0IHRoZSBjb250ZXh0IHVzZXMuCitUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCAidHJ1c3RlZCIgY2VydGlmaWNhdGVzIHdpdGhvdXQgdXNpbmcgdGhlLgorPHR0IGNsYXNzPSJtZXRob2QiPmxvYWRfdmVyaWZ5X2xvY2F0aW9ucygpPC90dD4gbWV0aG9kLgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTE3Jz48dHQgY2xhc3M9J21ldGhvZCc+Z2V0X3RpbWVvdXQ8L3R0PjwvYT48L2I+KCkKKzxkZD4KK1JldHJpZXZlIHNlc3Npb24gdGltZW91dCwgYXMgc2V0IGJ5IDx0dCBjbGFzcz0ibWV0aG9kIj5zZXRfdGltZW91dDwvdHQ+LiBUaGUgZGVmYXVsdCBpcyAzMDAKK3NlY29uZHMuCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xMTgnPjx0dCBjbGFzcz0nbWV0aG9kJz5nZXRfdmVyaWZ5X2RlcHRoPC90dD48L2E+PC9iPigpCis8ZGQ+CitSZXRyaWV2ZSB0aGUgQ29udGV4dCBvYmplY3QncyB2ZXJpZnkgZGVwdGgsIGFzIHNldCBieQorPHR0IGNsYXNzPSJtZXRob2QiPnNldF92ZXJpZnlfZGVwdGg8L3R0Pi4KKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTExOSc+PHR0IGNsYXNzPSdtZXRob2QnPmdldF92ZXJpZnlfbW9kZTwvdHQ+PC9hPjwvYj4oKQorPGRkPgorUmV0cmlldmUgdGhlIENvbnRleHQgb2JqZWN0J3MgdmVyaWZ5IG1vZGUsIGFzIHNldCBieSA8dHQgY2xhc3M9Im1ldGhvZCI+c2V0X3ZlcmlmeV9tb2RlPC90dD4uCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xMjAnPjx0dCBjbGFzcz0nbWV0aG9kJz5sb2FkX2NsaWVudF9jYTwvdHQ+PC9hPjwvYj4oPHZhcj5wZW1maWxlPC92YXI+KQorPGRkPgorUmVhZCBhIGZpbGUgd2l0aCBQRU0tZm9ybWF0dGVkIGNlcnRpZmljYXRlcyB0aGF0IHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50Cit3aGVuIHJlcXVlc3RpbmcgYSBjbGllbnQgY2VydGlmaWNhdGUuCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xMjEnPjx0dCBjbGFzcz0nbWV0aG9kJz5sb2FkX3ZlcmlmeV9sb2NhdGlvbnM8L3R0PjwvYT48L2I+KDx2YXI+cGVtZmlsZTwvdmFyPikKKzxkZD4KK1NwZWNpZnkgd2hlcmUgQ0EgY2VydGlmaWNhdGVzIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMgYXJlIGxvY2F0ZWQuIFRoZXNlIGFyZQordHJ1c3RlZCBjZXJ0aWZpY2F0ZXMuIE5vdGUgdGhhdCB0aGUgY2VydGlmaWNhdGVzIGhhdmUgdG8gYmUgaW4gUEVNIGZvcm1hdC4KKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTEyMic+PHR0IGNsYXNzPSdtZXRob2QnPmxvYWRfdG1wX2RoPC90dD48L2E+PC9iPig8dmFyPmRoZmlsZTwvdmFyPikKKzxkZD4KK0xvYWQgcGFyYW1ldGVycyBmb3IgRXBoZW1lcmFsIERpZmZpZS1IZWxsbWFuIGZyb20gPHZhcj5kaGZpbGU8L3Zhcj4uCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xMjMnPjx0dCBjbGFzcz0nbWV0aG9kJz5zZXRfYXBwX2RhdGE8L3R0PjwvYT48L2I+KDx2YXI+ZGF0YTwvdmFyPikKKzxkZD4KK0Fzc29jaWF0ZSA8dmFyPmRhdGE8L3Zhcj4gd2l0aCB0aGlzIENvbnRleHQgb2JqZWN0LiA8dmFyPmRhdGE8L3Zhcj4gY2FuIGJlIHJldHJpZXZlZAorbGF0ZXIgdXNpbmcgdGhlIDx0dCBjbGFzcz0ibWV0aG9kIj5nZXRfYXBwX2RhdGE8L3R0PiBtZXRob2QuCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xMjQnPjx0dCBjbGFzcz0nbWV0aG9kJz5zZXRfY2lwaGVyX2xpc3Q8L3R0PjwvYT48L2I+KDx2YXI+Y2lwaGVyczwvdmFyPikKKzxkZD4KK1NldCB0aGUgbGlzdCBvZiBjaXBoZXJzIHRvIGJlIHVzZWQgaW4gdGhpcyBjb250ZXh0LiBTZWUgdGhlIE9wZW5TU0wgbWFudWFsIGZvcgorbW9yZSBpbmZvcm1hdGlvbiAoZS5nLiBjaXBoZXJzKDEpKQorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTI1Jz48dHQgY2xhc3M9J21ldGhvZCc+c2V0X2luZm9fY2FsbGJhY2s8L3R0PjwvYT48L2I+KDx2YXI+Y2FsbGJhY2s8L3Zhcj4pCis8ZGQ+CitTZXQgdGhlIGluZm9ybWF0aW9uIGNhbGxiYWNrIHRvIDx2YXI+Y2FsbGJhY2s8L3Zhcj4uIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKK2Zyb20gdGltZSB0byB0aW1lIGR1cmluZyBTU0wgaGFuZHNoYWtlcy4KKzwvRU0+PC9FTT48L0VNPgorPFA+Cis8RU0+PEVNPjxFTT48dmFyPmNhbGxiYWNrPC92YXI+IHNob3VsZCB0YWtlIHRocmVlIGFyZ3VtZW50czogYSBDb25uZWN0aW9uIG9iamVjdCBhbmQgdHdvCitpbnRlZ2Vycy4gVGhlIGZpcnN0IGludGVnZXIgc3BlY2lmaWVzIHdoZXJlIGluIHRoZSBTU0wgaGFuZHNoYWtlIHRoZSBmdW5jdGlvbgord2FzIGNhbGxlZCwgYW5kIHRoZSBvdGhlciB0aGUgcmV0dXJuIGNvZGUgZnJvbSBhIChwb3NzaWJseSBmYWlsZWQpIGludGVybmFsCitmdW5jdGlvbiBjYWxsLgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTI2Jz48dHQgY2xhc3M9J21ldGhvZCc+c2V0X29wdGlvbnM8L3R0PjwvYT48L2I+KDx2YXI+b3B0aW9uczwvdmFyPikKKzxkZD4KK0FkZCBTU0wgb3B0aW9ucy4gT3B0aW9ucyB5b3UgaGF2ZSBzZXQgYmVmb3JlIGFyZSBub3QgY2xlYXJlZCEKKzwvRU0+PC9FTT48L0VNPgorPFA+Cis8RU0+PEVNPjxFTT5UaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aXRoIHRoZSA8dHQgY2xhc3M9ImNvbnN0YW50Ij5PUF8qPC90dD4gY29uc3RhbnRzLgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTI3Jz48dHQgY2xhc3M9J21ldGhvZCc+c2V0X3Bhc3N3ZF9jYjwvdHQ+PC9hPjwvYj4oPHZhcj5jYWxsYmFjazwvdmFyPjxiaWc+WzwvYmlnPjx2YXI+LCB1c2VyZGF0YTwvdmFyPjxiaWc+XTwvYmlnPikKKzxkZD4KK1NldCB0aGUgcGFzc3BocmFzZSBjYWxsYmFjayB0byA8dmFyPmNhbGxiYWNrPC92YXI+LiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCit3aGVuIGEgcHJpdmF0ZSBrZXkgd2l0aCBhIHBhc3NwaHJhc2UgaXMgbG9hZGVkLgorPC9FTT48L0VNPjwvRU0+Cis8UD4KKzxFTT48RU0+PEVNPjx2YXI+Y2FsbGJhY2s8L3Zhcj4gc2hvdWxkIHRha2UgYSBib29sZWFuIGFyZ3VtZW50IDx2YXI+cmVwZWF0PC92YXI+IGFuZCBhbiBhcmJpdHJhcnkKK2FyZ3VtZW50IDx2YXI+ZGF0YTwvdmFyPiBhbmQgcmV0dXJuIHRoZSBwYXNzcGhyYXNlIGVudGVyZWQgYnkgdGhlIHVzZXIuIElmCis8dmFyPnJlcGVhdDwvdmFyPiBpcyB0cnVlIHRoZW4gPHZhcj5jYWxsYmFjazwvdmFyPiBzaG91bGQgYXNrIGZvciB0aGUgcGFzc3BocmFzZSB0d2ljZQorYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSB0d28gZW50cmllcyBhcmUgZXF1YWwuIFRoZSA8dmFyPmRhdGE8L3Zhcj4gYXJndW1lbnQgaXMgdGhlCis8dmFyPnVzZXJkYXRhPC92YXI+IHZhcmlhYmxlIHBhc3NlZCB0byB0aGUgPHR0IGNsYXNzPSJtZXRob2QiPnNldF9wYXNzd2RfY2I8L3R0PiBtZXRob2QuIElmIGFuCitlcnJvciBvY2N1cnMsIDx2YXI+Y2FsbGJhY2s8L3Zhcj4gc2hvdWxkIHJldHVybiBhIGZhbHNlIHZhbHVlIChlLmcuIGFuIGVtcHR5CitzdHJpbmcpLgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTI4Jz48dHQgY2xhc3M9J21ldGhvZCc+c2V0X3Nlc3Npb25faWQ8L3R0PjwvYT48L2I+KDx2YXI+bmFtZTwvdmFyPikKKzxkZD4KK1NldCB0aGUgY29udGV4dCA8dmFyPm5hbWU8L3Zhcj4gd2l0aGluIHdoaWNoIGEgc2Vzc2lvbiBjYW4gYmUgcmV1c2VkIGZvciB0aGlzCitDb250ZXh0IG9iamVjdC4gVGhpcyBpcyBuZWVkZWQgd2hlbiBkb2luZyBzZXNzaW9uIHJlc3VtcHRpb24sIGJlY2F1c2UgdGhlcmUgaXMKK25vIHdheSBmb3IgYSBzdG9yZWQgc2Vzc2lvbiB0byBrbm93IHdoaWNoIENvbnRleHQgb2JqZWN0IGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4KKzx2YXI+bmFtZTwvdmFyPiBtYXkgYmUgYW55IGJpbmFyeSBkYXRhLgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTI5Jz48dHQgY2xhc3M9J21ldGhvZCc+c2V0X3RpbWVvdXQ8L3R0PjwvYT48L2I+KDx2YXI+dGltZW91dDwvdmFyPikKKzxkZD4KK1NldCB0aGUgdGltZW91dCBmb3IgbmV3bHkgY3JlYXRlZCBzZXNzaW9ucyBmb3IgdGhpcyBDb250ZXh0IG9iamVjdCB0bworPHZhcj50aW1lb3V0PC92YXI+LiA8dmFyPnRpbWVvdXQ8L3Zhcj4gbXVzdCBiZSBnaXZlbiBpbiAod2hvbGUpIHNlY29uZHMuIFRoZSBkZWZhdWx0Cit2YWx1ZSBpcyAzMDAgc2Vjb25kcy4gU2VlIHRoZSBPcGVuU1NMIG1hbnVhbCBmb3IgbW9yZSBpbmZvcm1hdGlvbiAoZS5nLgorU1NMX0NUWF9zZXRfdGltZW91dCgzKSkuCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xMzAnPjx0dCBjbGFzcz0nbWV0aG9kJz5zZXRfdmVyaWZ5PC90dD48L2E+PC9iPig8dmFyPm1vZGUsIGNhbGxiYWNrPC92YXI+KQorPGRkPgorU2V0IHRoZSB2ZXJpZmljYXRpb24gZmxhZ3MgZm9yIHRoaXMgQ29udGV4dCBvYmplY3QgdG8gPHZhcj5tb2RlPC92YXI+IGFuZCBzcGVjaWZ5Cit0aGF0IDx2YXI+Y2FsbGJhY2s8L3Zhcj4gc2hvdWxkIGJlIHVzZWQgZm9yIHZlcmlmaWNhdGlvbiBjYWxsYmFja3MuIDx2YXI+bW9kZTwvdmFyPgorc2hvdWxkIGJlIG9uZSBvZiA8dHQgY2xhc3M9ImNvbnN0YW50Ij5WRVJJRllfTk9ORTwvdHQ+IGFuZCA8dHQgY2xhc3M9ImNvbnN0YW50Ij5WRVJJRllfUEVFUjwvdHQ+LiBJZgorPHR0IGNsYXNzPSJjb25zdGFudCI+VkVSSUZZX1BFRVI8L3R0PiBpcyB1c2VkLCA8dmFyPm1vZGU8L3Zhcj4gY2FuIGJlIE9SOmVkIHdpdGgKKzx0dCBjbGFzcz0iY29uc3RhbnQiPlZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVDwvdHQ+IGFuZCA8dHQgY2xhc3M9ImNvbnN0YW50Ij5WRVJJRllfQ0xJRU5UX09OQ0U8L3R0PiB0bworZnVydGhlciBjb250cm9sIHRoZSBiZWhhdmlvdXIuCis8L0VNPjwvRU0+PC9FTT4KKzxQPgorPEVNPjxFTT48RU0+PHZhcj5jYWxsYmFjazwvdmFyPiBzaG91bGQgdGFrZSBmaXZlIGFyZ3VtZW50czogQSBDb25uZWN0aW9uIG9iamVjdCwgYW4gWDUwOSBvYmplY3QsCithbmQgdGhyZWUgaW50ZWdlciB2YXJpYWJsZXMsIHdoaWNoIGFyZSBpbiB0dXJuIHBvdGVudGlhbCBlcnJvciBudW1iZXIsIGVycm9yCitkZXB0aCBhbmQgcmV0dXJuIGNvZGUuIDx2YXI+Y2FsbGJhY2s8L3Zhcj4gc2hvdWxkIHJldHVybiB0cnVlIGlmIHZlcmlmaWNhdGlvbiBwYXNzZXMKK2FuZCBmYWxzZSBvdGhlcndpc2UuCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xMzEnPjx0dCBjbGFzcz0nbWV0aG9kJz5zZXRfdmVyaWZ5X2RlcHRoPC90dD48L2E+PC9iPig8dmFyPmRlcHRoPC92YXI+KQorPGRkPgorU2V0IHRoZSBtYXhpbXVtIGRlcHRoIGZvciB0aGUgY2VydGlmaWNhdGUgY2hhaW4gdmVyaWZpY2F0aW9uIHRoYXQgc2hhbGwgYmUKK2FsbG93ZWQgZm9yIHRoaXMgQ29udGV4dCBvYmplY3QuCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xMzInPjx0dCBjbGFzcz0nbWV0aG9kJz51c2VfY2VydGlmaWNhdGU8L3R0PjwvYT48L2I+KDx2YXI+Y2VydDwvdmFyPikKKzxkZD4KK1VzZSB0aGUgY2VydGlmaWNhdGUgPHZhcj5jZXJ0PC92YXI+IHdoaWNoIGhhcyB0byBiZSBhIFg1MDkgb2JqZWN0LgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTMzJz48dHQgY2xhc3M9J21ldGhvZCc+dXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGU8L3R0PjwvYT48L2I+KDx2YXI+ZmlsZTwvdmFyPikKKzxkZD4KK0xvYWQgYSBjZXJ0aWZpY2F0ZSBjaGFpbiBmcm9tIDx2YXI+ZmlsZTwvdmFyPiB3aGljaCBtdXN0IGJlIFBFTSBlbmNvZGVkLgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTM0Jz48dHQgY2xhc3M9J21ldGhvZCc+dXNlX3ByaXZhdGVrZXk8L3R0PjwvYT48L2I+KDx2YXI+cGtleTwvdmFyPikKKzxkZD4KK1VzZSB0aGUgcHJpdmF0ZSBrZXkgPHZhcj5wa2V5PC92YXI+IHdoaWNoIGhhcyB0byBiZSBhIFBLZXkgb2JqZWN0LgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTM1Jz48dHQgY2xhc3M9J21ldGhvZCc+dXNlX2NlcnRpZmljYXRlX2ZpbGU8L3R0PjwvYT48L2I+KDx2YXI+ZmlsZTwvdmFyPjxiaWc+WzwvYmlnPjx2YXI+LCBmb3JtYXQ8L3Zhcj48YmlnPl08L2JpZz4pCis8ZGQ+CitMb2FkIHRoZSBmaXJzdCBjZXJ0aWZpY2F0ZSBmb3VuZCBpbiA8dmFyPmZpbGU8L3Zhcj4uIFRoZSBjZXJ0aWZpY2F0ZSBtdXN0IGJlIGluIHRoZQorZm9ybWF0IHNwZWNpZmllZCBieSA8dmFyPmZvcm1hdDwvdmFyPiwgd2hpY2ggaXMgZWl0aGVyIDx0dCBjbGFzcz0iY29uc3RhbnQiPkZJTEVUWVBFX1BFTTwvdHQ+IG9yCis8dHQgY2xhc3M9ImNvbnN0YW50Ij5GSUxFVFlQRV9BU04xPC90dD4uIFRoZSBkZWZhdWx0IGlzIDx0dCBjbGFzcz0iY29uc3RhbnQiPkZJTEVUWVBFX1BFTTwvdHQ+LgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTM2Jz48dHQgY2xhc3M9J21ldGhvZCc+dXNlX3ByaXZhdGVrZXlfZmlsZTwvdHQ+PC9hPjwvYj4oPHZhcj5maWxlPC92YXI+PGJpZz5bPC9iaWc+PHZhcj4sIGZvcm1hdDwvdmFyPjxiaWc+XTwvYmlnPikKKzxkZD4KK0xvYWQgdGhlIGZpcnN0IHByaXZhdGUga2V5IGZvdW5kIGluIDx2YXI+ZmlsZTwvdmFyPi4gVGhlIHByaXZhdGUga2V5IG11c3QgYmUgaW4gdGhlCitmb3JtYXQgc3BlY2lmaWVkIGJ5IDx2YXI+Zm9ybWF0PC92YXI+LCB3aGljaCBpcyBlaXRoZXIgPHR0IGNsYXNzPSJjb25zdGFudCI+RklMRVRZUEVfUEVNPC90dD4gb3IKKzx0dCBjbGFzcz0iY29uc3RhbnQiPkZJTEVUWVBFX0FTTjE8L3R0Pi4gVGhlIGRlZmF1bHQgaXMgPHR0IGNsYXNzPSJjb25zdGFudCI+RklMRVRZUEVfUEVNPC90dD4uCis8L2RsPgorPFA+CisKKzxESVYgQ0xBU1M9Im5hdmlnYXRpb24iPgorPHA+PGhyPgorPHRhYmxlIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjIiPgorPHRyPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtc3NsLmh0bWwiPjxpbWcgc3JjPSJwcmV2aW91cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iUHJldmlvdXMgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLXNzbC5odG1sIj48aW1nIHNyYz0idXAuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlVwIE9uZSBMZXZlbCIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLWNvbm5lY3Rpb24uaHRtbCI+PGltZyBzcmM9Im5leHQuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9Ik5leHQgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC90ZD4KKzx0ZD48QSBocmVmPSJjb250ZW50cy5odG1sIj48aW1nIHNyYz0iY29udGVudHMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IkNvbnRlbnRzIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8L3RyPjwvdGFibGU+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlByZXZpb3VzOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wtc3NsLmh0bWwiPjMuMyBTU0wgIDwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+VXA6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1zc2wuaHRtbCI+My4zIFNTTCAgPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wtY29ubmVjdGlvbi5odG1sIj4zLjMuMiBDb25uZWN0aW9uIG9iamVjdHM8L0E+Cis8aHI+Cis8c3BhbiBjbGFzcz0icmVsZWFzZS1pbmZvIj5SZWxlYXNlIDAuNi48L3NwYW4+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kb2MvaHRtbC9vcGVuc3NsLWNyeXB0by5odG1sIGIvZG9jL2h0bWwvb3BlbnNzbC1jcnlwdG8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzhlMGIxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2h0bWwvb3BlbnNzbC1jcnlwdG8uaHRtbApAQCAtMCwwICsxLDI5MiBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+My4xIGNyeXB0byAtLSBHZW5lcmljIGNyeXB0b2dyYXBoaWMgbW9kdWxlIDwvdGl0bGU+Cis8TUVUQSBOQU1FPSJkZXNjcmlwdGlvbiIgQ09OVEVOVD0iMy4xIGNyeXB0byAtLSBHZW5lcmljIGNyeXB0b2dyYXBoaWMgbW9kdWxlICI+Cis8TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0icHlPcGVuU1NMIj4KKzxNRVRBIE5BTUU9InJlc291cmNlLXR5cGUiIENPTlRFTlQ9ImRvY3VtZW50Ij4KKzxNRVRBIE5BTUU9ImRpc3RyaWJ1dGlvbiIgQ09OVEVOVD0iZ2xvYmFsIj4KKzxsaW5rIHJlbD0iU1RZTEVTSEVFVCIgaHJlZj0icHlPcGVuU1NMLmNzcyI+Cis8TElOSyBSRUw9Im5leHQiIGhyZWY9Im9wZW5zc2wtcmFuZC5odG1sIj4KKzxMSU5LIFJFTD0icHJldmlvdXMiIGhyZWY9Im9wZW5zc2wuaHRtbCI+Cis8TElOSyBSRUw9InVwIiBocmVmPSJvcGVuc3NsLmh0bWwiPgorPExJTksgUkVMPSJuZXh0IiBocmVmPSJvcGVuc3NsLXg1MDkuaHRtbCI+Cis8L2hlYWQ+Cis8Ym9keT4KKzxESVYgQ0xBU1M9Im5hdmlnYXRpb24iPgorPHRhYmxlIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjIiPgorPHRyPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wuaHRtbCI+PGltZyBzcmM9InByZXZpb3VzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJQcmV2aW91cyBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wuaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC14NTA5Lmh0bWwiPjxpbWcgc3JjPSJuZXh0LmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJOZXh0IFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvdGQ+Cis8dGQ+PEEgaHJlZj0iY29udGVudHMuaHRtbCI+PGltZyBzcmM9ImNvbnRlbnRzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJDb250ZW50cyIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPC90cj48L3RhYmxlPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5QcmV2aW91czo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLmh0bWwiPjMgT3BlblNTTCAgPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5VcDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLmh0bWwiPjMgT3BlblNTTCAgPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wteDUwOS5odG1sIj4zLjEuMSBYNTA5IG9iamVjdHM8L0E+Cis8YnI+PGhyPgorPC9ESVY+Cis8IS0tRW5kIG9mIE5hdmlnYXRpb24gUGFuZWwtLT4KKzxIMj48QSBOQU1FPSJTRUNUSU9OMDAwNDEwMDAwMDAwMDAwMDAwMDAwIj4mbmJzcDs8L0E+Cis8QlI+CiszLjEgPHR0IGNsYXNzPSJtb2R1bGUiPmNyeXB0bzwvdHQ+IC0tIEdlbmVyaWMgY3J5cHRvZ3JhcGhpYyBtb2R1bGUgCis8L0gyPgorCis8UD4KKworCis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTYnPjx0dD5YNTA5VHlwZTwvdHQ+PC9hPjwvYj4KKzxkZD4KK0EgUHl0aG9uIHR5cGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgWDUwOSBvYmplY3QgdHlwZS4KKzwvZGw+CisKKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtNyc+PHR0IGNsYXNzPSdmdW5jdGlvbic+WDUwOTwvdHQ+PC9hPjwvYj4oKQorPGRkPgorRmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gWDUwOSBvYmplY3QuCis8L2RsPgorCis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTgnPjx0dD5YNTA5TmFtZVR5cGU8L3R0PjwvYT48L2I+Cis8ZGQ+CitBIFB5dGhvbiB0eXBlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIFg1MDlOYW1lIG9iamVjdCB0eXBlLgorPC9kbD4KKworPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC05Jz48dHQgY2xhc3M9J2Z1bmN0aW9uJz5YNTA5TmFtZTwvdHQ+PC9hPjwvYj4oPHZhcj54NTA5bmFtZTwvdmFyPikKKzxkZD4KK0ZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgY29weSBvZiA8dmFyPng1MDluYW1lPC92YXI+LgorPC9kbD4KKworPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xMCc+PHR0Plg1MDlSZXFUeXBlPC90dD48L2E+PC9iPgorPGRkPgorQSBQeXRob24gdHlwZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBYNTA5UmVxIG9iamVjdCB0eXBlLgorPC9kbD4KKworPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xMSc+PHR0IGNsYXNzPSdmdW5jdGlvbic+WDUwOVJlcTwvdHQ+PC9hPjwvYj4oKQorPGRkPgorRmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gWDUwOVJlcSBvYmplY3QuCis8L2RsPgorCis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTEyJz48dHQ+WDUwOVN0b3JlVHlwZTwvdHQ+PC9hPjwvYj4KKzxkZD4KK0EgUHl0aG9uIHR5cGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgWDUwOVN0b3JlIG9iamVjdCB0eXBlLgorPC9kbD4KKworPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xMyc+PHR0PlBLZXlUeXBlPC90dD48L2E+PC9iPgorPGRkPgorQSBQeXRob24gdHlwZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBQS2V5IG9iamVjdCB0eXBlLgorPC9kbD4KKworPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xNCc+PHR0IGNsYXNzPSdmdW5jdGlvbic+UEtleTwvdHQ+PC9hPjwvYj4oKQorPGRkPgorRmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBQS2V5IG9iamVjdC4KKzwvZGw+CisKKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTUnPjx0dD5QS0NTN1R5cGU8L3R0PjwvYT48L2I+Cis8ZGQ+CitBIFB5dGhvbiB0eXBlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIFBLQ1M3IG9iamVjdCB0eXBlLgorPC9kbD4KKworPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0xNic+PHR0PlBLQ1MxMlR5cGU8L3R0PjwvYT48L2I+Cis8ZGQ+CitBIFB5dGhvbiB0eXBlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIFBLQ1MxMiBvYmplY3QgdHlwZS4KKzwvZGw+CisKKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTcnPjx0dD5YNTA5RXh0ZW5zaW9uVHlwZTwvdHQ+PC9hPjwvYj4KKzxkZD4KK0EgUHl0aG9uIHR5cGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgWDUwOUV4dGVuc2lvbiBvYmplY3QgdHlwZS4KKzwvZGw+CisKKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMTgnPjx0dCBjbGFzcz0nZnVuY3Rpb24nPlg1MDlFeHRlbnNpb248L3R0PjwvYT48L2I+KDx2YXI+dHlwZW5hbWUsIGNyaXRpY2FsLCB2YWx1ZTwvdmFyPikKKzxkZD4KK0ZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgWDUwOUV4dGVuc2lvbiBvYmplY3QuCis8L2RsPgorCis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTE5Jz48dHQ+TmV0c2NhcGVTUEtJVHlwZTwvdHQ+PC9hPjwvYj4KKzxkZD4KK0EgUHl0aG9uIHR5cGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgTmV0c2NhcGVTUEtJIG9iamVjdCB0eXBlLgorPC9kbD4KKworPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0yMCc+PHR0IGNsYXNzPSdmdW5jdGlvbic+TmV0c2NhcGVTUEtJPC90dD48L2E+PC9iPig8YmlnPls8L2JpZz48dmFyPmVuYzwvdmFyPjxiaWc+XTwvYmlnPikKKzxkZD4KK0ZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgTmV0c2NhcGVTUEtJIG9iamVjdC4gSWYgdGhlIDx2YXI+ZW5jPC92YXI+IGFyZ3VtZW50CitpcyBwcmVzZW50LCBpdCBzaG91bGQgYmUgYSBiYXNlNjQtZW5jb2RlZCBzdHJpbmcgcmVwcmVzZW50aW5nIGEgTmV0c2NhcGVTUEtJCitvYmplY3QsIGFzIHJldHVybmVkIGJ5IHRoZSA8dHQgY2xhc3M9Im1ldGhvZCI+YjY0X2VuY29kZTwvdHQ+IG1ldGhvZC4KKzwvZGw+CisKKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMjEnPjx0dD5GSUxFVFlQRV9QRU08L3R0PjwvYT48L2I+Cis8ZGQ+Cis8ZHQ+PGI+PGEgbmFtZT0nbDJoLTMyJz48dHQ+RklMRVRZUEVfQVNOMTwvdHQ+PC9hPjwvYj48ZGQ+CitGaWxlIHR5cGUgY29uc3RhbnRzLgorPC9kbD4KKworPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0yMic+PHR0PlRZUEVfUlNBPC90dD48L2E+PC9iPgorPGRkPgorPGR0PjxiPjxhIG5hbWU9J2wyaC0zMyc+PHR0PlRZUEVfRFNBPC90dD48L2E+PC9iPjxkZD4KK0tleSB0eXBlIGNvbnN0YW50cy4KKzwvZGw+CisKKzxQPgorPGRsPjxkdD48Yj5leGNlcHRpb24gPGEgbmFtZT0nbDJoLTIzJz48dHQgY2xhc3M9J2V4Y2VwdGlvbic+RXJyb3I8L3R0PjwvYT48L2I+Cis8ZGQ+CitHZW5lcmljIGV4Y2VwdGlvbiB1c2VkIGluIHRoZSA8dHQgY2xhc3M9Im1vZHVsZSI+Y3J5cHRvPC90dD4gbW9kdWxlLgorPC9kbD4KKworPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0yNCc+PHR0IGNsYXNzPSdmdW5jdGlvbic+ZHVtcF9jZXJ0aWZpY2F0ZTwvdHQ+PC9hPjwvYj4oPHZhcj50eXBlLCBjZXJ0PC92YXI+KQorPGRkPgorRHVtcCB0aGUgY2VydGlmaWNhdGUgPHZhcj5jZXJ0PC92YXI+IGludG8gYSBidWZmZXIgc3RyaW5nIGVuY29kZWQgd2l0aCB0aGUgdHlwZQorPHZhcj50eXBlPC92YXI+LgorPC9kbD4KKworPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0yNSc+PHR0IGNsYXNzPSdmdW5jdGlvbic+ZHVtcF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0PC90dD48L2E+PC9iPig8dmFyPnR5cGUsIHJlcTwvdmFyPikKKzxkZD4KK0R1bXAgdGhlIGNlcnRpZmljYXRlIHJlcXVlc3QgPHZhcj5yZXE8L3Zhcj4gaW50byBhIGJ1ZmZlciBzdHJpbmcgZW5jb2RlZCB3aXRoIHRoZQordHlwZSA8dmFyPnR5cGU8L3Zhcj4uCis8L2RsPgorCis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTI2Jz48dHQgY2xhc3M9J2Z1bmN0aW9uJz5kdW1wX3ByaXZhdGVrZXk8L3R0PjwvYT48L2I+KDx2YXI+dHlwZSwgcGtleTwvdmFyPjxiaWc+WzwvYmlnPjx2YXI+LCBjaXBoZXIsIHBhc3NwaHJhc2U8L3Zhcj48YmlnPl08L2JpZz4pCis8ZGQ+CitEdW1wIHRoZSBwcml2YXRlIGtleSA8dmFyPnBrZXk8L3Zhcj4gaW50byBhIGJ1ZmZlciBzdHJpbmcgZW5jb2RlZCB3aXRoIHRoZSB0eXBlCis8dmFyPnR5cGU8L3Zhcj4sIG9wdGlvbmFsbHkgKGlmIDx2YXI+dHlwZTwvdmFyPiBpcyA8dHQgY2xhc3M9ImNvbnN0YW50Ij5GSUxFVFlQRV9QRU08L3R0PikgZW5jcnlwdGluZyBpdAordXNpbmcgPHZhcj5jaXBoZXI8L3Zhcj4gYW5kIDx2YXI+cGFzc3BocmFzZTwvdmFyPi4KKworPFA+Cis8dmFyPnBhc3NwaHJhc2U8L3Zhcj4gbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYSBjYWxsYmFjayBmb3IgcHJvdmlkaW5nIHRoZQorcGFzcyBwaHJhc2UuCis8L2RsPgorCis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTI3Jz48dHQgY2xhc3M9J2Z1bmN0aW9uJz5sb2FkX2NlcnRpZmljYXRlPC90dD48L2E+PC9iPig8dmFyPnR5cGUsIGJ1ZmZlcjwvdmFyPikKKzxkZD4KK0xvYWQgYSBjZXJ0aWZpY2F0ZSAoWDUwOSkgZnJvbSB0aGUgc3RyaW5nIDx2YXI+YnVmZmVyPC92YXI+IGVuY29kZWQgd2l0aCB0aGUKK3R5cGUgPHZhcj50eXBlPC92YXI+LgorPC9kbD4KKworPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0yOCc+PHR0IGNsYXNzPSdmdW5jdGlvbic+bG9hZF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0PC90dD48L2E+PC9iPig8dmFyPnR5cGUsIGJ1ZmZlcjwvdmFyPikKKzxkZD4KK0xvYWQgYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IChYNTA5UmVxKSBmcm9tIHRoZSBzdHJpbmcgPHZhcj5idWZmZXI8L3Zhcj4gZW5jb2RlZCB3aXRoCit0aGUgdHlwZSA8dmFyPnR5cGU8L3Zhcj4uCis8L2RsPgorCis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTI5Jz48dHQgY2xhc3M9J2Z1bmN0aW9uJz5sb2FkX3ByaXZhdGVrZXk8L3R0PjwvYT48L2I+KDx2YXI+dHlwZSwgYnVmZmVyPC92YXI+PGJpZz5bPC9iaWc+PHZhcj4sIHBhc3NwaHJhc2U8L3Zhcj48YmlnPl08L2JpZz4pCis8ZGQ+CitMb2FkIGEgcHJpdmF0ZSBrZXkgKFBLZXkpIGZyb20gdGhlIHN0cmluZyA8dmFyPmJ1ZmZlcjwvdmFyPiBlbmNvZGVkIHdpdGgKK3RoZSB0eXBlIDx2YXI+dHlwZTwvdmFyPiAobXVzdCBiZSBvbmUgb2YgPHR0IGNsYXNzPSJjb25zdGFudCI+RklMRVRZUEVfUEVNPC90dD4gYW5kCis8dHQgY2xhc3M9ImNvbnN0YW50Ij5GSUxFVFlQRV9BU04xPC90dD4pLgorCis8UD4KKzx2YXI+cGFzc3BocmFzZTwvdmFyPiBtdXN0IGJlIGVpdGhlciBhIHN0cmluZyBvciBhIGNhbGxiYWNrIGZvciBwcm92aWRpbmcgdGhlCitwYXNzIHBocmFzZS4KKzwvZGw+CisKKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMzAnPjx0dCBjbGFzcz0nZnVuY3Rpb24nPmxvYWRfcGtjczdfZGF0YTwvdHQ+PC9hPjwvYj4oPHZhcj50eXBlLCBidWZmZXI8L3Zhcj4pCis8ZGQ+CitMb2FkIHBrY3M3IGRhdGEgZnJvbSB0aGUgc3RyaW5nIDx2YXI+YnVmZmVyPC92YXI+IGVuY29kZWQgd2l0aCB0aGUgdHlwZSA8dmFyPnR5cGU8L3Zhcj4uCis8L2RsPgorCis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTMxJz48dHQgY2xhc3M9J2Z1bmN0aW9uJz5sb2FkX3BrY3MxMjwvdHQ+PC9hPjwvYj4oPHZhcj5idWZmZXI8L3Zhcj48YmlnPls8L2JpZz48dmFyPiwgcGFzc3BocmFzZTwvdmFyPjxiaWc+XTwvYmlnPikKKzxkZD4KK0xvYWQgcGtjczEyIGRhdGEgZnJvbSB0aGUgc3RyaW5nIDx2YXI+YnVmZmVyPC92YXI+LiBJZiB0aGUgcGtjczEyIHN0cnVjdHVyZSBpcworZW5jcnlwdGVkLCBhIDx2YXI+cGFzc3BocmFzZTwvdmFyPiBtdXN0IGJlIGluY2x1ZGVkLgorPC9kbD4KKworPFA+CisKKzxwPjxocj4KKworPCEtLVRhYmxlIG9mIENoaWxkLUxpbmtzLS0+Cis8QSBOQU1FPSJDSElMRF9MSU5LUyI+PFNUUk9ORz5TdWJzZWN0aW9uczwvU1RST05HPjwvQT4KKworPFVMIENMQVNTPSJDaGlsZExpbmtzIj4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDEzNyIKKyAgaHJlZj0ib3BlbnNzbC14NTA5Lmh0bWwiPjMuMS4xIFg1MDkgb2JqZWN0cyA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwxMzgiCisgIGhyZWY9Im9wZW5zc2wteDUwOW5hbWUuaHRtbCI+My4xLjIgWDUwOU5hbWUgb2JqZWN0cyA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwxMzkiCisgIGhyZWY9Im9wZW5zc2wteDUwOXJlcS5odG1sIj4zLjEuMyBYNTA5UmVxIG9iamVjdHMgPC9BPgorPExJPjxBIE5BTUU9InRleDJodG1sMTQwIgorICBocmVmPSJvcGVuc3NsLXg1MDlzdG9yZS5odG1sIj4zLjEuNCBYNTA5U3RvcmUgb2JqZWN0cyA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwxNDEiCisgIGhyZWY9Im9wZW5zc2wtcGtleS5odG1sIj4zLjEuNSBQS2V5IG9iamVjdHMgPC9BPgorPExJPjxBIE5BTUU9InRleDJodG1sMTQyIgorICBocmVmPSJvcGVuc3NsLXBrY3M3Lmh0bWwiPjMuMS42IFBLQ1M3IG9iamVjdHMgPC9BPgorPExJPjxBIE5BTUU9InRleDJodG1sMTQzIgorICBocmVmPSJvcGVuc3NsLXBrY3MxMi5odG1sIj4zLjEuNyBQS0NTMTIgb2JqZWN0cyA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwxNDQiCisgIGhyZWY9Im9wZW5zc2wtNTA5ZXh0Lmh0bWwiPjMuMS44IFg1MDlFeHRlbnNpb24gb2JqZWN0cyA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwxNDUiCisgIGhyZWY9Im9wZW5zc2wtbmV0c2NhcGUtc3BraS5odG1sIj4zLjEuOSBOZXRzY2FwZVNQS0kgb2JqZWN0cyA8L0E+Cis8L1VMPgorPCEtLUVuZCBvZiBUYWJsZSBvZiBDaGlsZC1MaW5rcy0tPgorCis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzxwPjxocj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLmh0bWwiPjxpbWcgc3JjPSJwcmV2aW91cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iUHJldmlvdXMgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLmh0bWwiPjxpbWcgc3JjPSJ1cC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iVXAgT25lIExldmVsIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wteDUwOS5odG1sIj48aW1nIHNyYz0ibmV4dC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iTmV4dCBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj5QeXRob24gT3BlblNTTCBNYW51YWw8L3RkPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJjb250ZW50cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iQ29udGVudHMiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzwvdHI+PC90YWJsZT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+UHJldmlvdXM6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC5odG1sIj4zIE9wZW5TU0wgIDwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+VXA6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC5odG1sIj4zIE9wZW5TU0wgIDwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+TmV4dDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLXg1MDkuaHRtbCI+My4xLjEgWDUwOSBvYmplY3RzPC9BPgorPGhyPgorPHNwYW4gY2xhc3M9InJlbGVhc2UtaW5mbyI+UmVsZWFzZSAwLjYuPC9zcGFuPgorPC9ESVY+Cis8IS0tRW5kIG9mIE5hdmlnYXRpb24gUGFuZWwtLT4KKworPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jL2h0bWwvb3BlbnNzbC1uZXRzY2FwZS1zcGtpLmh0bWwgYi9kb2MvaHRtbC9vcGVuc3NsLW5ldHNjYXBlLXNwa2kuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjA4ZTJmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2h0bWwvb3BlbnNzbC1uZXRzY2FwZS1zcGtpLmh0bWwKQEAgLTAsMCArMSwxMTIgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPjMuMS45IE5ldHNjYXBlU1BLSSBvYmplY3RzIDwvdGl0bGU+Cis8TUVUQSBOQU1FPSJkZXNjcmlwdGlvbiIgQ09OVEVOVD0iMy4xLjkgTmV0c2NhcGVTUEtJIG9iamVjdHMgIj4KKzxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJweU9wZW5TU0wiPgorPE1FVEEgTkFNRT0icmVzb3VyY2UtdHlwZSIgQ09OVEVOVD0iZG9jdW1lbnQiPgorPE1FVEEgTkFNRT0iZGlzdHJpYnV0aW9uIiBDT05URU5UPSJnbG9iYWwiPgorPGxpbmsgcmVsPSJTVFlMRVNIRUVUIiBocmVmPSJweU9wZW5TU0wuY3NzIj4KKzxMSU5LIFJFTD0icHJldmlvdXMiIGhyZWY9Im9wZW5zc2wtNTA5ZXh0Lmh0bWwiPgorPExJTksgUkVMPSJ1cCIgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+Cis8TElOSyBSRUw9Im5leHQiIGhyZWY9Im9wZW5zc2wtcmFuZC5odG1sIj4KKzwvaGVhZD4KKzxib2R5PgorPERJViBDTEFTUz0ibmF2aWdhdGlvbiI+Cis8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMiI+Cis8dHI+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC01MDlleHQuaHRtbCI+PGltZyBzcmM9InByZXZpb3VzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJQcmV2aW91cyBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPjxpbWcgc3JjPSJ1cC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iVXAgT25lIExldmVsIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtcmFuZC5odG1sIj48aW1nIHNyYz0ibmV4dC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iTmV4dCBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj5QeXRob24gT3BlblNTTCBNYW51YWw8L3RkPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJjb250ZW50cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iQ29udGVudHMiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzwvdHI+PC90YWJsZT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+UHJldmlvdXM6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC01MDlleHQuaHRtbCI+My4xLjggWDUwOUV4dGVuc2lvbiBvYmplY3RzPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5VcDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLWNyeXB0by5odG1sIj4zLjEgY3J5cHRvICA8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPk5leHQ6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1yYW5kLmh0bWwiPjMuMiByYW5kICA8L0E+Cis8YnI+PGhyPgorPC9ESVY+Cis8IS0tRW5kIG9mIE5hdmlnYXRpb24gUGFuZWwtLT4KKworPEgzPjxBIE5BTUU9IlNFQ1RJT04wMDA0MTkwMDAwMDAwMDAwMDAwMDAiPiZuYnNwOzwvQT4KKzxCUj4KKzMuMS45IE5ldHNjYXBlU1BLSSBvYmplY3RzIAorPC9IMz4KKzxQPgorPEVNPjxFTT48RU0+TmV0c2NhcGVTUEtJIG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Cis8L0VNPjwvRU0+PC9FTT4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtNzYnPjx0dCBjbGFzcz0nbWV0aG9kJz5iNjRfZW5jb2RlPC90dD48L2E+PC9iPigpCis8ZGQ+CitSZXR1cm4gYSBiYXNlNjQtZW5jb2RlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC4KKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTc3Jz48dHQgY2xhc3M9J21ldGhvZCc+Z2V0X3B1YmtleTwvdHQ+PC9hPjwvYj4oKQorPGRkPgorUmV0dXJuIHRoZSBwdWJsaWMga2V5IG9mIG9iamVjdC4KKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTc4Jz48dHQgY2xhc3M9J21ldGhvZCc+c2V0X3B1YmtleTwvdHQ+PC9hPjwvYj4oPHZhcj5rZXk8L3Zhcj4pCis8ZGQ+CitTZXQgdGhlIHB1YmxpYyBrZXkgb2YgdGhlIG9iamVjdCB0byA8dmFyPmtleTwvdmFyPi4KKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTc5Jz48dHQgY2xhc3M9J21ldGhvZCc+c2lnbjwvdHQ+PC9hPjwvYj4oPHZhcj5rZXksIGRpZ2VzdF9uYW1lPC92YXI+KQorPGRkPgorU2lnbiB0aGUgTmV0c2NhcGVTUEtJIG9iamVjdCB1c2luZyB0aGUgZ2l2ZW4gPHZhcj5rZXk8L3Zhcj4gYW5kIDx2YXI+ZGlnZXN0X25hbWU8L3Zhcj4uCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC04MCc+PHR0IGNsYXNzPSdtZXRob2QnPnZlcmlmeTwvdHQ+PC9hPjwvYj4oPHZhcj5rZXk8L3Zhcj4pCis8ZGQ+CitWZXJpZnkgdGhlIE5ldHNjYXBlU1BLSSBvYmplY3QgdXNpbmcgdGhlIGdpdmVuIDx2YXI+a2V5PC92YXI+LgorPC9kbD4KKzxQPgorCis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzxwPjxocj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLTUwOWV4dC5odG1sIj48aW1nIHNyYz0icHJldmlvdXMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlByZXZpb3VzIFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1yYW5kLmh0bWwiPjxpbWcgc3JjPSJuZXh0LmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJOZXh0IFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvdGQ+Cis8dGQ+PEEgaHJlZj0iY29udGVudHMuaHRtbCI+PGltZyBzcmM9ImNvbnRlbnRzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJDb250ZW50cyIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPC90cj48L3RhYmxlPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5QcmV2aW91czo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLTUwOWV4dC5odG1sIj4zLjEuOCBYNTA5RXh0ZW5zaW9uIG9iamVjdHM8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlVwOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPjMuMSBjcnlwdG8gIDwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+TmV4dDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLXJhbmQuaHRtbCI+My4yIHJhbmQgIDwvQT4KKzxocj4KKzxzcGFuIGNsYXNzPSJyZWxlYXNlLWluZm8iPlJlbGVhc2UgMC42Ljwvc3Bhbj4KKzwvRElWPgorPCEtLUVuZCBvZiBOYXZpZ2F0aW9uIFBhbmVsLS0+CisKKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvYy9odG1sL29wZW5zc2wtcGtjczEyLmh0bWwgYi9kb2MvaHRtbC9vcGVuc3NsLXBrY3MxMi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ODE2NTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaHRtbC9vcGVuc3NsLXBrY3MxMi5odG1sCkBAIC0wLDAgKzEsMTA0IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT4zLjEuNyBQS0NTMTIgb2JqZWN0cyA8L3RpdGxlPgorPE1FVEEgTkFNRT0iZGVzY3JpcHRpb24iIENPTlRFTlQ9IjMuMS43IFBLQ1MxMiBvYmplY3RzICI+Cis8TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0icHlPcGVuU1NMIj4KKzxNRVRBIE5BTUU9InJlc291cmNlLXR5cGUiIENPTlRFTlQ9ImRvY3VtZW50Ij4KKzxNRVRBIE5BTUU9ImRpc3RyaWJ1dGlvbiIgQ09OVEVOVD0iZ2xvYmFsIj4KKzxsaW5rIHJlbD0iU1RZTEVTSEVFVCIgaHJlZj0icHlPcGVuU1NMLmNzcyI+Cis8TElOSyBSRUw9Im5leHQiIGhyZWY9Im9wZW5zc2wtNTA5ZXh0Lmh0bWwiPgorPExJTksgUkVMPSJwcmV2aW91cyIgaHJlZj0ib3BlbnNzbC1wa2NzNy5odG1sIj4KKzxMSU5LIFJFTD0idXAiIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPgorPExJTksgUkVMPSJuZXh0IiBocmVmPSJvcGVuc3NsLTUwOWV4dC5odG1sIj4KKzwvaGVhZD4KKzxib2R5PgorPERJViBDTEFTUz0ibmF2aWdhdGlvbiI+Cis8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMiI+Cis8dHI+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1wa2NzNy5odG1sIj48aW1nIHNyYz0icHJldmlvdXMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlByZXZpb3VzIFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC01MDlleHQuaHRtbCI+PGltZyBzcmM9Im5leHQuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9Ik5leHQgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC90ZD4KKzx0ZD48QSBocmVmPSJjb250ZW50cy5odG1sIj48aW1nIHNyYz0iY29udGVudHMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IkNvbnRlbnRzIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8L3RyPjwvdGFibGU+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlByZXZpb3VzOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wtcGtjczcuaHRtbCI+My4xLjYgUEtDUzcgb2JqZWN0czwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+VXA6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+My4xIGNyeXB0byAgPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wtNTA5ZXh0Lmh0bWwiPjMuMS44IFg1MDlFeHRlbnNpb24gb2JqZWN0czwvQT4KKzxicj48aHI+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorCis8SDM+PEEgTkFNRT0iU0VDVElPTjAwMDQxNzAwMDAwMDAwMDAwMDAwMCI+Jm5ic3A7PC9BPgorPEJSPgorMy4xLjcgUEtDUzEyIG9iamVjdHMgCis8L0gzPgorPFA+Cis8RU0+PEVNPjxFTT5QS0NTMTIgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKzwvRU0+PC9FTT48L0VNPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC03Mic+PHR0IGNsYXNzPSdtZXRob2QnPmdldF9jZXJ0aWZpY2F0ZTwvdHQ+PC9hPjwvYj4oKQorPGRkPgorUmV0dXJuIGNlcnRpZmljYXRlIHBvcnRpb24gb2YgdGhlIFBLQ1MxMiBzdHJ1Y3R1cmUuCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC03Myc+PHR0IGNsYXNzPSdtZXRob2QnPmdldF9wcml2YXRla2V5PC90dD48L2E+PC9iPigpCis8ZGQ+CitSZXR1cm4gcHJpdmF0ZSBrZXkgcG9ydGlvbiBvZiB0aGUgUEtDUzEyIHN0cnVjdHVyZQorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtNzQnPjx0dCBjbGFzcz0nbWV0aG9kJz5nZXRfY2FfY2VydGlmaWNhdGVzPC90dD48L2E+PC9iPigpCis8ZGQ+CitSZXR1cm4gQ0EgY2VydGlmaWNhdGVzIHdpdGhpbiB0aGUgUEtDUzEyIG9iamVjdCBhcyBhIHR1cGxlLiBSZXR1cm5zCitOb25lIGlmIG5vIENBIGNlcnRpZmljYXRlcyBhcmUgcHJlc2VudC4KKzwvZGw+Cis8UD4KKworPERJViBDTEFTUz0ibmF2aWdhdGlvbiI+Cis8cD48aHI+Cis8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMiI+Cis8dHI+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1wa2NzNy5odG1sIj48aW1nIHNyYz0icHJldmlvdXMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlByZXZpb3VzIFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC01MDlleHQuaHRtbCI+PGltZyBzcmM9Im5leHQuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9Ik5leHQgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC90ZD4KKzx0ZD48QSBocmVmPSJjb250ZW50cy5odG1sIj48aW1nIHNyYz0iY29udGVudHMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IkNvbnRlbnRzIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8L3RyPjwvdGFibGU+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlByZXZpb3VzOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wtcGtjczcuaHRtbCI+My4xLjYgUEtDUzcgb2JqZWN0czwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+VXA6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+My4xIGNyeXB0byAgPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wtNTA5ZXh0Lmh0bWwiPjMuMS44IFg1MDlFeHRlbnNpb24gb2JqZWN0czwvQT4KKzxocj4KKzxzcGFuIGNsYXNzPSJyZWxlYXNlLWluZm8iPlJlbGVhc2UgMC42Ljwvc3Bhbj4KKzwvRElWPgorPCEtLUVuZCBvZiBOYXZpZ2F0aW9uIFBhbmVsLS0+CisKKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvYy9odG1sL29wZW5zc2wtcGtjczcuaHRtbCBiL2RvYy9odG1sL29wZW5zc2wtcGtjczcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTViZjhlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2h0bWwvb3BlbnNzbC1wa2NzNy5odG1sCkBAIC0wLDAgKzEsMTEzIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT4zLjEuNiBQS0NTNyBvYmplY3RzIDwvdGl0bGU+Cis8TUVUQSBOQU1FPSJkZXNjcmlwdGlvbiIgQ09OVEVOVD0iMy4xLjYgUEtDUzcgb2JqZWN0cyAiPgorPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9InB5T3BlblNTTCI+Cis8TUVUQSBOQU1FPSJyZXNvdXJjZS10eXBlIiBDT05URU5UPSJkb2N1bWVudCI+Cis8TUVUQSBOQU1FPSJkaXN0cmlidXRpb24iIENPTlRFTlQ9Imdsb2JhbCI+Cis8bGluayByZWw9IlNUWUxFU0hFRVQiIGhyZWY9InB5T3BlblNTTC5jc3MiPgorPExJTksgUkVMPSJuZXh0IiBocmVmPSJvcGVuc3NsLXBrY3MxMi5odG1sIj4KKzxMSU5LIFJFTD0icHJldmlvdXMiIGhyZWY9Im9wZW5zc2wtcGtleS5odG1sIj4KKzxMSU5LIFJFTD0idXAiIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPgorPExJTksgUkVMPSJuZXh0IiBocmVmPSJvcGVuc3NsLXBrY3MxMi5odG1sIj4KKzwvaGVhZD4KKzxib2R5PgorPERJViBDTEFTUz0ibmF2aWdhdGlvbiI+Cis8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMiI+Cis8dHI+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1wa2V5Lmh0bWwiPjxpbWcgc3JjPSJwcmV2aW91cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iUHJldmlvdXMgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLWNyeXB0by5odG1sIj48aW1nIHNyYz0idXAuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlVwIE9uZSBMZXZlbCIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLXBrY3MxMi5odG1sIj48aW1nIHNyYz0ibmV4dC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iTmV4dCBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj5QeXRob24gT3BlblNTTCBNYW51YWw8L3RkPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJjb250ZW50cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iQ29udGVudHMiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzwvdHI+PC90YWJsZT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+UHJldmlvdXM6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1wa2V5Lmh0bWwiPjMuMS41IFBLZXkgb2JqZWN0czwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+VXA6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+My4xIGNyeXB0byAgPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wtcGtjczEyLmh0bWwiPjMuMS43IFBLQ1MxMiBvYmplY3RzPC9BPgorPGJyPjxocj4KKzwvRElWPgorPCEtLUVuZCBvZiBOYXZpZ2F0aW9uIFBhbmVsLS0+CisKKzxIMz48QSBOQU1FPSJTRUNUSU9OMDAwNDE2MDAwMDAwMDAwMDAwMDAwIj4mbmJzcDs8L0E+Cis8QlI+CiszLjEuNiBQS0NTNyBvYmplY3RzIAorPC9IMz4KKzxQPgorPEVNPjxFTT48RU0+UEtDUzcgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKzwvRU0+PC9FTT48L0VNPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC02Nyc+PHR0IGNsYXNzPSdtZXRob2QnPnR5cGVfaXNfc2lnbmVkPC90dD48L2E+PC9iPigpCis8ZGQ+CitGSVhNRQorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtNjgnPjx0dCBjbGFzcz0nbWV0aG9kJz50eXBlX2lzX2VudmVsb3BlZDwvdHQ+PC9hPjwvYj4oKQorPGRkPgorRklYTUUKKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTY5Jz48dHQgY2xhc3M9J21ldGhvZCc+dHlwZV9pc19zaWduZWRBbmRFbnZlbG9wZWQ8L3R0PjwvYT48L2I+KCkKKzxkZD4KK0ZJWE1FCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC03MCc+PHR0IGNsYXNzPSdtZXRob2QnPnR5cGVfaXNfZGF0YTwvdHQ+PC9hPjwvYj4oKQorPGRkPgorRklYTUUKKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTcxJz48dHQgY2xhc3M9J21ldGhvZCc+Z2V0X3R5cGVfbmFtZTwvdHQ+PC9hPjwvYj4oKQorPGRkPgorR2V0IHRoZSB0eXBlIG5hbWUgb2YgdGhlIFBLQ1M3LgorPC9kbD4KKzxQPgorCis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzxwPjxocj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLXBrZXkuaHRtbCI+PGltZyBzcmM9InByZXZpb3VzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJQcmV2aW91cyBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPjxpbWcgc3JjPSJ1cC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iVXAgT25lIExldmVsIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtcGtjczEyLmh0bWwiPjxpbWcgc3JjPSJuZXh0LmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJOZXh0IFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvdGQ+Cis8dGQ+PEEgaHJlZj0iY29udGVudHMuaHRtbCI+PGltZyBzcmM9ImNvbnRlbnRzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJDb250ZW50cyIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPC90cj48L3RhYmxlPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5QcmV2aW91czo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLXBrZXkuaHRtbCI+My4xLjUgUEtleSBvYmplY3RzPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5VcDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLWNyeXB0by5odG1sIj4zLjEgY3J5cHRvICA8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPk5leHQ6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1wa2NzMTIuaHRtbCI+My4xLjcgUEtDUzEyIG9iamVjdHM8L0E+Cis8aHI+Cis8c3BhbiBjbGFzcz0icmVsZWFzZS1pbmZvIj5SZWxlYXNlIDAuNi48L3NwYW4+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kb2MvaHRtbC9vcGVuc3NsLXBrZXkuaHRtbCBiL2RvYy9odG1sL29wZW5zc2wtcGtleS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmY2E5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaHRtbC9vcGVuc3NsLXBrZXkuaHRtbApAQCAtMCwwICsxLDEwNCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+My4xLjUgUEtleSBvYmplY3RzIDwvdGl0bGU+Cis8TUVUQSBOQU1FPSJkZXNjcmlwdGlvbiIgQ09OVEVOVD0iMy4xLjUgUEtleSBvYmplY3RzICI+Cis8TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0icHlPcGVuU1NMIj4KKzxNRVRBIE5BTUU9InJlc291cmNlLXR5cGUiIENPTlRFTlQ9ImRvY3VtZW50Ij4KKzxNRVRBIE5BTUU9ImRpc3RyaWJ1dGlvbiIgQ09OVEVOVD0iZ2xvYmFsIj4KKzxsaW5rIHJlbD0iU1RZTEVTSEVFVCIgaHJlZj0icHlPcGVuU1NMLmNzcyI+Cis8TElOSyBSRUw9Im5leHQiIGhyZWY9Im9wZW5zc2wtcGtjczcuaHRtbCI+Cis8TElOSyBSRUw9InByZXZpb3VzIiBocmVmPSJvcGVuc3NsLXg1MDlzdG9yZS5odG1sIj4KKzxMSU5LIFJFTD0idXAiIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPgorPExJTksgUkVMPSJuZXh0IiBocmVmPSJvcGVuc3NsLXBrY3M3Lmh0bWwiPgorPC9oZWFkPgorPGJvZHk+Cis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLXg1MDlzdG9yZS5odG1sIj48aW1nIHNyYz0icHJldmlvdXMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlByZXZpb3VzIFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1wa2NzNy5odG1sIj48aW1nIHNyYz0ibmV4dC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iTmV4dCBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj5QeXRob24gT3BlblNTTCBNYW51YWw8L3RkPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJjb250ZW50cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iQ29udGVudHMiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzwvdHI+PC90YWJsZT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+UHJldmlvdXM6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC14NTA5c3RvcmUuaHRtbCI+My4xLjQgWDUwOVN0b3JlIG9iamVjdHM8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlVwOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPjMuMSBjcnlwdG8gIDwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+TmV4dDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLXBrY3M3Lmh0bWwiPjMuMS42IFBLQ1M3IG9iamVjdHM8L0E+Cis8YnI+PGhyPgorPC9ESVY+Cis8IS0tRW5kIG9mIE5hdmlnYXRpb24gUGFuZWwtLT4KKworPEgzPjxBIE5BTUU9IlNFQ1RJT04wMDA0MTUwMDAwMDAwMDAwMDAwMDAiPiZuYnNwOzwvQT4KKzxCUj4KKzMuMS41IFBLZXkgb2JqZWN0cyAKKzwvSDM+Cis8UD4KKzxFTT48RU0+PEVNPlRoZSBQS2V5IG9iamVjdCBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorPC9FTT48L0VNPjwvRU0+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTY0Jz48dHQgY2xhc3M9J21ldGhvZCc+Yml0czwvdHQ+PC9hPjwvYj4oKQorPGRkPgorUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBvZiB0aGUga2V5LgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtNjUnPjx0dCBjbGFzcz0nbWV0aG9kJz5nZW5lcmF0ZV9rZXk8L3R0PjwvYT48L2I+KDx2YXI+dHlwZSwgYml0czwvdmFyPikKKzxkZD4KK0dlbmVyYXRlIGEgcHVibGljL3ByaXZhdGUga2V5IHBhaXIgb2YgdGhlIHR5cGUgPHZhcj50eXBlPC92YXI+IChvbmUgb2YKKzx0dCBjbGFzcz0iY29uc3RhbnQiPlRZUEVfUlNBPC90dD4gYW5kIDx0dCBjbGFzcz0iY29uc3RhbnQiPlRZUEVfRFNBPC90dD4pIHdpdGggdGhlIHNpemUgPHZhcj5iaXRzPC92YXI+LgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtNjYnPjx0dCBjbGFzcz0nbWV0aG9kJz50eXBlPC90dD48L2E+PC9iPigpCis8ZGQ+CitSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGtleS4KKzwvZGw+Cis8UD4KKworPERJViBDTEFTUz0ibmF2aWdhdGlvbiI+Cis8cD48aHI+Cis8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMiI+Cis8dHI+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC14NTA5c3RvcmUuaHRtbCI+PGltZyBzcmM9InByZXZpb3VzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJQcmV2aW91cyBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPjxpbWcgc3JjPSJ1cC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iVXAgT25lIExldmVsIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtcGtjczcuaHRtbCI+PGltZyBzcmM9Im5leHQuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9Ik5leHQgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC90ZD4KKzx0ZD48QSBocmVmPSJjb250ZW50cy5odG1sIj48aW1nIHNyYz0iY29udGVudHMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IkNvbnRlbnRzIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8L3RyPjwvdGFibGU+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlByZXZpb3VzOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wteDUwOXN0b3JlLmh0bWwiPjMuMS40IFg1MDlTdG9yZSBvYmplY3RzPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5VcDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLWNyeXB0by5odG1sIj4zLjEgY3J5cHRvICA8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPk5leHQ6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1wa2NzNy5odG1sIj4zLjEuNiBQS0NTNyBvYmplY3RzPC9BPgorPGhyPgorPHNwYW4gY2xhc3M9InJlbGVhc2UtaW5mbyI+UmVsZWFzZSAwLjYuPC9zcGFuPgorPC9ESVY+Cis8IS0tRW5kIG9mIE5hdmlnYXRpb24gUGFuZWwtLT4KKworPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jL2h0bWwvb3BlbnNzbC1yYW5kLmh0bWwgYi9kb2MvaHRtbC9vcGVuc3NsLXJhbmQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDBmNjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2h0bWwvb3BlbnNzbC1yYW5kLmh0bWwKQEAgLTAsMCArMSwxNDUgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPjMuMiByYW5kIC0tIEFuIGludGVyZmFjZSB0byB0aGUgT3BlblNTTCBwc2V1ZG8gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgPC90aXRsZT4KKzxNRVRBIE5BTUU9ImRlc2NyaXB0aW9uIiBDT05URU5UPSIzLjIgcmFuZCAtLSBBbiBpbnRlcmZhY2UgdG8gdGhlIE9wZW5TU0wgcHNldWRvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yICI+Cis8TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0icHlPcGVuU1NMIj4KKzxNRVRBIE5BTUU9InJlc291cmNlLXR5cGUiIENPTlRFTlQ9ImRvY3VtZW50Ij4KKzxNRVRBIE5BTUU9ImRpc3RyaWJ1dGlvbiIgQ09OVEVOVD0iZ2xvYmFsIj4KKzxsaW5rIHJlbD0iU1RZTEVTSEVFVCIgaHJlZj0icHlPcGVuU1NMLmNzcyI+Cis8TElOSyBSRUw9Im5leHQiIGhyZWY9Im9wZW5zc2wtc3NsLmh0bWwiPgorPExJTksgUkVMPSJwcmV2aW91cyIgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+Cis8TElOSyBSRUw9InVwIiBocmVmPSJvcGVuc3NsLmh0bWwiPgorPExJTksgUkVMPSJuZXh0IiBocmVmPSJvcGVuc3NsLXNzbC5odG1sIj4KKzwvaGVhZD4KKzxib2R5PgorPERJViBDTEFTUz0ibmF2aWdhdGlvbiI+Cis8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMiI+Cis8dHI+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1uZXRzY2FwZS1zcGtpLmh0bWwiPjxpbWcgc3JjPSJwcmV2aW91cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iUHJldmlvdXMgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLmh0bWwiPjxpbWcgc3JjPSJ1cC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iVXAgT25lIExldmVsIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtc3NsLmh0bWwiPjxpbWcgc3JjPSJuZXh0LmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJOZXh0IFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvdGQ+Cis8dGQ+PEEgaHJlZj0iY29udGVudHMuaHRtbCI+PGltZyBzcmM9ImNvbnRlbnRzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJDb250ZW50cyIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPC90cj48L3RhYmxlPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5QcmV2aW91czo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLW5ldHNjYXBlLXNwa2kuaHRtbCI+My4xLjkgTmV0c2NhcGVTUEtJIG9iamVjdHM8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlVwOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wuaHRtbCI+MyBPcGVuU1NMICA8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPk5leHQ6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1zc2wuaHRtbCI+My4zIFNTTCAgPC9BPgorPGJyPjxocj4KKzwvRElWPgorPCEtLUVuZCBvZiBOYXZpZ2F0aW9uIFBhbmVsLS0+CisKKzxIMj48QSBOQU1FPSJTRUNUSU9OMDAwNDIwMDAwMDAwMDAwMDAwMDAwIj4mbmJzcDs8L0E+Cis8QlI+CiszLjIgPHR0IGNsYXNzPSJtb2R1bGUiPnJhbmQ8L3R0PiAtLSBBbiBpbnRlcmZhY2UgdG8gdGhlIE9wZW5TU0wgcHNldWRvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIAorPC9IMj4KKzxQPgorPEVNPjxFTT48RU0+Cis8L0VNPjwvRU0+PC9FTT4KKzxQPgorPEVNPjxFTT48RU0+VGhpcyBtb2R1bGUgaGFuZGxlcyB0aGUgT3BlblNTTCBwc2V1ZG8gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgKFBSTkcpIGFuZAorZGVjbGFyZXMgdGhlIGZvbGxvd2luZzoKKzwvRU0+PC9FTT48L0VNPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC04Mic+PHR0IGNsYXNzPSdmdW5jdGlvbic+YWRkPC90dD48L2E+PC9iPig8dmFyPnN0cmluZywgZW50cm9weTwvdmFyPikKKzxkZD4KK01peCBieXRlcyBmcm9tIDx2YXI+c3RyaW5nPC92YXI+IGludG8gdGhlIFBSTkcgc3RhdGUuIFRoZSA8dmFyPmVudHJvcHk8L3Zhcj4gYXJndW1lbnQgaXMKKyh0aGUgbG93ZXIgYm91bmQgb2YpIGFuIGVzdGltYXRlIG9mIGhvdyBtdWNoIHJhbmRvbW5lc3MgaXMgY29udGFpbmVkIGluCis8dmFyPnN0cmluZzwvdmFyPiwgbWVhc3VyZWQgaW4gYnl0ZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgZS5nLiA8YSBjbGFzcz0icmZjIiBuYW1lPSJyZmNyZWYtMTc4NSIKK2hyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE3NTAudHh0Ij5SRkMgMTc1MDwvYT4uCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC04Myc+PHR0IGNsYXNzPSdmdW5jdGlvbic+ZWdkPC90dD48L2E+PC9iPig8dmFyPnBhdGg8L3Zhcj48YmlnPls8L2JpZz48dmFyPiwgYnl0ZXM8L3Zhcj48YmlnPl08L2JpZz4pCis8ZGQ+CitRdWVyeSB0aGUgRW50cm9weSBHYXRoZXJpbmcgRGFlbW9uPEEgTkFNRT0idGV4Mmh0bWwzIgorICBIUkVGPSIjZm9vdDg5OCI+PFNVUD4zPC9TVVA+PC9BPiBvbiBzb2NrZXQgPHZhcj5wYXRoPC92YXI+IGZvciA8dmFyPmJ5dGVzPC92YXI+CitieXRlcyBvZiByYW5kb20gZGF0YSBhbmQgYW5kIHVzZXMgPHR0IGNsYXNzPSJmdW5jdGlvbiI+YWRkPC90dD4gdG8gc2VlZCB0aGUgUFJORy4gVGhlIGRlZmF1bHQKK3ZhbHVlIG9mIDx2YXI+Ynl0ZXM8L3Zhcj4gaXMgMjU1LgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtODQnPjx0dCBjbGFzcz0nZnVuY3Rpb24nPmxvYWRfZmlsZTwvdHQ+PC9hPjwvYj4oPHZhcj5wYXRoPC92YXI+PGJpZz5bPC9iaWc+PHZhcj4sIGJ5dGVzPC92YXI+PGJpZz5dPC9iaWc+KQorPGRkPgorUmVhZCA8dmFyPmJ5dGVzPC92YXI+IGJ5dGVzIChvciBhbGwgb2YgaXQsIGlmIDx2YXI+Ynl0ZXM8L3Zhcj4gaXMgbmVnYXRpdmUpIG9mIGRhdGEgZnJvbQordGhlIGZpbGUgPHZhcj5wYXRoPC92YXI+IHRvIHNlZWQgdGhlIFBSTkcuIFRoZSBkZWZhdWx0IHZhbHVlIG9mIDx2YXI+Ynl0ZXM8L3Zhcj4gaXMgLTEuCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC04NSc+PHR0IGNsYXNzPSdmdW5jdGlvbic+c2NyZWVuPC90dD48L2E+PC9iPigpCis8ZGQ+CitBZGQgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIHNjcmVlbiB0byB0aGUgUFJORyBzdGF0ZS4KK0F2YWlsYWJpbGl0eTogV2luZG93cy4KKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTg2Jz48dHQgY2xhc3M9J2Z1bmN0aW9uJz5zZWVkPC90dD48L2E+PC9iPig8dmFyPnN0cmluZzwvdmFyPikKKzxkZD4KK1RoaXMgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIDx0dCBjbGFzcz0iZnVuY3Rpb24iPmFkZDwvdHQ+IHdpdGggPHZhcj5lbnRyb3B5PC92YXI+IGFzIHRoZSBsZW5ndGgKK29mIHRoZSBzdHJpbmcuCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC04Nyc+PHR0IGNsYXNzPSdmdW5jdGlvbic+c3RhdHVzPC90dD48L2E+PC9iPigpCis8ZGQ+CitSZXR1cm5zIHRydWUgaWYgdGhlIFBSTkcgaGFzIGJlZW4gc2VlZGVkIHdpdGggZW5vdWdoIGRhdGEsIGFuZCBmYWxzZSBvdGhlcndpc2UuCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC04OCc+PHR0IGNsYXNzPSdmdW5jdGlvbic+d3JpdGVfZmlsZTwvdHQ+PC9hPjwvYj4oPHZhcj5wYXRoPC92YXI+KQorPGRkPgorV3JpdGUgYSBudW1iZXIgb2YgcmFuZG9tIGJ5dGVzIChjdXJyZW50bHkgMTAyNCkgdG8gdGhlIGZpbGUgPHZhcj5wYXRoPC92YXI+LiBUaGlzCitmaWxlIGNhbiB0aGVuIGJlIHVzZWQgd2l0aCA8dHQgY2xhc3M9ImZ1bmN0aW9uIj5sb2FkX2ZpbGU8L3R0PiB0byBzZWVkIHRoZSBQUk5HIGFnYWluLgorPC9kbD4KKzxQPgorPEJSPjxIUj48SDQ+Rm9vdG5vdGVzPC9IND4KKzxETD4KKzxEVD48QSBOQU1FPSJmb290ODk4Ij4uLi4gRGFlbW9uPC9BPjxBCisgaHJlZj0ib3BlbnNzbC1yYW5kLmh0bWwjdGV4Mmh0bWwzIj48U1VQPjM8L1NVUD48L0E+PC9EVD4KKzxERD5TZWUKKzxhIGNsYXNzPSJ1cmwiIGhyZWY9Imh0dHA6Ly93d3cubG90aGFyLmNvbS90ZWNoL2NyeXB0by8iPmh0dHA6Ly93d3cubG90aGFyLmNvbS90ZWNoL2NyeXB0by88L2E+CisKKzwvREQ+Cis8L0RMPgorPERJViBDTEFTUz0ibmF2aWdhdGlvbiI+Cis8cD48aHI+Cis8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMiI+Cis8dHI+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1uZXRzY2FwZS1zcGtpLmh0bWwiPjxpbWcgc3JjPSJwcmV2aW91cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iUHJldmlvdXMgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLmh0bWwiPjxpbWcgc3JjPSJ1cC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iVXAgT25lIExldmVsIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtc3NsLmh0bWwiPjxpbWcgc3JjPSJuZXh0LmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJOZXh0IFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvdGQ+Cis8dGQ+PEEgaHJlZj0iY29udGVudHMuaHRtbCI+PGltZyBzcmM9ImNvbnRlbnRzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJDb250ZW50cyIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPC90cj48L3RhYmxlPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5QcmV2aW91czo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLW5ldHNjYXBlLXNwa2kuaHRtbCI+My4xLjkgTmV0c2NhcGVTUEtJIG9iamVjdHM8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlVwOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wuaHRtbCI+MyBPcGVuU1NMICA8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPk5leHQ6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1zc2wuaHRtbCI+My4zIFNTTCAgPC9BPgorPGhyPgorPHNwYW4gY2xhc3M9InJlbGVhc2UtaW5mbyI+UmVsZWFzZSAwLjYuPC9zcGFuPgorPC9ESVY+Cis8IS0tRW5kIG9mIE5hdmlnYXRpb24gUGFuZWwtLT4KKworPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jL2h0bWwvb3BlbnNzbC1zc2wuaHRtbCBiL2RvYy9odG1sL29wZW5zc2wtc3NsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFlZTAwMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9odG1sL29wZW5zc2wtc3NsLmh0bWwKQEAgLTAsMCArMSwyMzAgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPjMuMyBTU0wgLS0gQW4gaW50ZXJmYWNlIHRvIHRoZSBTU0wtc3BlY2lmaWMgcGFydHMgb2YgT3BlblNTTCA8L3RpdGxlPgorPE1FVEEgTkFNRT0iZGVzY3JpcHRpb24iIENPTlRFTlQ9IjMuMyBTU0wgLS0gQW4gaW50ZXJmYWNlIHRvIHRoZSBTU0wtc3BlY2lmaWMgcGFydHMgb2YgT3BlblNTTCAiPgorPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9InB5T3BlblNTTCI+Cis8TUVUQSBOQU1FPSJyZXNvdXJjZS10eXBlIiBDT05URU5UPSJkb2N1bWVudCI+Cis8TUVUQSBOQU1FPSJkaXN0cmlidXRpb24iIENPTlRFTlQ9Imdsb2JhbCI+Cis8bGluayByZWw9IlNUWUxFU0hFRVQiIGhyZWY9InB5T3BlblNTTC5jc3MiPgorPExJTksgUkVMPSJwcmV2aW91cyIgaHJlZj0ib3BlbnNzbC1yYW5kLmh0bWwiPgorPExJTksgUkVMPSJ1cCIgaHJlZj0ib3BlbnNzbC5odG1sIj4KKzxMSU5LIFJFTD0ibmV4dCIgaHJlZj0ib3BlbnNzbC1jb250ZXh0Lmh0bWwiPgorPC9oZWFkPgorPGJvZHk+Cis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLXJhbmQuaHRtbCI+PGltZyBzcmM9InByZXZpb3VzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJQcmV2aW91cyBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wuaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1jb250ZXh0Lmh0bWwiPjxpbWcgc3JjPSJuZXh0LmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJOZXh0IFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvdGQ+Cis8dGQ+PEEgaHJlZj0iY29udGVudHMuaHRtbCI+PGltZyBzcmM9ImNvbnRlbnRzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJDb250ZW50cyIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPC90cj48L3RhYmxlPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5QcmV2aW91czo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLXJhbmQuaHRtbCI+My4yIHJhbmQgIDwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+VXA6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC5odG1sIj4zIE9wZW5TU0wgIDwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+TmV4dDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLWNvbnRleHQuaHRtbCI+My4zLjEgQ29udGV4dCBvYmplY3RzPC9BPgorPGJyPjxocj4KKzwvRElWPgorPCEtLUVuZCBvZiBOYXZpZ2F0aW9uIFBhbmVsLS0+Cis8SDI+PEEgTkFNRT0iU0VDVElPTjAwMDQzMDAwMDAwMDAwMDAwMDAwMCI+Jm5ic3A7PC9BPgorPEJSPgorMy4zIDx0dCBjbGFzcz0ibW9kdWxlIj5TU0w8L3R0PiAtLSBBbiBpbnRlcmZhY2UgdG8gdGhlIFNTTC1zcGVjaWZpYyBwYXJ0cyBvZiBPcGVuU1NMIAorPC9IMj4KKzxQPgorPEVNPjxFTT48RU0+Cis8L0VNPjwvRU0+PC9FTT4KKzxQPgorPEVNPjxFTT48RU0+VGhpcyBtb2R1bGUgaGFuZGxlcyB0aGluZ3Mgc3BlY2lmaWMgdG8gU1NMLiBUaGVyZSBhcmUgdHdvIG9iamVjdHMgZGVmaW5lZDoKK0NvbnRleHQsIENvbm5lY3Rpb24uCis8L0VNPjwvRU0+PC9FTT4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtOTAnPjx0dD5TU0x2Ml9NRVRIT0Q8L3R0PjwvYT48L2I+Cis8ZGQ+Cis8ZHQ+PGI+PGEgbmFtZT0nbDJoLTEwNCc+PHR0PlNTTHYzX01FVEhPRDwvdHQ+PC9hPjwvYj48ZGQ+Cis8ZHQ+PGI+PGEgbmFtZT0nbDJoLTEwNSc+PHR0PlNTTHYyM19NRVRIT0Q8L3R0PjwvYT48L2I+PGRkPgorPGR0PjxiPjxhIG5hbWU9J2wyaC0xMDYnPjx0dD5UTFN2MV9NRVRIT0Q8L3R0PjwvYT48L2I+PGRkPgorVGhlc2UgY29uc3RhbnRzIHJlcHJlc2VudCB0aGUgZGlmZmVyZW50IFNTTCBtZXRob2RzIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEKK2NvbnRleHQgb2JqZWN0LgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtOTEnPjx0dD5WRVJJRllfTk9ORTwvdHQ+PC9hPjwvYj4KKzxkZD4KKzxkdD48Yj48YSBuYW1lPSdsMmgtMTA3Jz48dHQ+VkVSSUZZX1BFRVI8L3R0PjwvYT48L2I+PGRkPgorPGR0PjxiPjxhIG5hbWU9J2wyaC0xMDgnPjx0dD5WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQ8L3R0PjwvYT48L2I+PGRkPgorVGhlc2UgY29uc3RhbnRzIHJlcHJlc2VudCB0aGUgdmVyaWZpY2F0aW9uIG1vZGUgdXNlZCBieSB0aGUgQ29udGV4dAorb2JqZWN0J3MgPHR0IGNsYXNzPSJtZXRob2QiPnNldF92ZXJpZnk8L3R0PiBtZXRob2QuCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC05Mic+PHR0PkZJTEVUWVBFX1BFTTwvdHQ+PC9hPjwvYj4KKzxkZD4KKzxkdD48Yj48YSBuYW1lPSdsMmgtMTA5Jz48dHQ+RklMRVRZUEVfQVNOMTwvdHQ+PC9hPjwvYj48ZGQ+CitGaWxlIHR5cGUgY29uc3RhbnRzIHVzZWQgd2l0aCB0aGUgPHR0IGNsYXNzPSJtZXRob2QiPnVzZV9jZXJ0aWZpY2F0ZV9maWxlPC90dD4gYW5kCis8dHQgY2xhc3M9Im1ldGhvZCI+dXNlX3ByaXZhdGVrZXlfZmlsZTwvdHQ+IG1ldGhvZHMgb2YgQ29udGV4dCBvYmplY3RzLgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtOTMnPjx0dD5PUF9TSU5HTEVfREhfVVNFPC90dD48L2E+PC9iPgorPGRkPgorPGR0PjxiPjxhIG5hbWU9J2wyaC0xMTAnPjx0dD5PUF9FUEhFTUVSQUxfUlNBPC90dD48L2E+PC9iPjxkZD4KKzxkdD48Yj48YSBuYW1lPSdsMmgtMTExJz48dHQ+T1BfTk9fU1NMdjI8L3R0PjwvYT48L2I+PGRkPgorPGR0PjxiPjxhIG5hbWU9J2wyaC0xMTInPjx0dD5PUF9OT19TU0x2MzwvdHQ+PC9hPjwvYj48ZGQ+Cis8ZHQ+PGI+PGEgbmFtZT0nbDJoLTExMyc+PHR0Pk9QX05PX1RMU3YxPC90dD48L2E+PC9iPjxkZD4KK0NvbnN0YW50cyB1c2VkIHdpdGggPHR0IGNsYXNzPSJtZXRob2QiPnNldF9vcHRpb25zPC90dD4gb2YgQ29udGV4dCBvYmplY3RzLgorPHR0IGNsYXNzPSJjb25zdGFudCI+T1BfU0lOR0xFX0RIX1VTRTwvdHQ+IG1lYW5zIHRvIGFsd2F5cyBjcmVhdGUgYSBuZXcga2V5IHdoZW4gdXNpbmcgZXBoZW1lcmFsCitEaWZmaWUtSGVsbG1hbi4gPHR0IGNsYXNzPSJjb25zdGFudCI+T1BfRVBIRU1FUkFMX1JTQTwvdHQ+IG1lYW5zIHRvIGFsd2F5cyB1c2UgZXBoZW1lcmFsIFJTQSBrZXlzCit3aGVuIGRvaW5nIFJTQSBvcGVyYXRpb25zLiA8dHQgY2xhc3M9ImNvbnN0YW50Ij5PUF9OT19TU0x2MjwvdHQ+LCA8dHQgY2xhc3M9ImNvbnN0YW50Ij5PUF9OT19TU0x2MzwvdHQ+IGFuZAorPHR0IGNsYXNzPSJjb25zdGFudCI+T1BfTk9fVExTdjE8L3R0PiBtZWFucyB0byBkaXNhYmxlIHRob3NlIHNwZWNpZmljIHByb3RvY29scy4gVGhpcyBpcworaW50ZXJlc3RpbmcgaWYgeW91J3JlIHVzaW5nIGUuZy4gPHR0IGNsYXNzPSJjb25zdGFudCI+U1NMdjIzX01FVEhPRDwvdHQ+IHRvIGdldCBhbiBTU0x2Mi1jb21wYXRpYmxlCitoYW5kc2hha2UsIGJ1dCBkb24ndCB3YW50IHRvIHVzZSBTU0x2Mi4KKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTk0Jz48dHQ+Q29udGV4dFR5cGU8L3R0PjwvYT48L2I+Cis8ZGQ+CitBIFB5dGhvbiB0eXBlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIENvbnRleHQgb2JqZWN0IHR5cGUuCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC05NSc+PHR0IGNsYXNzPSdmdW5jdGlvbic+Q29udGV4dDwvdHQ+PC9hPjwvYj4oPHZhcj5tZXRob2Q8L3Zhcj4pCis8ZGQ+CitGYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIG5ldyBDb250ZXh0IG9iamVjdCBnaXZlbiBhbiBTU0wgbWV0aG9kLiBUaGUKK21ldGhvZCBzaG91bGQgYmUgPHR0IGNsYXNzPSJjb25zdGFudCI+U1NMdjJfTUVUSE9EPC90dD4sIDx0dCBjbGFzcz0iY29uc3RhbnQiPlNTTHYzX01FVEhPRDwvdHQ+LAorPHR0IGNsYXNzPSJjb25zdGFudCI+U1NMdjIzX01FVEhPRDwvdHQ+IG9yIDx0dCBjbGFzcz0iY29uc3RhbnQiPlRMU3YxX01FVEhPRDwvdHQ+LgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtOTYnPjx0dD5Db25uZWN0aW9uVHlwZTwvdHQ+PC9hPjwvYj4KKzxkZD4KK0EgUHl0aG9uIHR5cGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgQ29ubmVjdGlvbiBvYmplY3QgdHlwZS4KKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTk3Jz48dHQgY2xhc3M9J2Z1bmN0aW9uJz5Db25uZWN0aW9uPC90dD48L2E+PC9iPig8dmFyPmNvbnRleHQsIHNvY2tldDwvdmFyPikKKzxkZD4KK0ZhY3RvcnkgZnVjbmN0aW9uIHRoYXQgY3JlYXRlcyBhIG5ldyBDb25uZWN0aW9uIG9iamVjdCBnaXZlbiBhbiBTU0wgY29udGV4dCBhbmQKK2Egc29ja2V0IDxBIE5BTUU9InRleDJodG1sNSIKKyAgSFJFRj0iI2Zvb3Q5MDEiPjxTVVA+NDwvU1VQPjwvQT4gb2JqZWN0LgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj5leGNlcHRpb24gPGEgbmFtZT0nbDJoLTk4Jz48dHQgY2xhc3M9J2V4Y2VwdGlvbic+RXJyb3I8L3R0PjwvYT48L2I+Cis8ZGQ+CitUaGlzIGV4Y2VwdGlvbiBpcyB1c2VkIGFzIGEgYmFzZSBjbGFzcyBmb3IgdGhlIG90aGVyIFNTTC1yZWxhdGVkCitleGNlcHRpb25zLCBidXQgbWF5IGFsc28gYmUgcmFpc2VkIGRpcmVjdGx5LgorPC9FTT48L0VNPjwvRU0+Cis8UD4KKzxFTT48RU0+PEVNPldoZW5ldmVyIHRoaXMgZXhjZXB0aW9uIGlzIHJhaXNlZCBkaXJlY3RseSwgaXQgaGFzIGEgbGlzdCBvZiBlcnJvciBtZXNzYWdlcworZnJvbSB0aGUgT3BlblNTTCBlcnJvciBxdWV1ZSwgd2hlcmUgZWFjaCBpdGVtIGlzIGEgdHVwbGUgPGNvZGU+KDx2YXI+bGliPC92YXI+LAorPHZhcj5mdW5jdGlvbjwvdmFyPiwgPHZhcj5yZWFzb248L3Zhcj4pPC9jb2RlPi4gSGVyZSA8dmFyPmxpYjwvdmFyPiwgPHZhcj5mdW5jdGlvbjwvdmFyPiBhbmQgPHZhcj5yZWFzb248L3Zhcj4KK2FyZSBhbGwgc3RyaW5ncywgZGVzY3JpYmluZyB3aGVyZSBhbmQgd2hhdCB0aGUgcHJvYmxlbSBpcy4gU2VlIDxzcGFuIGNsYXNzPSdtYW5wYWdlJz48aT5lcnI8L2k+KDMpPC9zcGFuPgorZm9yIG1vcmUgaW5mb3JtYXRpb24uCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPmV4Y2VwdGlvbiA8YSBuYW1lPSdsMmgtOTknPjx0dCBjbGFzcz0nZXhjZXB0aW9uJz5aZXJvUmV0dXJuRXJyb3I8L3R0PjwvYT48L2I+Cis8ZGQ+CitUaGlzIGV4Y2VwdGlvbiBtYXRjaGVzIHRoZSBlcnJvciByZXR1cm4gY29kZSA8Y29kZT5TU0xfRVJST1JfWkVST19SRVRVUk48L2NvZGU+LCBhbmQKK2lzIHJhaXNlZCB3aGVuIHRoZSBTU0wgQ29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQuIEluIFNTTCAzLjAgYW5kIFRMUyAxLjAsIHRoaXMKK29ubHkgb2NjdXJzIGlmIGEgY2xvc3VyZSBhbGVydCBoYXMgb2NjdXJyZWQgaW4gdGhlIHByb3RvY29sLCBpLmUuIHRoZQorY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQgY2xlYW5seS4gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgbmVjZXNzYXJpbHkKK21lYW4gdGhhdCB0aGUgdHJhbnNwb3J0IGxheWVyIChlLmcuIGEgc29ja2V0KSBoYXMgYmVlbiBjbG9zZWQuCis8L0VNPjwvRU0+PC9FTT4KKzxQPgorPEVNPjxFTT48RU0+SXQgbWF5IHNlZW0gYSBsaXR0bGUgc3RyYW5nZSB0aGF0IHRoaXMgaXMgYW4gZXhjZXB0aW9uLCBidXQgaXQgZG9lcyBtYXRjaCBhbgorPGNvZGU+U1NMX0VSUk9SPC9jb2RlPiBjb2RlLCBhbmQgaXMgdmVyeSBjb252ZW5pZW50LgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj5leGNlcHRpb24gPGEgbmFtZT0nbDJoLTEwMCc+PHR0IGNsYXNzPSdleGNlcHRpb24nPldhbnRSZWFkRXJyb3I8L3R0PjwvYT48L2I+Cis8ZGQ+CitUaGUgb3BlcmF0aW9uIGRpZCBub3QgY29tcGxldGU7IHRoZSBzYW1lIEkvTyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZ2FpbgorbGF0ZXIsIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzLiBBbnkgSS9PIG1ldGhvZCBjYW4gbGVhZCB0byB0aGlzIHNpbmNlIG5ldworaGFuZHNoYWtlcyBjYW4gb2NjdXIgYXQgYW55IHRpbWUuCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPmV4Y2VwdGlvbiA8YSBuYW1lPSdsMmgtMTAxJz48dHQgY2xhc3M9J2V4Y2VwdGlvbic+V2FudFdyaXRlRXJyb3I8L3R0PjwvYT48L2I+Cis8ZGQ+CitTZWUgPHR0IGNsYXNzPSJleGNlcHRpb24iPldhbnRSZWFkRXJyb3I8L3R0Pi4KKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+ZXhjZXB0aW9uIDxhIG5hbWU9J2wyaC0xMDInPjx0dCBjbGFzcz0nZXhjZXB0aW9uJz5XYW50WDUwOUxvb2t1cEVycm9yPC90dD48L2E+PC9iPgorPGRkPgorVGhlIG9wZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlIGJlY2F1c2UgYW4gYXBwbGljYXRpb24gY2FsbGJhY2sgaGFzIGFza2VkIHRvIGJlCitjYWxsZWQgYWdhaW4uIFRoZSBJL08gbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWdhaW4gbGF0ZXIsIHdpdGggdGhlIHNhbWUKK2FyZ3VtZW50cy4gTm90ZTogVGhpcyB3b24ndCBvY2N1ciBpbiB0aGlzIHZlcnNpb24sIGFzIHRoZXJlIGFyZSBubyBzdWNoCitjYWxsYmFja3MgaW4gdGhpcyB2ZXJzaW9uLgorPC9kbD4KKzxQPgorPGRsPjxkdD48Yj5leGNlcHRpb24gPGEgbmFtZT0nbDJoLTEwMyc+PHR0IGNsYXNzPSdleGNlcHRpb24nPlN5c0NhbGxFcnJvcjwvdHQ+PC9hPjwvYj4KKzxkZD4KK1RoZSA8dHQgY2xhc3M9ImV4Y2VwdGlvbiI+U3lzQ2FsbEVycm9yPC90dD4gb2NjdXJzIHdoZW4gdGhlcmUncyBhbiBJL08gZXJyb3IgYW5kIE9wZW5TU0wncworZXJyb3IgcXVldWUgZG9lcyBub3QgY29udGFpbiBhbnkgaW5mb3JtYXRpb24uIFRoaXMgY2FuIG1lYW4gdHdvIHRoaW5nczogQW4KK2Vycm9yIGluIHRoZSB0cmFuc3BvcnQgcHJvdG9jb2wsIG9yIGFuIGVuZCBvZiBmaWxlIHRoYXQgdmlvbGF0ZXMgdGhlIHByb3RvY29sLgorVGhlIHBhcmFtZXRlciB0byB0aGUgZXhjZXB0aW9uIGlzIGFsd2F5cyBhIHBhaXIgPGNvZGU+KDx2YXI+ZXJybnVtPC92YXI+LAorPHZhcj5lcnJzdHI8L3Zhcj4pPC9jb2RlPi4KKzwvZGw+Cis8UD4KKzxCUj48SFI+PEg0PkZvb3Rub3RlczwvSDQ+Cis8REw+Cis8RFQ+PEEgTkFNRT0iZm9vdDkwMSI+Li4uIHNvY2tldDwvQT48QQorIGhyZWY9Im9wZW5zc2wtc3NsLmh0bWwjdGV4Mmh0bWw1Ij48U1VQPjQ8L1NVUD48L0E+PC9EVD4KKzxERD5BY3R1YWxseSwgYWxsIHRoYXQgaXMgcmVxdWlyZWQgaXMgYW4gb2JqZWN0IHRoYXQKKzxpPmJlaGF2ZXM8L2k+IGxpa2UgYSBzb2NrZXQsIHlvdSBjb3VsZCBldmVuIHVzZSBmaWxlcywgZXZlbiB0aG91Z2ggaXQnZCBiZQordHJpY2t5IHRvIGdldCB0aGUgaGFuZHNoYWtlcyByaWdodCEKKworPC9ERD4KKzwvREw+Cis8cD48aHI+CisKKzwhLS1UYWJsZSBvZiBDaGlsZC1MaW5rcy0tPgorPEEgTkFNRT0iQ0hJTERfTElOS1MiPjxTVFJPTkc+U3Vic2VjdGlvbnM8L1NUUk9ORz48L0E+CisKKzxVTCBDTEFTUz0iQ2hpbGRMaW5rcyI+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwyNjMiCisgIGhyZWY9Im9wZW5zc2wtY29udGV4dC5odG1sIj4zLjMuMSBDb250ZXh0IG9iamVjdHMgPC9BPgorPExJPjxBIE5BTUU9InRleDJodG1sMjY0IgorICBocmVmPSJvcGVuc3NsLWNvbm5lY3Rpb24uaHRtbCI+My4zLjIgQ29ubmVjdGlvbiBvYmplY3RzIDwvQT4KKzwvVUw+Cis8IS0tRW5kIG9mIFRhYmxlIG9mIENoaWxkLUxpbmtzLS0+CisKKzxESVYgQ0xBU1M9Im5hdmlnYXRpb24iPgorPHA+PGhyPgorPHRhYmxlIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjIiPgorPHRyPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtcmFuZC5odG1sIj48aW1nIHNyYz0icHJldmlvdXMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlByZXZpb3VzIFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC5odG1sIj48aW1nIHNyYz0idXAuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlVwIE9uZSBMZXZlbCIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLWNvbnRleHQuaHRtbCI+PGltZyBzcmM9Im5leHQuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9Ik5leHQgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC90ZD4KKzx0ZD48QSBocmVmPSJjb250ZW50cy5odG1sIj48aW1nIHNyYz0iY29udGVudHMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IkNvbnRlbnRzIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8L3RyPjwvdGFibGU+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlByZXZpb3VzOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wtcmFuZC5odG1sIj4zLjIgcmFuZCAgPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5VcDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLmh0bWwiPjMgT3BlblNTTCAgPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wtY29udGV4dC5odG1sIj4zLjMuMSBDb250ZXh0IG9iamVjdHM8L0E+Cis8aHI+Cis8c3BhbiBjbGFzcz0icmVsZWFzZS1pbmZvIj5SZWxlYXNlIDAuNi48L3NwYW4+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kb2MvaHRtbC9vcGVuc3NsLXg1MDkuaHRtbCBiL2RvYy9odG1sL29wZW5zc2wteDUwOS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YjEwNzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaHRtbC9vcGVuc3NsLXg1MDkuaHRtbApAQCAtMCwwICsxLDE2NCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+My4xLjEgWDUwOSBvYmplY3RzIDwvdGl0bGU+Cis8TUVUQSBOQU1FPSJkZXNjcmlwdGlvbiIgQ09OVEVOVD0iMy4xLjEgWDUwOSBvYmplY3RzICI+Cis8TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0icHlPcGVuU1NMIj4KKzxNRVRBIE5BTUU9InJlc291cmNlLXR5cGUiIENPTlRFTlQ9ImRvY3VtZW50Ij4KKzxNRVRBIE5BTUU9ImRpc3RyaWJ1dGlvbiIgQ09OVEVOVD0iZ2xvYmFsIj4KKzxsaW5rIHJlbD0iU1RZTEVTSEVFVCIgaHJlZj0icHlPcGVuU1NMLmNzcyI+Cis8TElOSyBSRUw9Im5leHQiIGhyZWY9Im9wZW5zc2wteDUwOW5hbWUuaHRtbCI+Cis8TElOSyBSRUw9InByZXZpb3VzIiBocmVmPSJvcGVuc3NsLWNyeXB0by5odG1sIj4KKzxMSU5LIFJFTD0idXAiIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPgorPExJTksgUkVMPSJuZXh0IiBocmVmPSJvcGVuc3NsLXg1MDluYW1lLmh0bWwiPgorPC9oZWFkPgorPGJvZHk+Cis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLWNyeXB0by5odG1sIj48aW1nIHNyYz0icHJldmlvdXMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlByZXZpb3VzIFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC14NTA5bmFtZS5odG1sIj48aW1nIHNyYz0ibmV4dC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iTmV4dCBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj5QeXRob24gT3BlblNTTCBNYW51YWw8L3RkPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJjb250ZW50cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iQ29udGVudHMiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzwvdHI+PC90YWJsZT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+UHJldmlvdXM6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+My4xIGNyeXB0byAgPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5VcDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLWNyeXB0by5odG1sIj4zLjEgY3J5cHRvICA8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPk5leHQ6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC14NTA5bmFtZS5odG1sIj4zLjEuMiBYNTA5TmFtZSBvYmplY3RzPC9BPgorPGJyPjxocj4KKzwvRElWPgorPCEtLUVuZCBvZiBOYXZpZ2F0aW9uIFBhbmVsLS0+CisKKzxIMz48QSBOQU1FPSJTRUNUSU9OMDAwNDExMDAwMDAwMDAwMDAwMDAwIj4mbmJzcDs8L0E+Cis8QlI+CiszLjEuMSBYNTA5IG9iamVjdHMgCis8L0gzPgorCis8UD4KK1g1MDkgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0zNCc+PHR0IGNsYXNzPSdtZXRob2QnPmdldF9pc3N1ZXI8L3R0PjwvYT48L2I+KCkKKzxkZD4KK1JldHVybiBhIDxFTT5ib3Jyb3dlZCByZWZlcmVuY2UgdG8gYSBYNTA5TmFtZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBpc3N1ZXIKK29mIHRoZSBjZXJ0aWZpY2F0ZS4gIFdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgWDUwOSBvciBYNTA5UmVxIG9iamVjdCBpcworZGVzdHJveWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIGludmFsaWQhCis8L2RsPgorPC9FTT4KKzxQPjxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTM1Jz48dHQgY2xhc3M9J21ldGhvZCc+Z2V0X3B1YmtleTwvdHQ+PC9hPjwvYj4oKQorPGRkPgorUmV0dXJuIGEgUEtleSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwdWJsaWMga2V5IG9mIHRoZSBjZXJ0aWZpY2F0ZS4KKzwvZGw+Cis8UD48ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0zNic+PHR0IGNsYXNzPSdtZXRob2QnPmdldF9zZXJpYWxfbnVtYmVyPC90dD48L2E+PC9iPigpCis8ZGQ+CitSZXR1cm4gdGhlIGNlcnRpZmljYXRlIHNlcmlhbCBudW1iZXIuCis8L2RsPgorPFA+PGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMzcnPjx0dCBjbGFzcz0nbWV0aG9kJz5nZXRfc3ViamVjdDwvdHQ+PC9hPjwvYj4oKQorPGRkPgorUmV0dXJuIGEgPEVNPmJvcnJvd2VkIHJlZmVyZW5jZSB0byBhIFg1MDlOYW1lIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHN1YmplY3QKK29mIHRoZSBjZXJ0aWZpY2F0ZS4gIFdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgWDUwOSBvciBYNTA5UmVxIG9iamVjdCBpcworZGVzdHJveWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIGludmFsaWQhCis8L2RsPjwvRU0+Cis8UD48ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC0zOCc+PHR0IGNsYXNzPSdtZXRob2QnPmdldF92ZXJzaW9uPC90dD48L2E+PC9iPigpCis8ZGQ+CitSZXR1cm4gdGhlIGNlcnRpZmljYXRlIHZlcnNpb24uCis8L2RsPgorPFA+PGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtMzknPjx0dCBjbGFzcz0nbWV0aG9kJz5nbXRpbWVfYWRqX25vdEJlZm9yZTwvdHQ+PC9hPjwvYj4oPHZhcj50aW1lPC92YXI+KQorPGRkPgorQWRqdXN0IHRoZSB0aW1lc3RhbXAgKGluIEdNVCkgd2hlbiB0aGUgY2VydGlmaWNhdGUgc3RhcnRzIGJlaW5nIHZhbGlkLgorPC9kbD4KKzxQPjxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTQwJz48dHQgY2xhc3M9J21ldGhvZCc+Z210aW1lX2Fkal9ub3RBZnRlcjwvdHQ+PC9hPjwvYj4oPHZhcj50aW1lPC92YXI+KQorPGRkPgorQWRqdXN0IHRoZSB0aW1lc3RhbXAgKGluIEdNVCkgd2hlbiB0aGUgY2VydGlmaWNhdGUgc3RvcHMgYmVpbmcgdmFsaWQuCis8L2RsPgorPFA+PGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtNDEnPjx0dCBjbGFzcz0nbWV0aG9kJz5oYXNfZXhwaXJlZDwvdHQ+PC9hPjwvYj4oKQorPGRkPgorQ2hlY2tzIHRoZSBjZXJ0aWZpY2F0ZSdzIHRpbWUgc3RhbXAgYWdhaW5zdCBjdXJyZW50IHRpbWUuIFJldHVybnMgdHJ1ZSBpZiB0aGUKK2NlcnRpZmljYXRlIGhhcyBleHBpcmVkIGFuZCBmYWxzZSBvdGhlcndpc2UuCis8L2RsPgorPFA+PGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtNDInPjx0dCBjbGFzcz0nbWV0aG9kJz5zZXRfaXNzdWVyPC90dD48L2E+PC9iPig8dmFyPmlzc3VlcjwvdmFyPikKKzxkZD4KK1NldCB0aGUgaXNzdWVyIG9mIHRoZSBjZXJ0aWZpY2F0ZSB0byA8dmFyPmlzc3VlcjwvdmFyPi4KKzwvZGw+Cis8UD48ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC00Myc+PHR0IGNsYXNzPSdtZXRob2QnPnNldF9wdWJrZXk8L3R0PjwvYT48L2I+KDx2YXI+cGtleTwvdmFyPikKKzxkZD4KK1NldCB0aGUgcHVibGljIGtleSBvZiB0aGUgY2VydGlmaWNhdGUgdG8gPHZhcj5wa2V5PC92YXI+LgorPC9kbD4KKzxQPjxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTQ0Jz48dHQgY2xhc3M9J21ldGhvZCc+c2V0X3NlcmlhbF9udW1iZXI8L3R0PjwvYT48L2I+KDx2YXI+c2VyaWFsbm88L3Zhcj4pCis8ZGQ+CitTZXQgdGhlIHNlcmlhbCBudW1iZXIgb2YgdGhlIGNlcnRpZmljYXRlIHRvIDx2YXI+c2VyaWFsbm88L3Zhcj4uCis8L2RsPgorPFA+PGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtNDUnPjx0dCBjbGFzcz0nbWV0aG9kJz5zZXRfc3ViamVjdDwvdHQ+PC9hPjwvYj4oPHZhcj5zdWJqZWN0PC92YXI+KQorPGRkPgorU2V0IHRoZSBzdWJqZWN0IG9mIHRoZSBjZXJ0aWZpY2F0ZSB0byA8dmFyPnN1YmplY3Q8L3Zhcj4uCis8L2RsPgorPFA+PGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtNDYnPjx0dCBjbGFzcz0nbWV0aG9kJz5zZXRfdmVyc2lvbjwvdHQ+PC9hPjwvYj4oPHZhcj52ZXJzaW9uPC92YXI+KQorPGRkPgorU2V0IHRoZSBjZXJ0aWZpY2F0ZSB2ZXJzaW9uIHRvIDx2YXI+dmVyc2lvbjwvdmFyPi4KKzwvZGw+Cis8UD48ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC00Nyc+PHR0IGNsYXNzPSdtZXRob2QnPnNpZ248L3R0PjwvYT48L2I+KDx2YXI+cGtleSwgZGlnZXN0PC92YXI+KQorPGRkPgorU2lnbiB0aGUgY2VydGlmaWNhdGUsIHVzaW5nIHRoZSBrZXkgPHZhcj5wa2V5PC92YXI+IGFuZCB0aGUgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtCitpZGVudGlmaWVkIGJ5IHRoZSBzdHJpbmcgPHZhcj5kaWdlc3Q8L3Zhcj4uCis8L2RsPgorPFA+PGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtNDgnPjx0dCBjbGFzcz0nbWV0aG9kJz5zdWJqZWN0X25hbWVfaGFzaDwvdHQ+PC9hPjwvYj4oKQorPGRkPgorUmV0dXJuIHRoZSBoYXNoIG9mIHRoZSBjZXJ0aWZpY2F0ZSBzdWJqZWN0LgorPC9kbD4KKzxQPjxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTQ5Jz48dHQgY2xhc3M9J21ldGhvZCc+ZGlnZXN0PC90dD48L2E+PC9iPig8dmFyPmRpZ2VzdF9uYW1lPC92YXI+KQorPGRkPgorUmV0dXJuIGEgZGlnZXN0IG9mIHRoZSBjZXJ0aWZpY2F0ZSwgdXNpbmcgdGhlIDx2YXI+ZGlnZXN0X25hbWU8L3Zhcj4gbWV0aG9kLgorPC9kbD4KKzxQPjxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTUwJz48dHQgY2xhc3M9J21ldGhvZCc+YWRkX2V4dGVuc2lvbnM8L3R0PjwvYT48L2I+KDx2YXI+ZXh0ZW5zaW9uczwvdmFyPikKKzxkZD4KK0FkZCB0aGUgZXh0ZW5zaW9ucyBpbiB0aGUgc2VxdWVuY2UgPHZhcj5leHRlbnNpb25zPC92YXI+IHRvIHRoZSBjZXJ0aWZpY2F0ZS4KKzwvZGw+Cis8UD4KKzxESVYgQ0xBU1M9Im5hdmlnYXRpb24iPgorPHA+PGhyPgorPHRhYmxlIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjIiPgorPHRyPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPjxpbWcgc3JjPSJwcmV2aW91cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iUHJldmlvdXMgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLWNyeXB0by5odG1sIj48aW1nIHNyYz0idXAuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlVwIE9uZSBMZXZlbCIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLXg1MDluYW1lLmh0bWwiPjxpbWcgc3JjPSJuZXh0LmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJOZXh0IFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvdGQ+Cis8dGQ+PEEgaHJlZj0iY29udGVudHMuaHRtbCI+PGltZyBzcmM9ImNvbnRlbnRzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJDb250ZW50cyIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPC90cj48L3RhYmxlPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5QcmV2aW91czo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLWNyeXB0by5odG1sIj4zLjEgY3J5cHRvICA8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlVwOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPjMuMSBjcnlwdG8gIDwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+TmV4dDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLXg1MDluYW1lLmh0bWwiPjMuMS4yIFg1MDlOYW1lIG9iamVjdHM8L0E+Cis8aHI+Cis8c3BhbiBjbGFzcz0icmVsZWFzZS1pbmZvIj5SZWxlYXNlIDAuNi48L3NwYW4+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kb2MvaHRtbC9vcGVuc3NsLXg1MDluYW1lLmh0bWwgYi9kb2MvaHRtbC9vcGVuc3NsLXg1MDluYW1lLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg1MWU0YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9odG1sL29wZW5zc2wteDUwOW5hbWUuaHRtbApAQCAtMCwwICsxLDEyMSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+My4xLjIgWDUwOU5hbWUgb2JqZWN0cyA8L3RpdGxlPgorPE1FVEEgTkFNRT0iZGVzY3JpcHRpb24iIENPTlRFTlQ9IjMuMS4yIFg1MDlOYW1lIG9iamVjdHMgIj4KKzxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJweU9wZW5TU0wiPgorPE1FVEEgTkFNRT0icmVzb3VyY2UtdHlwZSIgQ09OVEVOVD0iZG9jdW1lbnQiPgorPE1FVEEgTkFNRT0iZGlzdHJpYnV0aW9uIiBDT05URU5UPSJnbG9iYWwiPgorPGxpbmsgcmVsPSJTVFlMRVNIRUVUIiBocmVmPSJweU9wZW5TU0wuY3NzIj4KKzxMSU5LIFJFTD0ibmV4dCIgaHJlZj0ib3BlbnNzbC14NTA5cmVxLmh0bWwiPgorPExJTksgUkVMPSJwcmV2aW91cyIgaHJlZj0ib3BlbnNzbC14NTA5Lmh0bWwiPgorPExJTksgUkVMPSJ1cCIgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+Cis8TElOSyBSRUw9Im5leHQiIGhyZWY9Im9wZW5zc2wteDUwOXJlcS5odG1sIj4KKzwvaGVhZD4KKzxib2R5PgorPERJViBDTEFTUz0ibmF2aWdhdGlvbiI+Cis8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMiI+Cis8dHI+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC14NTA5Lmh0bWwiPjxpbWcgc3JjPSJwcmV2aW91cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iUHJldmlvdXMgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLWNyeXB0by5odG1sIj48aW1nIHNyYz0idXAuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlVwIE9uZSBMZXZlbCIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLXg1MDlyZXEuaHRtbCI+PGltZyBzcmM9Im5leHQuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9Ik5leHQgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC90ZD4KKzx0ZD48QSBocmVmPSJjb250ZW50cy5odG1sIj48aW1nIHNyYz0iY29udGVudHMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IkNvbnRlbnRzIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8L3RyPjwvdGFibGU+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlByZXZpb3VzOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wteDUwOS5odG1sIj4zLjEuMSBYNTA5IG9iamVjdHM8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlVwOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPjMuMSBjcnlwdG8gIDwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+TmV4dDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJvcGVuc3NsLXg1MDlyZXEuaHRtbCI+My4xLjMgWDUwOVJlcSBvYmplY3RzPC9BPgorPGJyPjxocj4KKzwvRElWPgorPCEtLUVuZCBvZiBOYXZpZ2F0aW9uIFBhbmVsLS0+CisKKzxIMz48QSBOQU1FPSJTRUNUSU9OMDAwNDEyMDAwMDAwMDAwMDAwMDAwIj4mbmJzcDs8L0E+Cis8QlI+CiszLjEuMiBYNTA5TmFtZSBvYmplY3RzIAorPC9IMz4KKzxQPgorPEVNPjxFTT5YNTA5TmFtZSBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZW1iZXJzOgorPC9FTT48L0VNPgorPFA+PGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtNTEnPjx0dCBjbGFzcz0nbWVtYmVyJz5jb3VudHJ5TmFtZTwvdHQ+PC9hPjwvYj4KKzxkZD4KK1RoZSBjb3VudHJ5IG9mIHRoZSBlbnRpdHkuIDxjb2RlPkM8L2NvZGU+IG1heSBiZSB1c2VkIGFzIGFuIGFsaWFzIGZvcgorPGNvZGU+Y291bnRyeU5hbWU8L2NvZGU+LgorPC9kbD4KKzxQPjxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTUyJz48dHQgY2xhc3M9J21lbWJlcic+c3RhdGVPclByb3ZpbmNlTmFtZTwvdHQ+PC9hPjwvYj4KKzxkZD4KK1RoZSBzdGF0ZSBvciBwcm92aW5jZSBvZiB0aGUgZW50aXR5LiA8Y29kZT5TVDwvY29kZT4gbWF5IGJlIHVzZWQgYXMgYW4gYWxpYXMgZm9yCis8Y29kZT5zdGF0ZU9yUHJvdmluY2VOYW1lPC9jb2RlPrcKKzwvZGw+Cis8UD48ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC01Myc+PHR0IGNsYXNzPSdtZW1iZXInPmxvY2FsaXR5TmFtZTwvdHQ+PC9hPjwvYj4KKzxkZD4KK1RoZSBsb2NhbGl0eSBvZiB0aGUgZW50aXR5LiA8Y29kZT5MPC9jb2RlPiBtYXkgYmUgdXNlZCBhcyBhbiBhbGlhcyBmb3IKKzxjb2RlPmxvY2FsaXR5TmFtZTwvY29kZT4uCis8L2RsPgorPFA+PGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtNTQnPjx0dCBjbGFzcz0nbWVtYmVyJz5vcmdhbml6YXRpb25OYW1lPC90dD48L2E+PC9iPgorPGRkPgorVGhlIG9yZ2FuaXphdGlvbiBuYW1lIG9mIHRoZSBlbnRpdHkuIDxjb2RlPk88L2NvZGU+IG1heSBiZSB1c2VkIGFzIGFuIGFsaWFzIGZvcgorPGNvZGU+b3JnYW5pemF0aW9uTmFtZTwvY29kZT4uCis8L2RsPgorPFA+PGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtNTUnPjx0dCBjbGFzcz0nbWVtYmVyJz5vcmdhbml6YXRpb25hbFVuaXROYW1lPC90dD48L2E+PC9iPgorPGRkPgorVGhlIG9yZ2FuaXphdGlvbmFsIHVuaXQgb2YgdGhlIGVudGl0eS4gPGNvZGU+T1U8L2NvZGU+IG1heSBiZSB1c2VkIGFzIGFuIGFsaWFzIGZvcgorPGNvZGU+b3JnYW5pemF0aW9uYWxVbml0TmFtZTwvY29kZT4uCis8L2RsPgorPFA+PGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtNTYnPjx0dCBjbGFzcz0nbWVtYmVyJz5jb21tb25OYW1lPC90dD48L2E+PC9iPgorPGRkPgorVGhlIGNvbW1vbiBuYW1lIG9mIHRoZSBlbnRpdHkuIDxjb2RlPkNOPC9jb2RlPiBtYXkgYmUgdXNlZCBhcyBhbiBhbGlhcyBmb3IKKzxjb2RlPmNvbW1vbk5hbWU8L2NvZGU+LgorPC9kbD4KKzxQPjxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTU3Jz48dHQgY2xhc3M9J21lbWJlcic+ZW1haWxBZGRyZXNzPC90dD48L2E+PC9iPgorPGRkPgorVGhlIGUtbWFpbCBhZGRyZXNzIG9mIHRoZSBlbnRpdHkuCis8L2RsPgorPFA+Cis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzxwPjxocj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLXg1MDkuaHRtbCI+PGltZyBzcmM9InByZXZpb3VzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJQcmV2aW91cyBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPjxpbWcgc3JjPSJ1cC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iVXAgT25lIExldmVsIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wteDUwOXJlcS5odG1sIj48aW1nIHNyYz0ibmV4dC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iTmV4dCBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj5QeXRob24gT3BlblNTTCBNYW51YWw8L3RkPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJjb250ZW50cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iQ29udGVudHMiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzwvdHI+PC90YWJsZT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+UHJldmlvdXM6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC14NTA5Lmh0bWwiPjMuMS4xIFg1MDkgb2JqZWN0czwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+VXA6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+My4xIGNyeXB0byAgPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wteDUwOXJlcS5odG1sIj4zLjEuMyBYNTA5UmVxIG9iamVjdHM8L0E+Cis8aHI+Cis8c3BhbiBjbGFzcz0icmVsZWFzZS1pbmZvIj5SZWxlYXNlIDAuNi48L3NwYW4+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kb2MvaHRtbC9vcGVuc3NsLXg1MDlyZXEuaHRtbCBiL2RvYy9odG1sL29wZW5zc2wteDUwOXJlcS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NWMyNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaHRtbC9vcGVuc3NsLXg1MDlyZXEuaHRtbApAQCAtMCwwICsxLDExNCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+My4xLjMgWDUwOVJlcSBvYmplY3RzIDwvdGl0bGU+Cis8TUVUQSBOQU1FPSJkZXNjcmlwdGlvbiIgQ09OVEVOVD0iMy4xLjMgWDUwOVJlcSBvYmplY3RzICI+Cis8TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0icHlPcGVuU1NMIj4KKzxNRVRBIE5BTUU9InJlc291cmNlLXR5cGUiIENPTlRFTlQ9ImRvY3VtZW50Ij4KKzxNRVRBIE5BTUU9ImRpc3RyaWJ1dGlvbiIgQ09OVEVOVD0iZ2xvYmFsIj4KKzxsaW5rIHJlbD0iU1RZTEVTSEVFVCIgaHJlZj0icHlPcGVuU1NMLmNzcyI+Cis8TElOSyBSRUw9Im5leHQiIGhyZWY9Im9wZW5zc2wteDUwOXN0b3JlLmh0bWwiPgorPExJTksgUkVMPSJwcmV2aW91cyIgaHJlZj0ib3BlbnNzbC14NTA5bmFtZS5odG1sIj4KKzxMSU5LIFJFTD0idXAiIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPgorPExJTksgUkVMPSJuZXh0IiBocmVmPSJvcGVuc3NsLXg1MDlzdG9yZS5odG1sIj4KKzwvaGVhZD4KKzxib2R5PgorPERJViBDTEFTUz0ibmF2aWdhdGlvbiI+Cis8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMiI+Cis8dHI+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC14NTA5bmFtZS5odG1sIj48aW1nIHNyYz0icHJldmlvdXMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlByZXZpb3VzIFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC14NTA5c3RvcmUuaHRtbCI+PGltZyBzcmM9Im5leHQuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9Ik5leHQgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC90ZD4KKzx0ZD48QSBocmVmPSJjb250ZW50cy5odG1sIj48aW1nIHNyYz0iY29udGVudHMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IkNvbnRlbnRzIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8L3RyPjwvdGFibGU+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlByZXZpb3VzOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wteDUwOW5hbWUuaHRtbCI+My4xLjIgWDUwOU5hbWUgb2JqZWN0czwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+VXA6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+My4xIGNyeXB0byAgPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wteDUwOXN0b3JlLmh0bWwiPjMuMS40IFg1MDlTdG9yZSBvYmplY3RzPC9BPgorPGJyPjxocj4KKzwvRElWPgorPCEtLUVuZCBvZiBOYXZpZ2F0aW9uIFBhbmVsLS0+CisKKzxIMz48QSBOQU1FPSJTRUNUSU9OMDAwNDEzMDAwMDAwMDAwMDAwMDAwIj4mbmJzcDs8L0E+Cis8QlI+CiszLjEuMyBYNTA5UmVxIG9iamVjdHMgCis8L0gzPgorPFA+Cis8RU0+PEVNPlg1MDlSZXEgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKzwvRU0+PC9FTT4KKzxQPjxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTU4Jz48dHQgY2xhc3M9J21ldGhvZCc+Z2V0X3B1YmtleTwvdHQ+PC9hPjwvYj4oKQorPGRkPgorUmV0dXJuIGEgUEtleSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwdWJsaWMga2V5IG9mIHRoZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0LgorPC9kbD4KKzxQPjxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTU5Jz48dHQgY2xhc3M9J21ldGhvZCc+Z2V0X3N1YmplY3Q8L3R0PjwvYT48L2I+KCkKKzxkZD4KK1JldHVybiBhIDxFTT5ib3Jyb3dlZCByZWZlcmVuY2UgdG8gYSBYNTA5TmFtZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzdWJqZWN0CitvZiB0aGUgY2VydGlmaWNhdGUuICBXaGVuIHRoZSBjb3JyZXNwb25kaW5nIFg1MDkgb3IgWDUwOVJlcSBvYmplY3QgaXMKK2Rlc3Ryb3llZCwgdGhpcyBvYmplY3Qgd2lsbCBiZSBpbnZhbGlkIQorPC9kbD48L0VNPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC02MCc+PHR0IGNsYXNzPSdtZXRob2QnPnNldF9wdWJrZXk8L3R0PjwvYT48L2I+KDx2YXI+cGtleTwvdmFyPikKKzxkZD4KK1NldCB0aGUgcHVibGljIGtleSBvZiB0aGUgY2VydGlmaWNhdGUgcmVxdWVzdCB0byA8dmFyPnBrZXk8L3Zhcj4uCis8L2RsPgorPFA+Cis8ZGw+PGR0PjxiPjxhIG5hbWU9J2wyaC02MSc+PHR0IGNsYXNzPSdtZXRob2QnPnNpZ248L3R0PjwvYT48L2I+KDx2YXI+cGtleSwgZGlnZXN0PC92YXI+KQorPGRkPgorU2lnbiB0aGUgY2VydGlmaWNhdGUgcmVxdWVzdCwgdXNpbmcgdGhlIGtleSA8dmFyPnBrZXk8L3Zhcj4gYW5kIHRoZSBtZXNzYWdlIGRpZ2VzdAorYWxnb3JpdGhtIGlkZW50aWZpZWQgYnkgdGhlIHN0cmluZyA8dmFyPmRpZ2VzdDwvdmFyPi4KKzwvZGw+Cis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTYyJz48dHQgY2xhc3M9J21ldGhvZCc+dmVyaWZ5PC90dD48L2E+PC9iPig8dmFyPnBrZXk8L3Zhcj4pCis8ZGQ+CitWZXJpZnkgYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IHVzaW5nIHRoZSBwdWJsaWMga2V5IDx2YXI+cGtleTwvdmFyPi4KKzwvZGw+Cis8UD4KKworPERJViBDTEFTUz0ibmF2aWdhdGlvbiI+Cis8cD48aHI+Cis8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMiI+Cis8dHI+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC14NTA5bmFtZS5odG1sIj48aW1nIHNyYz0icHJldmlvdXMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlByZXZpb3VzIFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC14NTA5c3RvcmUuaHRtbCI+PGltZyBzcmM9Im5leHQuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9Ik5leHQgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC90ZD4KKzx0ZD48QSBocmVmPSJjb250ZW50cy5odG1sIj48aW1nIHNyYz0iY29udGVudHMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IkNvbnRlbnRzIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8L3RyPjwvdGFibGU+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlByZXZpb3VzOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wteDUwOW5hbWUuaHRtbCI+My4xLjIgWDUwOU5hbWUgb2JqZWN0czwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+VXA6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+My4xIGNyeXB0byAgPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wteDUwOXN0b3JlLmh0bWwiPjMuMS40IFg1MDlTdG9yZSBvYmplY3RzPC9BPgorPGhyPgorPHNwYW4gY2xhc3M9InJlbGVhc2UtaW5mbyI+UmVsZWFzZSAwLjYuPC9zcGFuPgorPC9ESVY+Cis8IS0tRW5kIG9mIE5hdmlnYXRpb24gUGFuZWwtLT4KKworPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jL2h0bWwvb3BlbnNzbC14NTA5c3RvcmUuaHRtbCBiL2RvYy9odG1sL29wZW5zc2wteDUwOXN0b3JlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2OGVjYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9odG1sL29wZW5zc2wteDUwOXN0b3JlLmh0bWwKQEAgLTAsMCArMSw5MyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+My4xLjQgWDUwOVN0b3JlIG9iamVjdHMgPC90aXRsZT4KKzxNRVRBIE5BTUU9ImRlc2NyaXB0aW9uIiBDT05URU5UPSIzLjEuNCBYNTA5U3RvcmUgb2JqZWN0cyAiPgorPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9InB5T3BlblNTTCI+Cis8TUVUQSBOQU1FPSJyZXNvdXJjZS10eXBlIiBDT05URU5UPSJkb2N1bWVudCI+Cis8TUVUQSBOQU1FPSJkaXN0cmlidXRpb24iIENPTlRFTlQ9Imdsb2JhbCI+Cis8bGluayByZWw9IlNUWUxFU0hFRVQiIGhyZWY9InB5T3BlblNTTC5jc3MiPgorPExJTksgUkVMPSJuZXh0IiBocmVmPSJvcGVuc3NsLXBrZXkuaHRtbCI+Cis8TElOSyBSRUw9InByZXZpb3VzIiBocmVmPSJvcGVuc3NsLXg1MDlyZXEuaHRtbCI+Cis8TElOSyBSRUw9InVwIiBocmVmPSJvcGVuc3NsLWNyeXB0by5odG1sIj4KKzxMSU5LIFJFTD0ibmV4dCIgaHJlZj0ib3BlbnNzbC1wa2V5Lmh0bWwiPgorPC9oZWFkPgorPGJvZHk+Cis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLXg1MDlyZXEuaHRtbCI+PGltZyBzcmM9InByZXZpb3VzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJQcmV2aW91cyBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPjxpbWcgc3JjPSJ1cC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iVXAgT25lIExldmVsIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtcGtleS5odG1sIj48aW1nIHNyYz0ibmV4dC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iTmV4dCBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj5QeXRob24gT3BlblNTTCBNYW51YWw8L3RkPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJjb250ZW50cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iQ29udGVudHMiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzwvdHI+PC90YWJsZT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+UHJldmlvdXM6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC14NTA5cmVxLmh0bWwiPjMuMS4zIFg1MDlSZXEgb2JqZWN0czwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+VXA6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+My4xIGNyeXB0byAgPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wtcGtleS5odG1sIj4zLjEuNSBQS2V5IG9iamVjdHM8L0E+Cis8YnI+PGhyPgorPC9ESVY+Cis8IS0tRW5kIG9mIE5hdmlnYXRpb24gUGFuZWwtLT4KKworPEgzPjxBIE5BTUU9IlNFQ1RJT04wMDA0MTQwMDAwMDAwMDAwMDAwMDAiPiZuYnNwOzwvQT4KKzxCUj4KKzMuMS40IFg1MDlTdG9yZSBvYmplY3RzIAorPC9IMz4KKzxQPgorPEVNPjxFTT48RU0+VGhlIFg1MDlTdG9yZSBvYmplY3QgaGFzIGN1cnJlbnRseSBqdXN0IG9uZSBtZXRob2Q6Cis8L0VNPjwvRU0+PC9FTT4KKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtNjMnPjx0dCBjbGFzcz0nbWV0aG9kJz5hZGRfY2VydDwvdHQ+PC9hPjwvYj4oPHZhcj5jZXJ0PC92YXI+KQorPGRkPgorQWRkIHRoZSBjZXJ0aWZpY2F0ZSA8dmFyPmNlcnQ8L3Zhcj4gdG8gdGhlIGNlcnRpZmljYXRlIHN0b3JlLgorPC9kbD4KKzxQPgorCis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzxwPjxocj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJvcGVuc3NsLXg1MDlyZXEuaHRtbCI+PGltZyBzcmM9InByZXZpb3VzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJQcmV2aW91cyBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPjxpbWcgc3JjPSJ1cC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iVXAgT25lIExldmVsIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9Im9wZW5zc2wtcGtleS5odG1sIj48aW1nIHNyYz0ibmV4dC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iTmV4dCBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj5QeXRob24gT3BlblNTTCBNYW51YWw8L3RkPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJjb250ZW50cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iQ29udGVudHMiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzwvdHI+PC90YWJsZT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+UHJldmlvdXM6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC14NTA5cmVxLmh0bWwiPjMuMS4zIFg1MDlSZXEgb2JqZWN0czwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+VXA6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+My4xIGNyeXB0byAgPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9Im9wZW5zc2wtcGtleS5odG1sIj4zLjEuNSBQS2V5IG9iamVjdHM8L0E+Cis8aHI+Cis8c3BhbiBjbGFzcz0icmVsZWFzZS1pbmZvIj5SZWxlYXNlIDAuNi48L3NwYW4+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kb2MvaHRtbC9vcGVuc3NsLmh0bWwgYi9kb2MvaHRtbC9vcGVuc3NsLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEwZjA2OAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9odG1sL29wZW5zc2wuaHRtbApAQCAtMCwwICsxLDE1MSBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+MyBPcGVuU1NMIC0tIFB5dGhvbiBpbnRlcmZhY2UgdG8gT3BlblNTTCA8L3RpdGxlPgorPE1FVEEgTkFNRT0iZGVzY3JpcHRpb24iIENPTlRFTlQ9IjMgT3BlblNTTCAtLSBQeXRob24gaW50ZXJmYWNlIHRvIE9wZW5TU0wgIj4KKzxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJweU9wZW5TU0wiPgorPE1FVEEgTkFNRT0icmVzb3VyY2UtdHlwZSIgQ09OVEVOVD0iZG9jdW1lbnQiPgorPE1FVEEgTkFNRT0iZGlzdHJpYnV0aW9uIiBDT05URU5UPSJnbG9iYWwiPgorPGxpbmsgcmVsPSJTVFlMRVNIRUVUIiBocmVmPSJweU9wZW5TU0wuY3NzIj4KKzxMSU5LIFJFTD0ibmV4dCIgaHJlZj0iaW50ZXJuYWxzLmh0bWwiPgorPExJTksgUkVMPSJwcmV2aW91cyIgaHJlZj0iYnVpbGRpbmcuaHRtbCI+Cis8TElOSyBSRUw9InVwIiBIUkVGPSJweU9wZW5TU0wuaHRtbCI+Cis8TElOSyBSRUw9Im5leHQiIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPgorPC9oZWFkPgorPGJvZHk+Cis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJidWlsZGluZy13aW5kb3dzLmh0bWwiPjxpbWcgc3JjPSJwcmV2aW91cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iUHJldmlvdXMgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBIUkVGPSJweU9wZW5TU0wuaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+PGltZyBzcmM9Im5leHQuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9Ik5leHQgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC90ZD4KKzx0ZD48QSBocmVmPSJjb250ZW50cy5odG1sIj48aW1nIHNyYz0iY29udGVudHMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IkNvbnRlbnRzIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8L3RyPjwvdGFibGU+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlByZXZpb3VzOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImJ1aWxkaW5nLXdpbmRvd3MuaHRtbCI+Mi4yIEJ1aWxkaW5nIHRoZSBNb2R1bGU8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlVwOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIEhSRUY9InB5T3BlblNTTC5odG1sIj5QeXRob24gT3BlblNTTCBNYW51YWw8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPk5leHQ6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+My4xIGNyeXB0byAgPC9BPgorPGJyPjxocj4KKzwvRElWPgorPCEtLUVuZCBvZiBOYXZpZ2F0aW9uIFBhbmVsLS0+Cis8SDE+PEEgTkFNRT0iU0VDVElPTjAwMDQwMDAwMDAwMDAwMDAwMDAwMCI+Jm5ic3A7PC9BPgorPEJSPgorMyA8dHQgY2xhc3M9Im1vZHVsZSI+T3BlblNTTDwvdHQ+IC0tIFB5dGhvbiBpbnRlcmZhY2UgdG8gT3BlblNTTCAKKzwvSDE+CisKKzxQPgorCisKKzxQPgorVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgaGlnaC1sZXZlbCBpbnRlcmZhY2UgdG8gdGhlIGZ1bmN0aW9ucyBpbiB0aGUKK09wZW5TU0wgbGlicmFyeS4gVGhlIGZvbGxvd2luZyBtb2R1bGVzIGFyZSBkZWZpbmVkOgorCis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTInPjx0dD5jcnlwdG88L3R0PjwvYT48L2I+Cis8ZGQ+CitHZW5lcmljIGNyeXB0b2dyYXBoaWMgbW9kdWxlLiBOb3RlIHRoYXQgaWYgYW55dGhpbmcgaXMgaW5jb21wbGV0ZSwgdGhpcyBtb2R1bGUgaXMhCis8L2RsPgorCis8UD4KKzxkbD48ZHQ+PGI+PGEgbmFtZT0nbDJoLTMnPjx0dD5yYW5kPC90dD48L2E+PC9iPgorPGRkPgorQW4gaW50ZXJmYWNlIHRvIHRoZSBPcGVuU1NMIHBzZXVkbyByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKzwvZGw+CisKKzxQPgorPGRsPjxkdD48Yj48YSBuYW1lPSdsMmgtNCc+PHR0PlNTTDwvdHQ+PC9hPjwvYj4KKzxkZD4KK0FuIGludGVyZmFjZSB0byB0aGUgU1NMLXNwZWNpZmljIHBhcnRzIG9mIE9wZW5TU0wuCis8L2RsPgorCis8UD4KKworPHA+PGhyPgorCis8IS0tVGFibGUgb2YgQ2hpbGQtTGlua3MtLT4KKzxBIE5BTUU9IkNISUxEX0xJTktTIj48U1RST05HPlN1YnNlY3Rpb25zPC9TVFJPTkc+PC9BPgorCis8VUwgQ0xBU1M9IkNoaWxkTGlua3MiPgorPExJPjxBIE5BTUU9InRleDJodG1sMTEyIgorICBocmVmPSJvcGVuc3NsLWNyeXB0by5odG1sIj4zLjEgPHR0IGNsYXNzPSJtb2R1bGUiPmNyeXB0bzwvdHQ+IC0tIEdlbmVyaWMgY3J5cHRvZ3JhcGhpYyBtb2R1bGUgPC9BPgorPFVMPgorPExJPjxBIE5BTUU9InRleDJodG1sMTEzIgorICBocmVmPSJvcGVuc3NsLXg1MDkuaHRtbCI+My4xLjEgWDUwOSBvYmplY3RzIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDExNCIKKyAgaHJlZj0ib3BlbnNzbC14NTA5bmFtZS5odG1sIj4zLjEuMiBYNTA5TmFtZSBvYmplY3RzIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDExNSIKKyAgaHJlZj0ib3BlbnNzbC14NTA5cmVxLmh0bWwiPjMuMS4zIFg1MDlSZXEgb2JqZWN0cyA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwxMTYiCisgIGhyZWY9Im9wZW5zc2wteDUwOXN0b3JlLmh0bWwiPjMuMS40IFg1MDlTdG9yZSBvYmplY3RzIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDExNyIKKyAgaHJlZj0ib3BlbnNzbC1wa2V5Lmh0bWwiPjMuMS41IFBLZXkgb2JqZWN0cyA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwxMTgiCisgIGhyZWY9Im9wZW5zc2wtcGtjczcuaHRtbCI+My4xLjYgUEtDUzcgb2JqZWN0cyA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwxMTkiCisgIGhyZWY9Im9wZW5zc2wtcGtjczEyLmh0bWwiPjMuMS43IFBLQ1MxMiBvYmplY3RzIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDEyMCIKKyAgaHJlZj0ib3BlbnNzbC01MDlleHQuaHRtbCI+My4xLjggWDUwOUV4dGVuc2lvbiBvYmplY3RzIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDEyMSIKKyAgaHJlZj0ib3BlbnNzbC1uZXRzY2FwZS1zcGtpLmh0bWwiPjMuMS45IE5ldHNjYXBlU1BLSSBvYmplY3RzIDwvQT4KKzwvVUw+Cis8QlI+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwxMjIiCisgIGhyZWY9Im9wZW5zc2wtcmFuZC5odG1sIj4zLjIgPHR0IGNsYXNzPSJtb2R1bGUiPnJhbmQ8L3R0PiAtLSBBbiBpbnRlcmZhY2UgdG8gdGhlIE9wZW5TU0wgcHNldWRvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDEyMyIKKyAgaHJlZj0ib3BlbnNzbC1zc2wuaHRtbCI+My4zIDx0dCBjbGFzcz0ibW9kdWxlIj5TU0w8L3R0PiAtLSBBbiBpbnRlcmZhY2UgdG8gdGhlIFNTTC1zcGVjaWZpYyBwYXJ0cyBvZiBPcGVuU1NMIDwvQT4KKzxVTD4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDEyNCIKKyAgaHJlZj0ib3BlbnNzbC1jb250ZXh0Lmh0bWwiPjMuMy4xIENvbnRleHQgb2JqZWN0cyA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwxMjUiCisgIGhyZWY9Im9wZW5zc2wtY29ubmVjdGlvbi5odG1sIj4zLjMuMiBDb25uZWN0aW9uIG9iamVjdHMgPC9BPgorPC9VTD48L1VMPgorPCEtLUVuZCBvZiBUYWJsZSBvZiBDaGlsZC1MaW5rcy0tPgorCis8RElWIENMQVNTPSJuYXZpZ2F0aW9uIj4KKzxwPjxocj4KKzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48QSBocmVmPSJidWlsZGluZy13aW5kb3dzLmh0bWwiPjxpbWcgc3JjPSJwcmV2aW91cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iUHJldmlvdXMgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBIUkVGPSJweU9wZW5TU0wuaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+PGltZyBzcmM9Im5leHQuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9Ik5leHQgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC90ZD4KKzx0ZD48QSBocmVmPSJjb250ZW50cy5odG1sIj48aW1nIHNyYz0iY29udGVudHMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IkNvbnRlbnRzIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8L3RyPjwvdGFibGU+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlByZXZpb3VzOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImJ1aWxkaW5nLXdpbmRvd3MuaHRtbCI+Mi4yIEJ1aWxkaW5nIHRoZSBNb2R1bGU8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlVwOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIEhSRUY9InB5T3BlblNTTC5odG1sIj5QeXRob24gT3BlblNTTCBNYW51YWw8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPk5leHQ6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0ib3BlbnNzbC1jcnlwdG8uaHRtbCI+My4xIGNyeXB0byAgPC9BPgorPGhyPgorPHNwYW4gY2xhc3M9InJlbGVhc2UtaW5mbyI+UmVsZWFzZSAwLjYuPC9zcGFuPgorPC9ESVY+Cis8IS0tRW5kIG9mIE5hdmlnYXRpb24gUGFuZWwtLT4KKworPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jL2h0bWwvcHJldmlvdXMuZ2lmIGIvZG9jL2h0bWwvcHJldmlvdXMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMWRhMTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaHRtbC9wcmV2aW91cy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL2h0bWwvcHlPcGVuU1NMLmNzcyBiL2RvYy9odG1sL3B5T3BlblNTTC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY3Y2Y3NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9odG1sL3B5T3BlblNTTC5jc3MKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIFRoZSBmaXJzdCBwYXJ0IG9mIHRoaXMgaXMgdGhlIHN0YW5kYXJkIENTUyBnZW5lcmF0ZWQgYnkgTGFUZVgySFRNTCwKKyAqIHdpdGggdGhlICJlbXB0eSIgZGVjbGFyYXRpb25zIHJlbW92ZWQuCisgKi8KKworLyogQ2VudHVyeSBTY2hvb2xib29rIGZvbnQgaXMgdmVyeSBzaW1pbGFyIHRvIENvbXB1dGVyIE1vZGVybiBNYXRoOiBjbW1pICovCisubWF0aCAgICAgICAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiAiQ2VudHVyeSBTY2hvb2xib29rIiwgc2VyaWY7IH0KKy5tYXRoIGkgICAgICAgICAgICAgICAgIHsgZm9udC1mYW1pbHk6ICJDZW50dXJ5IFNjaG9vbGJvb2siLCBzZXJpZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQgfQorLmJvbGRtYXRoICAgICAgICAgICAgICAgeyBmb250LWZhbWlseTogIkNlbnR1cnkgU2Nob29sYm9vayIsIHNlcmlmOworICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogYm9sZCB9CisKKy8qIEltcGxlbWVudCBib3RoIGZpeGVkLXNpemUgYW5kIHJlbGF0aXZlIHNpemVzOiAqLworc21hbGwueHRpbnkgICAgICAgICAgICAgeyBmb250LXNpemUgOiB4eC1zbWFsbCB9CitzbWFsbC50aW55ICAgICAgICAgICAgICB7IGZvbnQtc2l6ZSA6IHgtc21hbGwgfQorc21hbGwuc2NyaXB0c2l6ZSAgICAgICAgeyBmb250LXNpemUgOiBzbWFsbGVyIH0KK3NtYWxsLmZvb3Rub3Rlc2l6ZSAgICAgIHsgZm9udC1zaXplIDogc21hbGwgfQorYmlnLnhsYXJnZSAgICAgICAgICAgICAgeyBmb250LXNpemUgOiBsYXJnZSB9CitiaWcueHhsYXJnZSAgICAgICAgICAgICB7IGZvbnQtc2l6ZSA6IHgtbGFyZ2UgfQorYmlnLmh1Z2UgICAgICAgICAgICAgICAgeyBmb250LXNpemUgOiBsYXJnZXIgfQorYmlnLnhodWdlICAgICAgICAgICAgICAgeyBmb250LXNpemUgOiB4eC1sYXJnZSB9CisKKy8qCisgKiBEb2N1bWVudC1zcGVjaWZpYyBzdHlsZXMgY29tZSBuZXh0OworICogdGhlc2UgYXJlIGFkZGVkIGZvciB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24uCisgKgorICogTm90ZSB0aGF0IHRoZSBzaXplIHNwZWNpZmljYXRpb25zIGZvciB0aGUgSCogZWxlbWVudHMgYXJlIGJlY2F1c2UKKyAqIE5ldHNjYXBlIG9uIFNvbGFyaXMgb3RoZXJ3aXNlIGRvZXNuJ3QgZ2V0IGl0IHJpZ2h0OyB0aGV5IGFsbCBlbmQgdXAKKyAqIHRoZSBub3JtYWwgdGV4dCBzaXplLgorICovCisKK2JvZHkgICAgICAgICAgICAgICAgICAgIHsgY29sb3I6ICMwMDAwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7IH0KKworYTphY3RpdmUgICAgICAgICAgICAgICAgeyBjb2xvcjogI2ZmMDAwMDsgfQorYTp2aXNpdGVkICAgICAgICAgICAgICAgeyBjb2xvcjogIzU1MWE4YjsgfQorYTpsaW5rICAgICAgICAgICAgICAgICAgeyBjb2xvcjogIzAwMDBiYjsgfQorCitoMSwgaDIsIGgzLCBoNCwgaDUsIGg2ICB7IGZvbnQtZmFtaWx5OiBhdmFudGdhcmRlLCBzYW5zLXNlcmlmOworICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogYm9sZCB9CitoMSAgICAgICAgICAgICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTgwJSB9CitoMiAgICAgICAgICAgICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTUwJSB9CitoMywgaDQgICAgICAgICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTIwJSB9Citjb2RlLCB0dCAgICAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2UgfQordmFyICAgICAgICAgICAgICAgICAgICAgeyBmb250LWZhbWlseTogdGltZXMsIHNlcmlmOworICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWwgfQorCisubmF2aWdhdGlvbiB0ZCAgICAgICAgICB7IGJhY2tncm91bmQtY29sb3I6ICM5OWNjZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LWZhbWlseTogYXZhbnRnYXJkZSwgc2Fucy1zZXJpZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxMTAlIH0KKworLnJlbGVhc2UtaW5mbyAgICAgICAgICAgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0KKworLnRpdGxlZ3JhcGhpYyAgICAgICAgICAgeyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB9CisKKy52ZXJiYXRpbSAgICAgICAgICAgICAgIHsgY29sb3I6ICMwMDAwOGIgfQorCisuZW1haWwgICAgICAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiBhdmFudGdhcmRlLCBzYW5zLXNlcmlmIH0KKy5taW1ldHlwZSAgICAgICAgICAgICAgIHsgZm9udC1mYW1pbHk6IGF2YW50Z2FyZGUsIHNhbnMtc2VyaWYgfQorLm5ld3Nncm91cCAgICAgICAgICAgICAgeyBmb250LWZhbWlseTogYXZhbnRnYXJkZSwgc2Fucy1zZXJpZiB9CisudXJsICAgICAgICAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiBhdmFudGdhcmRlLCBzYW5zLXNlcmlmIH0KKy5maWxlICAgICAgICAgICAgICAgICAgIHsgZm9udC1mYW1pbHk6IGF2YW50Z2FyZGUsIHNhbnMtc2VyaWYgfQorCisudGFibGVoZWFkZXIgICAgICAgICAgICB7IGJhY2tncm91bmQtY29sb3I6ICM5OWNjZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBhdmFudGdhcmRlLCBzYW5zLXNlcmlmOyB9CisKKy5yZWZjb3VudC1pbmZvICAgICAgICAgIHsgZm9udC1zdHlsZTogaXRhbGljIH0KKy5yZWZjb3VudC1pbmZvIC52YWx1ZSAgIHsgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjMDA2NjAwIH0KKworLyoKKyAqIFNvbWUgZGVjb3JhdGlvbiBmb3IgdGhlICJTZWUgYWxzbzoiIGJsb2NrcywgaW4gcGFydCBpbnNwaXJlZCBieSBzb21lIG9mCisgKiB0aGUgc3R5bGluZyBvbiBMYXJzIE1hcml1cyBHYXJzaG9sJ3MgWFNBIHBhZ2VzLgorICogKFRoZSBibHVlIGluIHRoZSBuYXZpZ2F0aW9uIGJhcnMgaXMgIzk5Q0NGRi4pCisgKi8KKy5zZWVhbHNvICAgICAgICAgICAgICAgIHsgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmFmMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiB0aGluIHNvbGlkIGJsYWNrOworICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiA0cHQgfQorCisuc2VlYWxzbyAuaGVhZGluZyAgICAgICB7IGZvbnQtc2l6ZTogMTEwJSB9CisKKy8qCisgKiBDbGFzcyAnYXZhaWxhYmlsaXR5JyBpcyB1c2VkIGZvciBtb2R1bGUgYXZhaWxhYmlsaXR5IHN0YXRlbWVudHMgYXQKKyAqIHRoZSB0b3Agb2YgbW9kdWxlcy4KKyAqLworLmF2YWlsYWJpbGl0eSAucGxhdGZvcm0geyBmb250LXdlaWdodDogYm9sZCB9CmRpZmYgLS1naXQgYS9kb2MvaHRtbC9weU9wZW5TU0wuaG93IGIvZG9jL2h0bWwvcHlPcGVuU1NMLmhvdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWExODk3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2h0bWwvcHlPcGVuU1NMLmhvdwpAQCAtMCwwICsxIEBACisrKysgcGVybCAvaG9tZS9tYXJ0aW4vcHJvamVjdHMvcHlPcGVuU1NML3B5T3BlblNTTC0wLjYvZG9jL3Rvb2xzL25vZGUybGFiZWwucGwgKi5odG1sCmRpZmYgLS1naXQgYS9kb2MvaHRtbC9weU9wZW5TU0wuaHRtbCBiL2RvYy9odG1sL3B5T3BlblNTTC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzIwZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaHRtbC9weU9wZW5TU0wuaHRtbApAQCAtMCwwICsxLDE2NyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC90aXRsZT4KKzxNRVRBIE5BTUU9ImRlc2NyaXB0aW9uIiBDT05URU5UPSJQeXRob24gT3BlblNTTCBNYW51YWwiPgorPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9InB5T3BlblNTTCI+Cis8TUVUQSBOQU1FPSJyZXNvdXJjZS10eXBlIiBDT05URU5UPSJkb2N1bWVudCI+Cis8TUVUQSBOQU1FPSJkaXN0cmlidXRpb24iIENPTlRFTlQ9Imdsb2JhbCI+Cis8bGluayByZWw9IlNUWUxFU0hFRVQiIGhyZWY9InB5T3BlblNTTC5jc3MiPgorPExJTksgUkVMPSJuZXh0IiBocmVmPSJjb250ZW50cy5odG1sIj4KKzwvaGVhZD4KKzxib2R5PgorPERJViBDTEFTUz0ibmF2aWdhdGlvbiI+Cis8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMiI+Cis8dHI+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48QSBocmVmPSJjb250ZW50cy5odG1sIj48aW1nIHNyYz0ibmV4dC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iTmV4dCBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj5QeXRob24gT3BlblNTTCBNYW51YWw8L3RkPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJjb250ZW50cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iQ29udGVudHMiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzwvdHI+PC90YWJsZT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+TmV4dDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJjb250ZW50cy5odG1sIj5Db250ZW50czwvQT4KKzxicj48aHI+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorPFA+CisKKzxkaXYgY2xhc3M9InRpdGxlcGFnZSI+Cis8Y2VudGVyPgorPGgxPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvaDE+Cis8cD48Yj48Zm9udCBzaXplPScrMic+TWFydGluIFNq9mdyZW48L2ZvbnQ+PC9iPjwvcD4KKzxwPjxzcGFuIGNsYXNzPSJlbWFpbCI+bWFydGluQHN0cmFrdC5jb208L3NwYW4+PC9wPgorPHA+Cis8L2NlbnRlcj4KKzwvZGl2PgorCis8UD4KKworPEgzPkFic3RyYWN0OjwvSDM+Cis8RElWIENMQVNTPSJBQlNUUkFDVCI+CisKK1RoaXMgbW9kdWxlIGlzIGEgcmF0aGVyIHRoaW4gd3JhcHBlciBhcm91bmQgKGEgc3Vic2V0IG9mKSB0aGUgT3BlblNTTCBsaWJyYXJ5LgorV2l0aCB0aGluIHdyYXBwZXIgSSBtZWFuIHRoYXQgYSBsb3Qgb2YgdGhlIG9iamVjdCBtZXRob2RzIGRvIG5vdGhpbmcgbW9yZSB0aGFuCitjYWxsaW5nIGEgY29ycmVzcG9uZGluZyBmdW5jdGlvbiBpbiB0aGUgT3BlblNTTCBsaWJyYXJ5LgorPC9ESVY+Cis8UD4KKworPFA+CisKKzxwPjxocj4KKworPCEtLVRhYmxlIG9mIENoaWxkLUxpbmtzLS0+CisKKworPFVMIENMQVNTPSJDaGlsZExpbmtzIj4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDEwIgorICBocmVmPSJjb250ZW50cy5odG1sIj5Db250ZW50czwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDExIgorICBocmVmPSJpbnRyby5odG1sIj4xIEludHJvZHVjdGlvbiA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwxMiIKKyAgaHJlZj0iYnVpbGRpbmcuaHRtbCI+MiBCdWlsZGluZyBhbmQgSW5zdGFsbGluZyA8L0E+Cis8VUw+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwxMyIKKyAgaHJlZj0iYnVpbGRpbmctdW5peC5odG1sIj4yLjEgQnVpbGRpbmcgdGhlIE1vZHVsZSBvbiBhIFVuaXggU3lzdGVtIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDE0IgorICBocmVmPSJidWlsZGluZy13aW5kb3dzLmh0bWwiPjIuMiBCdWlsZGluZyB0aGUgTW9kdWxlIG9uIGEgV2luZG93cyBTeXN0ZW0gPC9BPgorPC9VTD4KKzxCUj4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDE1IgorICBocmVmPSJvcGVuc3NsLmh0bWwiPjMgPHR0IGNsYXNzPSJtb2R1bGUiPk9wZW5TU0w8L3R0PiAtLSBQeXRob24gaW50ZXJmYWNlIHRvIE9wZW5TU0wgPC9BPgorPFVMPgorPExJPjxBIE5BTUU9InRleDJodG1sMTYiCisgIGhyZWY9Im9wZW5zc2wtY3J5cHRvLmh0bWwiPjMuMSA8dHQgY2xhc3M9Im1vZHVsZSI+Y3J5cHRvPC90dD4gLS0gR2VuZXJpYyBjcnlwdG9ncmFwaGljIG1vZHVsZSA8L0E+Cis8VUw+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwxNyIKKyAgaHJlZj0ib3BlbnNzbC14NTA5Lmh0bWwiPjMuMS4xIFg1MDkgb2JqZWN0cyA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwxOCIKKyAgaHJlZj0ib3BlbnNzbC14NTA5bmFtZS5odG1sIj4zLjEuMiBYNTA5TmFtZSBvYmplY3RzIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDE5IgorICBocmVmPSJvcGVuc3NsLXg1MDlyZXEuaHRtbCI+My4xLjMgWDUwOVJlcSBvYmplY3RzIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDIwIgorICBocmVmPSJvcGVuc3NsLXg1MDlzdG9yZS5odG1sIj4zLjEuNCBYNTA5U3RvcmUgb2JqZWN0cyA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwyMSIKKyAgaHJlZj0ib3BlbnNzbC1wa2V5Lmh0bWwiPjMuMS41IFBLZXkgb2JqZWN0cyA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwyMiIKKyAgaHJlZj0ib3BlbnNzbC1wa2NzNy5odG1sIj4zLjEuNiBQS0NTNyBvYmplY3RzIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDIzIgorICBocmVmPSJvcGVuc3NsLXBrY3MxMi5odG1sIj4zLjEuNyBQS0NTMTIgb2JqZWN0cyA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwyNCIKKyAgaHJlZj0ib3BlbnNzbC01MDlleHQuaHRtbCI+My4xLjggWDUwOUV4dGVuc2lvbiBvYmplY3RzIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDI1IgorICBocmVmPSJvcGVuc3NsLW5ldHNjYXBlLXNwa2kuaHRtbCI+My4xLjkgTmV0c2NhcGVTUEtJIG9iamVjdHMgPC9BPgorPC9VTD4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDI2IgorICBocmVmPSJvcGVuc3NsLXJhbmQuaHRtbCI+My4yIDx0dCBjbGFzcz0ibW9kdWxlIj5yYW5kPC90dD4gLS0gQW4gaW50ZXJmYWNlIHRvIHRoZSBPcGVuU1NMIHBzZXVkbyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwyNyIKKyAgaHJlZj0ib3BlbnNzbC1zc2wuaHRtbCI+My4zIDx0dCBjbGFzcz0ibW9kdWxlIj5TU0w8L3R0PiAtLSBBbiBpbnRlcmZhY2UgdG8gdGhlIFNTTC1zcGVjaWZpYyBwYXJ0cyBvZiBPcGVuU1NMIDwvQT4KKzxVTD4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDI4IgorICBocmVmPSJvcGVuc3NsLWNvbnRleHQuaHRtbCI+My4zLjEgQ29udGV4dCBvYmplY3RzIDwvQT4KKzxMST48QSBOQU1FPSJ0ZXgyaHRtbDI5IgorICBocmVmPSJvcGVuc3NsLWNvbm5lY3Rpb24uaHRtbCI+My4zLjIgQ29ubmVjdGlvbiBvYmplY3RzIDwvQT4KKzwvVUw+Cis8L1VMPgorPEJSPgorPExJPjxBIE5BTUU9InRleDJodG1sMzAiCisgIGhyZWY9ImludGVybmFscy5odG1sIj40IEludGVybmFscyA8L0E+Cis8VUw+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwzMSIKKyAgaHJlZj0iZXhjZXB0aW9ucy5odG1sIj40LjEgRXhjZXB0aW9ucyA8L0E+Cis8TEk+PEEgTkFNRT0idGV4Mmh0bWwzMiIKKyAgaHJlZj0iY2FsbGJhY2tzLmh0bWwiPjQuMiBDYWxsYmFja3MgPC9BPgorPExJPjxBIE5BTUU9InRleDJodG1sMzMiCisgIGhyZWY9InNvY2tldC1tZXRob2RzLmh0bWwiPjQuMyBBY2Vzc2luZyBTb2NrZXQgTWV0aG9kcyA8L0E+Cis8L1VMPgorPEJSPgorPExJPjxBIE5BTUU9InRleDJodG1sMzQiCisgIGhyZWY9ImFib3V0Lmh0bWwiPkFib3V0IHRoaXMgZG9jdW1lbnQgLi4uPC9BPgorPC9VTD4KKzwhLS1FbmQgb2YgVGFibGUgb2YgQ2hpbGQtTGlua3MtLT4KKworPERJViBDTEFTUz0ibmF2aWdhdGlvbiI+Cis8cD48aHI+Cis8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMiI+Cis8dHI+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48QSBocmVmPSJjb250ZW50cy5odG1sIj48aW1nIHNyYz0ibmV4dC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iTmV4dCBQYWdlIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj5QeXRob24gT3BlblNTTCBNYW51YWw8L3RkPgorPHRkPjxBIGhyZWY9ImNvbnRlbnRzLmh0bWwiPjxpbWcgc3JjPSJjb250ZW50cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iQ29udGVudHMiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzwvdHI+PC90YWJsZT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+TmV4dDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJjb250ZW50cy5odG1sIj5Db250ZW50czwvQT4KKzxocj4KKzxzcGFuIGNsYXNzPSJyZWxlYXNlLWluZm8iPlJlbGVhc2UgMC42Ljwvc3Bhbj4KKzwvRElWPgorPCEtLUVuZCBvZiBOYXZpZ2F0aW9uIFBhbmVsLS0+CisKKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvYy9odG1sL3NvY2tldC1tZXRob2RzLmh0bWwgYi9kb2MvaHRtbC9zb2NrZXQtbWV0aG9kcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOTU4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaHRtbC9zb2NrZXQtbWV0aG9kcy5odG1sCkBAIC0wLDAgKzEsMTE4IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzx0aXRsZT40LjMgQWNlc3NpbmcgU29ja2V0IE1ldGhvZHMgPC90aXRsZT4KKzxNRVRBIE5BTUU9ImRlc2NyaXB0aW9uIiBDT05URU5UPSI0LjMgQWNlc3NpbmcgU29ja2V0IE1ldGhvZHMgIj4KKzxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJweU9wZW5TU0wiPgorPE1FVEEgTkFNRT0icmVzb3VyY2UtdHlwZSIgQ09OVEVOVD0iZG9jdW1lbnQiPgorPE1FVEEgTkFNRT0iZGlzdHJpYnV0aW9uIiBDT05URU5UPSJnbG9iYWwiPgorPGxpbmsgcmVsPSJTVFlMRVNIRUVUIiBocmVmPSJweU9wZW5TU0wuY3NzIj4KKzxMSU5LIFJFTD0icHJldmlvdXMiIGhyZWY9ImNhbGxiYWNrcy5odG1sIj4KKzxMSU5LIFJFTD0idXAiIGhyZWY9ImludGVybmFscy5odG1sIj4KKzxMSU5LIFJFTD0ibmV4dCIgaHJlZj0iYWJvdXQuaHRtbCI+Cis8L2hlYWQ+Cis8Ym9keT4KKzxESVYgQ0xBU1M9Im5hdmlnYXRpb24iPgorPHRhYmxlIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjIiPgorPHRyPgorPHRkPjxBIGhyZWY9ImNhbGxiYWNrcy5odG1sIj48aW1nIHNyYz0icHJldmlvdXMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IlByZXZpb3VzIFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0iaW50ZXJuYWxzLmh0bWwiPjxpbWcgc3JjPSJ1cC5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iVXAgT25lIExldmVsIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxBIGhyZWY9ImFib3V0Lmh0bWwiPjxpbWcgc3JjPSJuZXh0LmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJOZXh0IFBhZ2UiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiPlB5dGhvbiBPcGVuU1NMIE1hbnVhbDwvdGQ+Cis8dGQ+PEEgaHJlZj0iY29udGVudHMuaHRtbCI+PGltZyBzcmM9ImNvbnRlbnRzLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJDb250ZW50cyIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8dGQ+PGltZyBzcmM9ImJsYW5rLmdpZiIKKyAgYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IiIgd2lkdGg9IjMyIj48L3RkPgorPC90cj48L3RhYmxlPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5QcmV2aW91czo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJjYWxsYmFja3MuaHRtbCI+NC4yIENhbGxiYWNrczwvQT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+VXA6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0iaW50ZXJuYWxzLmh0bWwiPjQgSW50ZXJuYWxzPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5OZXh0OjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImFib3V0Lmh0bWwiPkFib3V0IHRoaXMgZG9jdW1lbnQgLi4uPC9BPgorPGJyPjxocj4KKzwvRElWPgorPCEtLUVuZCBvZiBOYXZpZ2F0aW9uIFBhbmVsLS0+CisKKzxIMj48QSBOQU1FPSJTRUNUSU9OMDAwNTMwMDAwMDAwMDAwMDAwMDAwIj4mbmJzcDs8L0E+Cis8QlI+Cis0LjMgQWNlc3NpbmcgU29ja2V0IE1ldGhvZHMgCis8L0gyPgorPFA+Cis8RU0+PEVNPjxFTT5XZSBxdWlja2x5IHNhdyB0aGUgYmVuZWZpdCBvZiB3cmFwcGluZyBzb2NrZXQgbWV0aG9kcyBpbiB0aGUKKzx0dCBjbGFzcz0iY2xhc3MiPlNTTC5Db25uZWN0aW9uPC90dD4gY2xhc3MsIGZvciBhbiBlYXN5IHRyYW5zaXRpb24gaW50byB1c2luZyBTU0wuIFRoZQorcHJvYmxlbSBoZXJlIGlzIHRoYXQgdGhlIDx0dCBjbGFzcz0ibW9kdWxlIj5zb2NrZXQ8L3R0PiBtb2R1bGUgbGFja3MgYSBDIEFQSSwgYW5kIGFsbCB0aGUKK21ldGhvZHMgYXJlIGRlY2xhcmVkIHN0YXRpYy4gT25lIGFwcHJvYWNoIHdvdWxkIGJlIHRvIGhhdmUgPHR0IGNsYXNzPSJtb2R1bGUiPk9wZW5TU0w8L3R0PiBhcworYSBzdWJtb2R1bGUgdG8gdGhlIDx0dCBjbGFzcz0ibW9kdWxlIj5zb2NrZXQ8L3R0PiBtb2R1bGUsIHBsYWNpbmcgYWxsIHRoZSBjb2RlIGluCis8c3BhbiBjbGFzcz0iZmlsZSI+c29ja2V0bW9kdWxlLmM8L3NwYW4+LCBidXQgdGhpcyBpcyBvYnZpb3VzbHkgbm90IGEgZ29vZCBzb2x1dGlvbiwgc2luY2UgeW91CittaWdodCBub3Qgd2FudCB0byBpbXBvcnQgdG9ubmVzIG9mIGV4dHJhIHN0dWZmIHlvdSdyZSBub3QgZ29pbmcgdG8gdXNlIHdoZW4KK2ltcG9ydGluZyB0aGUgPHR0IGNsYXNzPSJtb2R1bGUiPnNvY2tldDwvdHQ+IG1vZHVsZS4gVGhlIG90aGVyIGFwcHJvYWNoIGlzIHRvIHNvbWVob3cgZ2V0IGEKK3BvaW50ZXIgdG8gdGhlIG1ldGhvZCB0byBiZSBjYWxsZWQsIGVpdGhlciB0aGUgQyBmdW5jdGlvbiwgb3IgYSBjYWxsYWJsZSBQeXRob24KK29iamVjdC4gVGhpcyBpcyBub3QgcmVhbGx5IGEgZ29vZCBzb2x1dGlvbiBlaXRoZXIsIHNpbmNlIHRoZXJlJ3MgYSBsb3Qgb2YKK2xvb2t1cHMgaW52b2x2ZWQuCis8L0VNPjwvRU0+PC9FTT4KKzxQPgorPEVNPjxFTT48RU0+VGhlIHdheSBpdCB3b3JrcyBpcyB0aGF0IHlvdSBoYXZlIHRvIHN1cHBseSBhIGBgPHR0IGNsYXNzPSJjbGFzcyI+c29ja2V0PC90dD4tbGlrZScnIHRyYW5zcG9ydAorb2JqZWN0IHRvIHRoZSA8dHQgY2xhc3M9ImNsYXNzIj5TU0wuQ29ubmVjdGlvbjwvdHQ+LiBUaGUgb25seSByZXF1aXJlbWVudCBvZiB0aGlzIG9iamVjdCBpcwordGhhdCBpdCBoYXMgYSA8dHQgY2xhc3M9Im1ldGhvZCI+ZmlsZW5vKCk8L3R0PiBtZXRob2QgdGhhdCByZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIHRoYXQncwordmFsaWQgYXQgdGhlIEMgbGV2ZWwgKGkuZS4geW91IGNhbiB1c2UgdGhlIHN5c3RlbSBjYWxscyByZWFkIGFuZCB3cml0ZSkuIElmIHlvdQord2FudCB0byB1c2UgdGhlIDx0dCBjbGFzcz0ibWV0aG9kIj5jb25uZWN0KCk8L3R0PiBvciA8dHQgY2xhc3M9Im1ldGhvZCI+YWNjZXB0KCk8L3R0PiBtZXRob2RzIG9mIHRoZQorPHR0IGNsYXNzPSJjbGFzcyI+U1NMLkNvbm5lY3Rpb248L3R0PiBvYmplY3QsIHRoZSB0cmFuc3BvcnQgb2JqZWN0IGhhcyB0byBzdXBwbHkgc3VjaAorbWV0aG9kcyB0b28uIEFwYXJ0IGZyb20gdGhlbSwgYW55IG1ldGhvZCBsb29rdXBzIGluIHRoZSA8dHQgY2xhc3M9ImNsYXNzIj5TU0wuQ29ubmVjdGlvbjwvdHQ+CitvYmplY3QgdGhhdCBmYWlsIGFyZSBwYXNzZWQgb24gdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IG9iamVjdC4KKzwvRU0+PC9FTT48L0VNPgorPFA+Cis8RU0+PEVNPjxFTT5GdXR1cmUgY2hhbmdlcyBtaWdodCBiZSB0byBhbGxvdyBQeXRob24tbGV2ZWwgdHJhbnNwb3J0IG9iamVjdHMsIHRoYXQgaW5zdGVhZAorb2YgaGF2aW5nIDx0dCBjbGFzcz0ibWV0aG9kIj5maWxlbm8oKTwvdHQ+IG1ldGhvZHMsIGhhdmUgPHR0IGNsYXNzPSJtZXRob2QiPnJlYWQoKTwvdHQ+IGFuZCA8dHQgY2xhc3M9Im1ldGhvZCI+d3JpdGUoKTwvdHQ+CittZXRob2RzLCBzbyBtb3JlIGFkdmFuY2VkIGZlYXR1cmVzIG9mIFB5dGhvbiBjYW4gYmUgdXNlZC4gVGhpcyB3b3VsZCBwcm9iYWJseQorZW50YWlsIHNvbWUgc29ydCBvZiBPcGVuU1NMIGBgQklPcycnLCBidXQgY29udmVydGluZyBQeXRob24gc3RyaW5ncyBiYWNrIGFuZAorZm9ydGggaXMgZXhwZW5zaXZlLCBzbyB0aGlzIHNob3VsZG4ndCBiZSB1c2VkIHVubGVzcyBuZWNlc3NhcnkuIE90aGVyIG5pY2UKK3RoaW5ncyB3b3VsZCBiZSB0byBiZSBhYmxlIHRvIHBhc3MgaW4gZGlmZmVyZW50IHRyYW5zcG9ydCBvYmplY3RzIGZvciByZWFkaW5nCithbmQgd3JpdGluZywgYnV0IHRoZW4gdGhlIDx0dCBjbGFzcz0ibWV0aG9kIj5maWxlbm8oKTwvdHQ+IG1ldGhvZCBvZiA8dHQgY2xhc3M9ImNsYXNzIj5TU0wuQ29ubmVjdGlvbjwvdHQ+CitiZWNvbWVzIHZpcnR1YWxseSB1c2VsZXNzLiBBbHNvLCBzaG91bGQgdGhlIG1ldGhvZCByZXNvbHV0aW9uIGJlIHVzZWQgb24gdGhlCityZWFkLXRyYW5zcG9ydCBvciB0aGUgd3JpdGUtdHJhbnNwb3J0PworPC9FTT48L0VNPjwvRU0+Cis8UD4KKworPERJViBDTEFTUz0ibmF2aWdhdGlvbiI+Cis8cD48aHI+Cis8dGFibGUgYWxpZ249ImNlbnRlciIgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMiI+Cis8dHI+Cis8dGQ+PEEgaHJlZj0iY2FsbGJhY2tzLmh0bWwiPjxpbWcgc3JjPSJwcmV2aW91cy5naWYiCitib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iUHJldmlvdXMgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZD48QSBocmVmPSJpbnRlcm5hbHMuaHRtbCI+PGltZyBzcmM9InVwLmdpZiIKK2JvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSJVcCBPbmUgTGV2ZWwiIHdpZHRoPSIzMiI+PC9BPjwvdGQ+Cis8dGQ+PEEgaHJlZj0iYWJvdXQuaHRtbCI+PGltZyBzcmM9Im5leHQuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9Ik5leHQgUGFnZSIgd2lkdGg9IjMyIj48L0E+PC90ZD4KKzx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+UHl0aG9uIE9wZW5TU0wgTWFudWFsPC90ZD4KKzx0ZD48QSBocmVmPSJjb250ZW50cy5odG1sIj48aW1nIHNyYz0iY29udGVudHMuZ2lmIgorYm9yZGVyPSIwIiBoZWlnaHQ9IjMyIgorICBhbHQ9IkNvbnRlbnRzIiB3aWR0aD0iMzIiPjwvQT48L3RkPgorPHRkPjxpbWcgc3JjPSJibGFuay5naWYiCisgIGJvcmRlcj0iMCIgaGVpZ2h0PSIzMiIKKyAgYWx0PSIiIHdpZHRoPSIzMiI+PC90ZD4KKzx0ZD48aW1nIHNyYz0iYmxhbmsuZ2lmIgorICBib3JkZXI9IjAiIGhlaWdodD0iMzIiCisgIGFsdD0iIiB3aWR0aD0iMzIiPjwvdGQ+Cis8L3RyPjwvdGFibGU+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPlByZXZpb3VzOjwvYj4gPGEgY2xhc3M9InNlY3RyZWYiIGhyZWY9ImNhbGxiYWNrcy5odG1sIj40LjIgQ2FsbGJhY2tzPC9BPgorPGIgY2xhc3M9Im5hdmxhYmVsIj5VcDo8L2I+IDxhIGNsYXNzPSJzZWN0cmVmIiBocmVmPSJpbnRlcm5hbHMuaHRtbCI+NCBJbnRlcm5hbHM8L0E+Cis8YiBjbGFzcz0ibmF2bGFiZWwiPk5leHQ6PC9iPiA8YSBjbGFzcz0ic2VjdHJlZiIgaHJlZj0iYWJvdXQuaHRtbCI+QWJvdXQgdGhpcyBkb2N1bWVudCAuLi48L0E+Cis8aHI+Cis8c3BhbiBjbGFzcz0icmVsZWFzZS1pbmZvIj5SZWxlYXNlIDAuNi48L3NwYW4+Cis8L0RJVj4KKzwhLS1FbmQgb2YgTmF2aWdhdGlvbiBQYW5lbC0tPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9kb2MvaHRtbC91cC5naWYgYi9kb2MvaHRtbC91cC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlkM2UxMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9odG1sL3VwLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvcHlPcGVuU1NMLnBzIGIvZG9jL3B5T3BlblNTTC5wcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWIxOWFmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3B5T3BlblNTTC5wcwpAQCAtMCwwICsxLDI1OTggQEAKKyUhUFMtQWRvYmUtMi4wCislJUNyZWF0b3I6IGR2aXBzKGspIDUuOTJiIENvcHlyaWdodCAyMDAyIFJhZGljYWwgRXllIFNvZnR3YXJlCislJVRpdGxlOiBweU9wZW5TU0wuZHZpCislJVBhZ2VzOiAxNAorJSVQYWdlT3JkZXI6IEFzY2VuZAorJSVCb3VuZGluZ0JveDogMCAwIDU5NiA4NDIKKyUlRW5kQ29tbWVudHMKKyVEVklQU1dlYlBhZ2U6ICh3d3cucmFkaWNhbGV5ZS5jb20pCislRFZJUFNDb21tYW5kTGluZTogZHZpcHMgLU4wIC1vIHB5T3BlblNTTC5wcyBweU9wZW5TU0wKKyVEVklQU1BhcmFtZXRlcnM6IGRwaT02MDAsIGNvbXByZXNzZWQKKyVEVklQU1NvdXJjZTogIFRlWCBvdXRwdXQgMjAwNS4wMy4xNDoxMTU4CislJUJlZ2luUHJvY1NldDogdGV4Yy5wcm8KKyUhCisvVGVYRGljdCAzMDAgZGljdCBkZWYgVGVYRGljdCBiZWdpbi9Oe2RlZn1kZWYvQntiaW5kIGRlZn1OL1N7ZXhjaH1OL1h7UworTn1CL0F7ZHVwfUIvVFJ7dHJhbnNsYXRlfU4vaXNscyBmYWxzZSBOL3ZzaXplIDExIDcyIG11bCBOL2hzaXplIDguNSA3MgorbXVsIE4vbGFuZHBsdXM5MHtmYWxzZX1kZWYvQHJpZ2lue2lzbHN7WzAgbGFuZHBsdXM5MHsxIC0xfXstMSAxfWlmZWxzZSAwCiswIDBdY29uY2F0fWlmIDcyIFJlc29sdXRpb24gZGl2IDcyIFZSZXNvbHV0aW9uIGRpdiBuZWcgc2NhbGUgaXNsc3sKK2xhbmRwbHVzOTB7VlJlc29sdXRpb24gNzIgZGl2IHZzaXplIG11bCAwIGV4Y2h9e1Jlc29sdXRpb24gLTcyIGRpdiBoc2l6ZQorbXVsIDB9aWZlbHNlIFRSfWlmIFJlc29sdXRpb24gVlJlc29sdXRpb24gdnNpemUgLTcyIGRpdiAxIGFkZCBtdWwgVFJbCittYXRyaXggY3VycmVudG1hdHJpeHtBIEEgcm91bmQgc3ViIGFicyAwLjAwMDAxIGx0e3JvdW5kfWlmfWZvcmFsbCByb3VuZAorZXhjaCByb3VuZCBleGNoXXNldG1hdHJpeH1OL0BsYW5kc2NhcGV7L2lzbHMgdHJ1ZSBOfUIvQG1hbnVhbGZlZWR7CitzdGF0dXNkaWN0L21hbnVhbGZlZWQgdHJ1ZSBwdXR9Qi9AY29waWVzey8jY29waWVzIFh9Qi9GTWF0WzEgMCAwIC0xIDAgMF0KK04vRkJCWzAgMCAwIDBdTi9ubiAwIE4vSUVuIDAgTi9jdHIgMCBOL2RmLXRhaWx7L25uIDggZGljdCBOIG5uIGJlZ2luCisvRm9udFR5cGUgMyBOL0ZvbnRNYXRyaXggZm50cnggTi9Gb250QkJveCBGQkIgTiBzdHJpbmcvYmFzZSBYIGFycmF5CisvQml0TWFwcyBYL0J1aWxkQ2hhcntDaGFyQnVpbGRlcn1OL0VuY29kaW5nIElFbiBOIGVuZCBBey9mb28gc2V0Zm9udH0yCithcnJheSBjb3B5IGN2eCBOIGxvYWQgMCBubiBwdXQvY3RyIDAgTlt9Qi9zZiAwIE4vZGZ7L3NmIDEgTi9mbnRyeCBGTWF0IE4KK2RmLXRhaWx9Qi9kZnN7ZGl2L3NmIFgvZm50cnhbc2YgMCAwIHNmIG5lZyAwIDBdTiBkZi10YWlsfUIvRXtwb3Agbm4gQQorZGVmaW5lZm9udCBzZXRmb250fUIvQ3d7Q2QgQSBsZW5ndGggNSBzdWIgZ2V0fUIvQ2h7Q2QgQSBsZW5ndGggNCBzdWIgZ2V0Cit9Qi9DeHsxMjggQ2QgQSBsZW5ndGggMyBzdWIgZ2V0IHN1Yn1CL0N5e0NkIEEgbGVuZ3RoIDIgc3ViIGdldCAxMjcgc3VifQorQi9DZHh7Q2QgQSBsZW5ndGggMSBzdWIgZ2V0fUIvQ2l7Q2QgQSB0eXBlL3N0cmluZ3R5cGUgbmV7Y3RyIGdldC9jdHIgY3RyCisxIGFkZCBOfWlmfUIvaWQgMCBOL3J3IDAgTi9yYyAwIE4vZ3AgMCBOL2NwIDAgTi9HIDAgTi9DaGFyQnVpbGRlcntzYXZlIDMKKzEgcm9sbCBTIEEvYmFzZSBnZXQgMiBpbmRleCBnZXQgUy9CaXRNYXBzIGdldCBTIGdldC9DZCBYIHBvcC9jdHIgMCBOIENkeAorMCBDeCBDeSBDaCBzdWIgQ3ggQ3cgYWRkIEN5IHNldGNhY2hlZGV2aWNlIEN3IENoIHRydWVbMSAwIDAgLTEgLS4xIEN4CitzdWIgQ3kgLjEgc3ViXS9pZCBDaSBOL3J3IEN3IDcgYWRkIDggaWRpdiBzdHJpbmcgTi9yYyAwIE4vZ3AgMCBOL2NwIDAgTnsKK3JjIDAgbmV7cmMgMSBzdWIvcmMgWCByd317R31pZmVsc2V9aW1hZ2VtYXNrIHJlc3RvcmV9Qi9He3tpZCBncCBnZXQvZ3AKK2dwIDEgYWRkIE4gQSAxOCBtb2QgUyAxOCBpZGl2IHBsIFMgZ2V0IGV4ZWN9bG9vcH1CL2FkdntjcCBhZGQvY3AgWH1CCisvY2hne3J3IGNwIGlkIGdwIDQgaW5kZXggZ2V0aW50ZXJ2YWwgcHV0aW50ZXJ2YWwgQSBncCBhZGQvZ3AgWCBhZHZ9Qi9uZHsKKy9jcCAwIE4gcncgZXhpdH1CL2xzaHtydyBjcCAyIGNvcHkgZ2V0IEEgMCBlcXtwb3AgMX17QSAyNTUgZXF7cG9wIDI1NH17CitBIEEgYWRkIDI1NSBhbmQgUyAxIGFuZCBvcn1pZmVsc2V9aWZlbHNlIHB1dCAxIGFkdn1CL3JzaHtydyBjcCAyIGNvcHkKK2dldCBBIDAgZXF7cG9wIDEyOH17QSAyNTUgZXF7cG9wIDEyN317QSAyIGlkaXYgUyAxMjggYW5kIG9yfWlmZWxzZX0KK2lmZWxzZSBwdXQgMSBhZHZ9Qi9jbHJ7cncgY3AgMiBpbmRleCBzdHJpbmcgcHV0aW50ZXJ2YWwgYWR2fUIvc2V0e3J3IGNwCitmaWxsc3RyIDAgNCBpbmRleCBnZXRpbnRlcnZhbCBwdXRpbnRlcnZhbCBhZHZ9Qi9maWxsc3RyIDE4IHN0cmluZyAwIDEgMTcKK3syIGNvcHkgMjU1IHB1dCBwb3B9Zm9yIE4vcGxbe2FkdiAxIGNoZ317YWR2IDEgY2hnIG5kfXsxIGFkZCBjaGd9ezEgYWRkCitjaGcgbmR9e2FkdiBsc2h9e2FkdiBsc2ggbmR9e2FkdiByc2h9e2FkdiByc2ggbmR9ezEgYWRkIGFkdn17L3JjIFggbmR9eworMSBhZGQgc2V0fXsxIGFkZCBjbHJ9e2FkdiAyIGNoZ317YWR2IDIgY2hnIG5kfXtwb3AgbmR9XUF7YmluZCBwb3B9Citmb3JhbGwgTi9Eey9jYyBYIEEgdHlwZS9zdHJpbmd0eXBlIG5le119aWYgbm4vYmFzZSBnZXQgY2MgY3RyIHB1dCBubgorL0JpdE1hcHMgZ2V0IFMgY3RyIFMgc2YgMSBuZXtBIEEgbGVuZ3RoIDEgc3ViIEEgMiBpbmRleCBTIGdldCBzZiBkaXYgcHV0Cit9aWYgcHV0L2N0ciBjdHIgMSBhZGQgTn1CL0l7Y2MgMSBhZGQgRH1CL2JvcHt1c2VyZGljdC9ib3AtaG9vayBrbm93bnsKK2JvcC1ob29rfWlmL1NJIHNhdmUgTiBAcmlnaW4gMCAwIG1vdmV0by9WIG1hdHJpeCBjdXJyZW50bWF0cml4IEEgMSBnZXQgQQorbXVsIGV4Y2ggMCBnZXQgQSBtdWwgYWRkIC45OSBsdHsvUVZ9ey9SVn1pZmVsc2UgbG9hZCBkZWYgcG9wIHBvcH1OL2VvcHsKK1NJIHJlc3RvcmUgdXNlcmRpY3QvZW9wLWhvb2sga25vd257ZW9wLWhvb2t9aWYgc2hvd3BhZ2V9Ti9Ac3RhcnR7Cit1c2VyZGljdC9zdGFydC1ob29rIGtub3due3N0YXJ0LWhvb2t9aWYgcG9wL1ZSZXNvbHV0aW9uIFgvUmVzb2x1dGlvbiBYCisxMDAwIGRpdi9EVkltYWcgWC9JRW4gMjU2IGFycmF5IE4gMiBzdHJpbmcgMCAxIDI1NXtJRW4gUyBBIDM2MCBhZGQgMzYgNAoraW5kZXggY3ZycyBjdm4gcHV0fWZvciBwb3AgNjU3ODEuNzYgZGl2L3ZzaXplIFggNjU3ODEuNzYgZGl2L2hzaXplIFh9TgorL3B7c2hvd31OL1JNYXRbMSAwIDAgLTEgMCAwXU4vQkRvdCAyNjAgc3RyaW5nIE4vUnggMCBOL1J5IDAgTi9We31CL1JWL3Z7CisvUnkgWC9SeCBYIFZ9QiBzdGF0dXNkaWN0IGJlZ2luL3Byb2R1Y3Qgd2hlcmV7cG9wIGZhbHNlWyhEaXNwbGF5KShOZVhUKQorKExhc2VyV3JpdGVyIDE2LzYwMClde0EgbGVuZ3RoIHByb2R1Y3QgbGVuZ3RoIGxle0EgbGVuZ3RoIHByb2R1Y3QgZXhjaCAwCitleGNoIGdldGludGVydmFsIGVxe3BvcCB0cnVlIGV4aXR9aWZ9e3BvcH1pZmVsc2V9Zm9yYWxsfXtmYWxzZX1pZmVsc2UKK2VuZHt7Z3NhdmUgVFIgLS4xIC4xIFRSIDEgMSBzY2FsZSBSeCBSeSBmYWxzZSBSTWF0e0JEb3R9aW1hZ2VtYXNrCitncmVzdG9yZX19e3tnc2F2ZSBUUiAtLjEgLjEgVFIgUnggUnkgc2NhbGUgMSAxIGZhbHNlIFJNYXR7QkRvdH0KK2ltYWdlbWFzayBncmVzdG9yZX19aWZlbHNlIEIvUVZ7Z3NhdmUgbmV3cGF0aCB0cmFuc2Zvcm0gcm91bmQgZXhjaCByb3VuZAorZXhjaCBpdHJhbnNmb3JtIG1vdmV0byBSeCAwIHJsaW5ldG8gMCBSeSBuZWcgcmxpbmV0byBSeCBuZWcgMCBybGluZXRvCitmaWxsIGdyZXN0b3JlfUIvYXttb3ZldG99Qi9kZWx0YSAwIE4vdGFpbHtBL2RlbHRhIFggMCBybW92ZXRvfUIvTXtTIHAKK2RlbHRhIGFkZCB0YWlsfUIvYntTIHAgdGFpbH1CL2N7LTQgTX1CL2R7LTMgTX1CL2V7LTIgTX1CL2Z7LTEgTX1CL2d7MCBNfQorQi9oezEgTX1CL2l7MiBNfUIvanszIE19Qi9rezQgTX1CL3d7MCBybW92ZXRvfUIvbHtwIC00IHd9Qi9te3AgLTMgd31CL257CitwIC0yIHd9Qi9ve3AgLTEgd31CL3F7cCAxIHd9Qi9ye3AgMiB3fUIvc3twIDMgd31CL3R7cCA0IHd9Qi94ezAgUworcm1vdmV0b31CL3l7MyAyIHJvbGwgcCBhfUIvYm9zey9TUyBzYXZlIE59Qi9lb3N7U1MgcmVzdG9yZX1CIGVuZAorCislJUVuZFByb2NTZXQKK1RlWERpY3QgYmVnaW4gMzkxNTgyODAgNTUzODA5OTYgMTAwMCA2MDAgNjAwIChweU9wZW5TU0wuZHZpKQorQHN0YXJ0CislRFZJUFNCaXRtYXBGb250OiBGYSBlY3R0MDgwMCA4IDE0CisvRmEgMTQgMTIyIGRmPDkwMzgwRkUwRTA5MDM4M0ZGOUYwRUJGRkZENDgxM0ZGNUEzODA3RkMzRjM4MEZGMDBGMzgxRkMwMDcKK0EyMzgzRjgwMDMxMzAwNDgxMzAxMTI3RUEyMDA3Q0VCMDBFMDAwRkMxNDAwQTI1QUE5N0VBMjEyN0MwMDdFMTRFMEVDMDFGMAorMTI3RjdFRUI4MDAzRUExRkMwRUMwN0UwMzgwRkYwMEYzOTA3RkMxRkMwNkNCNTEyODA2QzE0MDA2QzVCRUIzRkY4RUIwRkUwCisxQzJCN0RBOTIzPjY3IEQ8QjYxMkYwMTVGOEE0MzgwRjgwMDBBNTE1NzAxNTAwQTIxNDM4MTQ3Q0EzRUJGRkZDQTVFQjgwN0MKK0EzMTQzODkxQzdGQ0EzMTUxQzE1M0VBNkI2MTJGRUE0MTVGQzFGMjk3RUE4MjM+NjkgRDwzODAzRkZGMDAwMEYxM0ZDNDg3RgorNDg3RkEyMzk3RjgwN0Y4MDM4N0UwMDFGMDA3QzEzMEZBMjAwRkMxNEMwNDgxMzA3QjNBNDZDMTMwRkEyMDA3QzE0ODBBMjAwCis3RTEzMUYzODdGODA3RjZDQjUxMjAwQTI2QzVCNkM1QjAwMDMxM0YwMUEyQjdDQTkyMz43OQorRDxCNTEyRjAxNEZFODAxNTgwMTVDMDM5MEY4MDFGRTBFQzA3RjAxNDAzMTQwMTE1RjgxNDAwQTUxNDAxMTVGMDE0MDMxNDA3CitFQzFGRTA5MEI1MTJDMDE1ODAxNTAwNUMxNEYwMDE4MEM3RkNBQkVBRkZGODdGQTM1QjFEMjk3RUE4MjM+STwwMDdGQjUxMgorODBCNjEyQzBBNDZDMTQ4MDFBMDY3QzdFMjM+OTUgRDwzODAzRkY4MDAwMEYxM0UwNDgxM0Y4NDg3RjgwRUI4MEZGRUMzRjgwCiszODFGMDAxRkM3RkMxNDBGMTRGRjEzN0YwMDAzQjVGQzEyMEY1QTM4N0ZGMDBGMTMwMDEyRkNBMjVBMTQxRjdFNkMxMzNGMzgKKzdGODFGRjkwQjUxMkZDNkMxNEZFN0UwMDA3MTNDNzM5MDFGRTAxRkMxRjFEN0Q5QzIzPjk3CitEPEI0N0U3RkE0MTIwN0E3RUJDMUZDRUJDN0ZGMDFERjEzQzA5MEI1MTJFMDE1RjA5MDM4RkUwRkY4RUJGODAzOTAzOEYwMDEKK0ZDRUJFMDAwQTI0OTEzN0VBMjE1M0VBNTE1N0U3RjE1RkM3RjE0MDE5MDM4RjgwM0Y4OTAzOEZFMEZGMDkwQjVGQzE1RTAwMQorREYxMzgwMDFDRjEzMDAzODAzODNGODFGMjk3RkE4MjM+STxFQjNGRjBFQkZGRkMwMDAzMTNGRjVBNUEzODFGRTA3RkVBM0YKKzgwMzg3RjAwM0UwMDdFOTBDN0ZDQTI1QUEyNUFBNTdFQTIwMDdFMTMwNzAwN0ZFQjBGODAxNDFGRUEzRkMwMzkxRkYwN0YwMAorNkNCNUZDNkM1QjZDNUJDNjEzRjBFQjNGQzAxOTFEN0I5QzIzPkk8RUIzRkMwRUJGRkY4MDAwMzdGNDgxM0ZGNDgxNDgwMzgKKzFGRjA3RjM5M0Y4MDFGQzBFQjAwMEYwMDdFMTMwNzE1RTA1QUI2RkNBNDE1QzAwMEY4QzhGQzdFQTIwMDdFRUIwMUMwMDA3RgorRUIwM0UwMzgzRjgwMDcxM0UwMzkxRkY4MUZDMDZDQjVGQzZDMTQ4MDAwMDFFQkZFMDA2QzZDNUFFQjFGRTAxQjFEN0Q5QzIzCis+MTAxIEQ8MTRFMEVCMDNGOEE1RUIwMEUwMTQwMEE2MzgwM0ZGRjA0ODEzRjhBMzdFQzdGQ0IzQUIxMzAxMTIzODM4N0MwMworRjAxMkZFRUIwRkUwQjVGQzE0QzA2QzEzMDA2QzVBRUEwRkY4MTUzOTdEQTkyMz4xMDYgRDxFQTdGRkVCNUZDQTM3RUVBMDAKKzFGQjNBRDAwN0ZCNTEyQzBCNjEyRTBBMzZDMTRDMDFCMjk3Q0E4MjM+MTA4IEQ8MTM3MDEzRjhBNzAwN0ZCNTEyODBCNjEyCitDMEEzNkMxNDgwRDgwMEY4QzdGQ0FDRUMwMUMwRUMwM0UwQTNFQkZDMDcxNDBGOTAzOEZFMUZDMEVCN0ZGRjE1ODA5MDM4M0YKK0ZFMDBFQjBGRkNFQjA3RjAxQjI1N0VBNDIzPjExNiBEPDM5RkZGMDNGRkNBNTM5MEY4MDA3QzAwMDA3MTQ4MEEyRUJDMDBGCiswMDAzMTQwMEEyNkQ1QTAwMDExMzFFQTJFQkYwM0UwMDAwMTMzQ0EyRUJGODdDRUI3ODc4QTJFQjdDRjhFQjNDRjBBMjEzM0YKKzZENUFBMzZENUE2RDVBMUUxRDdFOUMyMz4xMTggRDwzOUZGRjAzRkZDQTUzOTA3ODAwN0MwMTU4MDEzQzAwMDAzMTMwRjE1CiswMEVBMDFFMDVDRUJGMDFFMTIwMEEyNkQ1QTEzNzhBMjZENUFBM0VCMUU3MDE0RjAxMzBFRUIwRkUwQTIxMzA3NUNBMzVDQTIKKzEzMEY5MUM3RkNBMkVBM0UxRkVBN0YxRTEzM0VFQTdDRkMxMjdGNUI2QzVBNkM1QUVBMEY4MDFFMkM3RTlDMjM+MTIxCitEIEUKKyVFbmREVklQU0JpdG1hcEZvbnQKKyVEVklQU0JpdG1hcEZvbnQ6IEZiIGVjdGkwODAwIDggNgorL0ZiIDYgMTE5IGRmPEVCMDdDMEVCMUZGMDkwMzg3QzM5QzBFQkY4MUZFQTAxRjAzODAzRTAwRkVBMDdDMDEyMEZEODFGODAKKzEzODBBMkVBM0YwMDE0MUY0ODE0MDAxMjdFQTI1QzAwRkUxMzNFNUFBMkVDN0UxOEVDN0MzODVBQTIxNEZDRDg3ODAxMTM3OAorMzk3QzAzRjg3MEEyMzkzQzBGNzhFMDM4MUUxRTNEMzkwRkY4MUZDMDM5MDNFMDBGMDAxRDFGNzk5RDI0Pjk3CitEPDEzRjgxMjFGQTIxMjAxQTI1QkEyMTIwM0EyNUJBMjEyMDdBMjVCQTIxMjBGRUJDN0MwRUI5RkYwRUJGODc4MzgxRkYwM0MKK0VCRTAzRUVCQzAxRUVCODAxRkVBM0YwMEEyMTIzRUEyMDA3RTEzM0ZBMjEyN0NBMjE0N0YwMEZDMTM3RTVBQTIxNEZDQTIxNAorRjgxMzAxMTRGMEVCMDNFMEVBNzgwNzE0QzAzODNDMEY4MDM4MUUzRTAwRUEwRkY4RUEwM0UwMTgyRjc4QUQyMT5JPEVCMDMKK0Y4RUIwRkZFRUIzRTBGRUJGODA3MzkwMUYwMDM4MEVBMDNFMEVBMDdDMDAwMEYxMzA3RDgxRjgwMTMwMDVDMzgzRjAwMUU1QworMzg3RjAzRjhFQkZGRTA0OUM3RkMwMDdFQzhGQzEyRkU1QUE0MTI3Q0VDMDE4MEVDMDNDMEVDMDc4MDZDRUIwRjAwMTQxRTZDCisxMzdDMzgwRjgzRjAzODAzRkZDMEM2NDhDN0ZDMUExRjc5OUQyMT4xMDEgRDwxMzFGRUEwM0ZGQTJFQTAwM0ZBMjEzM0VBMgorMTM3RUEyMTM3Q0EyMTNGQ0EyNUJBMjEyMDExNDdFOTAzOEYzRkY4MDkwMzhGNzg3QzAzOTAzRkUwM0UwMTNGQzEzRjhBMkVBCiswN0YwMTNFMEEyMTNDMDAwMEYxMzA3MTVDMDEzODBBMjAwMUYxMzBGMTU4MDEzMDAxNDFGNDgxNDA2MTUwRTAwM0UxMzNGMTQKKzNFMDA3RTE0MUVFQzdFMUMwMDdDMTM3Q0VDM0MzODEyRkMxNTcwNDhFQjFGRTAwMDcwRUIwNzgwMUYyRjdCQUQyND4xMDQKK0Q8RUIwRkMwRUI3RkYwRUJGMDNDMzgwMUUwMUMzODAzQzAxRUVBMDc4MDE0M0VBMjAwMEYxMzNDMTQxOEVCQzAwMDEzRjgxMworRkY2QzEzQzA2QzEzRTA2QzEzRjBFQTAwN0YxMzA3MTMwMzEzMDFFQTc4MDAxMkZDQTIxMzAxMDBGODEzRTAxMkUwRUIwM0MwCiszOEYwMDc4MDM4NzgxRjAwRUExRkZDRUEwN0YwMTcxRjdBOUQxRD4xMTUgRDwzOTAzQzAwMUMwMzkwRkYwMDNFMDM5MUU3OAorMDdGMEVBMUM3QzEyMzgwMDc4MTMwMzAwNzAxMzAxMTNGQ0Q4RjBGODEzRTAxMkUwMDBFMTEzMDAzOEMxRjAwMTAwMDExNEMwCisxMjAzMTNFMDE0MDMwMDA3MTQ4MDEzQzBBMkVDMDcwMDEyMEYxMzgwMTQwRUEyNUMxMjA3NkQ1QTAwMDM1QjZENUFDNkI0NUEKKzAxM0ZDN0ZDMUMxRjdBOUQyMT4xMTggRCBFCislRW5kRFZJUFNCaXRtYXBGb250CislRFZJUFNCaXRtYXBGb250OiBGYyBlY3JtMTQ0MCAxNC40IDIKKy9GYyAyIDk0IGRmPEI1MTJDMEEyNDhDN0ZDQjNCM0IzQjNCM0IzQThCNTEyQzBBMjEyNzg3NUQ5MjA+OTEKK0Q8QjUxMkMwQTJFQTAwMUZCM0IzQjNCM0IzQjNBOEI1RkNBMjEyNzg3RUQ5MjA+OTMgRCBFCislRW5kRFZJUFNCaXRtYXBGb250CislRFZJUFNCaXRtYXBGb250OiBGZCBlY3RpMTAwMCAxMCA0MAorL0ZkIDQwIDEyMyBkZjwwNEZGRUIwM0YwMDMwMzkwMzhFMDBGRkM5MjNBMEZDMEYwMUYxRTkyM0EzRjAwNzgzRTBGOTIzQTdFCiswMUY4N0MzRkRCN0MwM0VCRkM3RjAzRkMxNEY4REEwMUY4MTNGOTA1RjExMzdFREMwMUUxMTMzQzkxM0IwM0YwMDAwM0YwMDAKK0EzMTQwNzRCMTMwNzYwQTMxNDBGNEIxMzBGNjBBMzAxMEZCODEyQzBBMzkwM0MwMDFGODAwMDFGODAwMEEzMDIzRjE0M0Y5MgorQzc5MEM3RkNBNDRBNUMwMjdFMTQ3RUE0MDJGRTE0RkU0QTVDQTQxMzAxNEExMzAxNUZBMzEzMDM0QTEzMDM1RkEzMTMwNzRBCis0OTVBQTQ0OTQ4NDk1QUE0NDk0ODQ5NUFBMzAwMUNEOTAzODA5MEM4RkMwMDdFOTAzODBGQzAzRjAxM0UxNDNFMDBGRTAxMUYKKzVCMTMzQzAxN0M1QzNBRjg3ODBGMDFFMEQ4NzhGMEVCMDdDMDI3M0ZFMDAzRkZDOUZDMzkwRjgwMDBGQzQwNEM4MkJBMzM+CisyNyBEPEVFM0ZGQzRCQjUxMjgwOTIzOTA3RTAwN0MwOTIzOTFGODAwMUUwREIzRjAwMTNGMDAzN0UxMzAzNEIxMzA3QTI0QQorNUExOEUwNEE0OEVCMDM4MDk0QzdGQ0EzMTQwNzVEQTQxNDBGNURBMzAxMEZCN0ZDQTI1RjkwM0EwMDFGODAwMDdFQTIxN0ZFCiswMjNGNUM5MkM3RkNBMjE2MDE1RjVDMTQ3RTE2MDM1RkEyMTRGRTRBMTMwNzVGQTMwMTAxMTQwRjVGNEFFQ0MxQzBBMjE2MUYKKzE3ODMwMTAzMTY4MDVDQTJFRjg3MDAxMzA3NEE1Q0VFMEY4RUVFMDc5RUVFMDNGQzAxMEZFQzAwRjA0QTkxQzdGQ0EzNUMxMworMUZBMjAwMUM5MENBRkMxMjdFNUJFQUZFM0UxMzNDMTM3Q0VBRjg3OEVBNzhGMEVBM0ZFMEVBMEY4MDM0NEM4MkJBMkY+STwKK0VFN0ZFMDkyMzkwM0ZGRkM3RTkyMzgwRkMwM0U5MjM4MUYwMDBGMDMzRUVCM0ZGRTRCMTM3RjAzRkMxNEZDNUQxNDAxMTczRAorNEE0OEVCMDFGOEEyMTcwM0EyNEE0ODE0RjBBMjE3MDdBMjAyMEYxNUUwNUQxNzBGQTIxOEMwMDEwRkI3RkNBMzkwM0IwMDFGCis4MDAwMUY4MEEyMTczRjE0M0Y5MkM3MTMwMEEyNUZBMjRBMTQ3RTE0N0UxN0ZFQTI1RjE0RkU0QTEzMDFBMjVGQTIwMTAxMTQKKzAzNUNFRkYwNzBBMjE2MDcwMTAzMTZGMDRBRUNFMEUwQTNFRkUxQzAxMzA3NEExNEMzOTMzODAzRTM4MEVFMDFFNzkzMzgwMAorRkYwMDQ5NDgxNDNDOTRDN0ZDQTM0OTVBQTMwMDFDOTBDQUZDMTI3RTEzM0UxMkZFMTMzQzEzN0NFQUY4NzhFQTc4RjBFQTNGCitFMEVBMEY4MDM3NEM4MkJBMzE+STwxNEYwRUIwM0ZDQTIxMzA3QTNFQjBGRjhBMzE0RjBBM0VCMUZFMEEzMTRDMEEzRUIzRgorODBBMzE0MDBBMzEzN0VBMzEzN0NBMzVCQTM1QkEzNDg1QUE0NUIxMjAzQTJDOEZDQTgxMjBFRUEzRjgwMTI3RjEyRkZBMzkwCitDN0ZDMTI3RTEyM0MxNjNDNzdCQjE5PjMzIEQ8RUEwM0MwRUEwN0YwMTIwRjEyMUYxM0Y4QTMxM0YwRUEwN0IwRUEwMDMwMTMKKzcwMTM2MEEyMTNFMDEzQzAxMjAxRUEwMzgwMTMwMDVBMTIwRTVBNUE1QTVBNUEwRDE5N0E4ODE5PjQ0CitEPDEyMEVFQTNGODAxMjdGMTJGRkEzMTMwMDEyN0UxMjNDMDkwOTc3ODgxOT40NiBEPEVDMDNGOEVDMUZGRUVDN0MxRjkxMzgKK0YwMEY4MDkwMzkwM0UwMDdDMDkwMzgwN0MwMDNEOTBGODAxM0UwMTQwMDVCMDEzRTE0RjBBMjVCMTNGQ0EyNDg1QUEyMDAwMworMTQwN0EyNUIwMDA3MTVFMEEyNDkxMzBGMTIwRkEzNDg0OEVCMUZDMEE0NDg0OEVCM0Y4MEE0NDhDN0VBN0YwMEEzMTU3RTAwCis3RTE0RkVBMjAwRkU1QzE0MDE1RDVBNEE1QUEyNUQxNDA3MDA3QzVDNEE1QUEyNEFDN0ZDNkMxMzNFNUM2QzVCMzgwRjgzRTAKKzM4MDdGRjgwQzY0OEM4RkMyNDM5NzdCNjJBPjQ4IEQ8MDEwMzE0Mzg0OTZDMTNGODkxMzhGMDA3RjA5MUI1MTJFMDE2ODA0OQorMTQwMDVEMTVGODE1QzBEOTFFMUNDN0ZDMDExQ0M4RkNBMzEzM0MxMzM4QTMxMzc4MTM3MEEyMTQ3RjkwMzhGMUZGQzA5MDM4CitFNzgzRTA5MDM4RkUwMUYwOTAzOEY4MDBGODQ4NUE0OTdGNDkxMzdDNUJDODEyN0VBMzE1RkVBNDE0MDE1RDEyMUUxMjdGMTQKKzAzNDg1Q0EyNDg0OTVBMTJGODAwRTA1QzE0MEY0QTVBNUQ2QzQ5QzdGQzE0N0UwMDc4NUIzODdDMDFGODM4M0UwN0YwMzgxRgorRkZDMDZDOTBDOEZDRUEwM0Y4MjUzOTc3QjYyQT41MyBEPEVDMDNGOEVDMEZGRTkxMzgzRkZGODA5MTM4RkUwRkMwOTAzOTAxCitGODA3RTA5MDM4MDNGMDAzRDkwN0UwMTNGMDkwMzgwRkMwMDFFQjFGODBFQjNGMDA0OTE0RjgxMzdFMTNGRUEyNDg1QTE1MDMKK0EyMTIwMzVCMTZGMDE1MDcxMjA3NUIxNTBGQTIxNkUwMTUxRjZDNUExNTNGNkRFQjdGQzAxMjAxMTVGRjZDNkM1QTkwMzk3OAorMDNCRjgwOTAzODNDMEYzRkVCMUZGQzkwMzkwN0YwN0YwMDkwQzdGQzE1N0UxNUZFNUQxNDAxNUQ0QTVBQTIwMDNFNDk1QTAwCis3RjQ5NUE1RDE0MUYwMEZFNDlDN0ZDNDgxMzdFMDA3MDVCMzg3ODAzRjAzODdDMEZFMDM4M0ZGRjgwNkM0OEM4RkNFQTAzRjgKKzI1Mzk3OEI2MkE+NTcgRDw5MDI2MDNGRkY4OTFCNTEyRTBBMjgxRDkwMDA3OTIzODA3RjgwMDZGNkU1QTYxMDIwRjVFODFEQQorMEU3RjVEQTIwMjFFNkQxMzA3MDMzRjkyQzdGQzE0MUM4MkRBM0MxRjVDNzAxMzBFRUMzODBGQTIwMjc4NkQxMzFFMDMwNzE0CisxQzE0NzA4MkRBRjAwMzE0M0M3MDEzMzgxNEUwMTUwMTAxMDE2RTEzNzgwMzAwMTQ3MDVDODIwMTAzNkUxM0YwNjA0QTE0ODAKKzE2M0YwMTA3MTVDMTA0MUY1QjkxQzdGQzE3RTE0OUVDMEZFMzYwMDEwRTE1RjMxNjA3MDExRTE1RkY5NUM4RkMwMTFDODBBMgorMDEzQzgwNUYxMzM4MTYwMDEzNzg1RjAxRjgxNTdDRUEwM0ZDMjY3RkZGRTAxNDNDQjUxNTM4QTI0MzM5N0NCODNFPjc4CitEPDAxMDNCNjEyRjAxN0ZFRUZGRjgwOTAzQjAwMDdGODAwM0ZDMDRCRUIwRkYwMTcwNzAyMEZFQzAzRjhFRjAxRkM1REEyMDIKKzFGMTVGRUEyNURBMjE0M0ZFRjAzRkM1REEyMDI3RkVDMDdGODE4RjA5MkM3MTIwRjE4RTA0QUVDMUZDMEVGM0YwMDRBMTRGRQorRUUwMUY4MDEwMUVDMEZFMDkxQjYxMjgwMDRGQ0M3RkM5MTM4RkMwMDNGMDEwM0VDMEY4MDgzNEE2RDdFODMwMTA3MTQwM0EyCis1QzgzMDEwRjE0MDc1RjVDQTIwMTFGMTQwRkEyNUNBMjEzM0YxNjFGNEFFQ0UwMDdBMjAxN0YxNjBGMTgwRTkxQzdGQzQ5MDIKKzBGMTMxQzAwN0YwMUZFMTUzQ0I1OTEzODA3RjA3ODA0MDMxM0YwQ0FFQUZGRTBFRjNGODAzODNCN0NCODNEPjgyCitEPEI1RDhGODBGQjU5MDM4MUZGRkYwNjEwMkYwMThFMEQ4MDdGRUM3RDg3RkUwOTAzODAzRkUwMEQ4MDNGOERBM0Y4MDZENUEKK0YxMDBGMEEyNEY1QTYyMTkwMzYyMTkwNzA0N0Y5MkM3RkMxOTBFMTZGRjRCNURBMkRCMDNCRjVDN0YwMDAxREEwNzNGNUNBMgorMDMwRTVEODNEQjFDMUY0OTVBMTgwMzAzMzg1RDRFQzhGQzE1NzAwM0YwMTQwRTE1RTBEQTAxQzA1Q0EyREEwMzgwNUNBMkRBCiswNzAwNUNBMjAyMEU1RDE3QzE0QTVERUZDMzgwNUMwMjc4MDJDN0M5RkMxNDcwNEExNENFMTNGRTZDNkM0ODE0RENBMjRBMTQKK0Y4QTI5MUM3NUIxNjBGNDk1RDVGNUI1RjVCNDk5MkNBRkNBMjQ5MTQwRTRDM0I2RkI4NTM+ODcKK0Q8NDlCNUQ4RjAwN0I1RkNBM0Q5MDAwNzkwQzcxM0UwREEwM0ZDRUM3RjAwMTg3QzAyMDExNTc4NkY1QzRENUEwMjAwNUQ2RgorNDk1QTREQzdGQzZGNUJFRTgwMUU1RjAzM0Y1QkVFQzA3MDVGOTIzODFGQzFDMDE2RTNFRUU3ODBEQjBGRUZDOEZDMTZGRTZGCis1QTVFQTIxNTAzODJBMjE1MDc4MjE1MEYxNTFDRUQzQ0ZGNUQ0QjdFREEwMUUwN0ZFREMwM0ZEQTAzODA3RkVDMDcwMDAyMEUKKzEzMUYwMjFFODA1QzRBMTMwRjAyNzA4MDVDNDk0ODEzMDc0OTQ4ODAxMzA3NDlDNzEyMDMwMTFFODExMzNFMDFGRTgxRDgwNworRkYxNDA3QjUwMEUwOTAzODdGRkZGQzkzQjVGQzYwNDAzOTdDQjgzRT5JPEI4MTJGQzE3RkVBMjE3RkMyRjA0N0M3MDQwPgorOTUgRDwxNEY4RUIwN0ZFOTAzODFGODcxQzkwMzgzRTAzRkUxMzdDRUJGODAxMTIwMTQ4NDg2QzVBNDg1QTEyMEZFQkMwMDEKKzAwMUY1Q0EyRUEzRjgwMTQwMzAwN0Y1QzEzMDBBMjE0MDc0ODVDNUFBMjE0MEY1RDQ4RUNDMUMwQTIxNDFGMTU4MzE2ODAxNAorM0YxNTg3MDA3QzAxN0YxMzAwRUNGRjA3NkM0ODVCOTAzODAzOEY4RTM5MUYwRjA3OUUzOTA3RkUwM0ZDMzkwMUYwMDBGMDIyCisyNjc3QTQyQT45NyBEPDEzM0ZFQTFGRkZBM0M2N0UxMzdFQTMxM0ZFNUJBMzEyMDE1QkEzMTIwMzVCQTMxMjA3RUJFMEY4RUIKK0U3RkU5MDM4RUYwRjgwMzkwRkZDMDdDMDEzRjg5MDM4RjAwM0UwMTNFMEQ4MUZDMDEzRjBBMjEzODBBMjEyM0YxMzAwQTIxNAorMDc1QTEyN0VBMjE0MEYxMkZFNDgxNEUwQTIxNDFGMTVDMDVBRUMzRjgwQTIxNTAwNUMxNDdFNUMzODc4MDFGODAwN0M1QjM4CiszQzAzRTAzODNFMDdDMDM4MUUxRjgwRDgwRkZFQzdGQ0VBMDFGMDFDM0I3N0I5MjY+STwxNDdGOTAzODAzRkZDMDkwMzgwRgorQzFFMDkwMzgxRjAwNzAwMTdFMTM3ODQ5MTMzODM5MDFGODAxRjgzODAzRjAwMzEyMDcxM0UwMTIwRkQ4MUZDMDEzRjA5MUM3CitGQzQ4NUFBMjEyN0Y5MEM4RkNBMzVBNUFBNDVBQTMxNTMwMTUzODE1NzgwMDdDMTRGMDAwN0VFQjAxRTAwMDNFRUIwM0MwRUMKKzBGODA2Q0VCM0UwMDM4MEY4MUY4MzgwM0ZGRTBDNjkwQzdGQzFEMjY3N0E0MjY+STxFRDAxRjgxNUZGQTMxNTAzMTZGMEEyCisxNTA3QTIxNkUwQTIxNTBGQTIxNkMwQTIxNTFGQTIxNjgwQTIxNTNGQTIwMkY4MTMwMEVCMDdGRTkwMzgxRjg3N0Y5MDM4M0UKKzAzRkYwMTdDNUJFQkY4MDExMjAxMzgwM0YwMDA0ODQ4NUIxMjBGRUJDMDAxMTIxRjVERUEzRjgwMTQwMzEyN0YwMTAwNUJBMgorMTQwNzVBNDg1Q0EyMTQwRkEyNDhFQ0MxQzBBMjE0MUYxNUMzRUQ4MzgwMTQzRjE1ODcwMDdDMDE3RjEzMDBFQ0ZGMDc2QzQ4Cis1QjkwMzgwMzhGOEUzOTFGMEYwNzlFMzkwN0ZFMDNGQzM5MDFGMDAwRjAyNTNCNzdCOTJBPkk8MTQ3RjkwMzgwM0ZGQzA5MAorMzgwRkMxRTA5MDM4M0YwMEYwMDE3RTEzNzg1QjQ4NUE0ODVBNDg1QTEyMEY0OTEzRjgwMDFGMTRGMDM4M0Y4MDAxRUMwN0UwCitFQzFGODAzOTdGODFGRjAwRUJGRkY4MTQ4MDkwQzhGQzVBNUFBNTVBQTIxNTMwMDA3QzE0MzgxNTc4MDA3RTE0RjAwMDNFRUIKKzAxRTBFQzAzQzA2Q0VCMEY4MDZDRUIzRTAwMzgwNzgxRjgzODAzRkZFMEM2OTBDN0ZDMUQyNjc3QTQyNj5JPEVEMDdDMEVECisxRkYwRUQzRTM4RUQ3QzNDRURGOEZDMTVGOTE0MDExNUYxMDIwMzEzRjhFREYwRjAxNjAwMTQwNzVEQTQxNDBGNURBNDE0MUYKKzVEMDEwRkI1MTJDMDVCMTY4MDkwMzkwMDNGODAwMDkyQzdGQ0E0NUMxNDdFQTQxNEZFNUNBNDEzMDE1Q0E0MTMwMzVDQTQxMworMDc1Q0E0MTMwRjVDQTMxMzFGNUNBMzkxQzhGQzVCMTIxQ0VBN0UzRUEyRUFGRTNDMTM3QzEzNzhFQUY4RjAxMjc4RUEzRkMwCitFQTBGODAyNjRDODJCQTE5Pkk8RUMwN0MwRUMzRkYwOTEzOEZDMzhFMDkwMzkwMUYwMUZGMEVCMDNFMDkwMzgwN0MwMEZFQgorMEY4MDAxMUYxMzA3RDkzRjAwMTNFMDVCMDE3RTEzMEYxM0ZFNDkxNEMwMTIwMTE1MUYxMjAzNDkxNDgwQTIxNTNGMTIwNzQ5CisxNDAwQTI1REEyNDkxMzdFQTIxNUZFQTI1RDAwMDMxMzAxMTQwMzE0MDc2QzZDNDg1QTAwMDAxMzFGRUI3ODdCRUIzRkYzOTAKKzM4MEZDM0YwRUIwMDAzMTQwN0EyNURBMjE0MEY1RDEyMUMwMDdFMTMxRjVEMDBGRTQ5QzdGQzE0N0U1QzM4NzgwMUY4Mzg3QworMDdFMDM4MUZGRjgwRDgwM0ZFQzhGQzI0MzY3Q0E0MjY+STxFQjAzRjBFQTAxRkZBM0VBMDAwNzVDQTMxMzBGNUNBMzEzMUYKKzVDQTMxMzNGOTFDOEZDQTM1QjkwMzg3RTA3RjBFQzFGRkNFQzc4M0U5MDM4RkZFMDFGMDJDMDEzODBFQzgwMEYxNDAwNDg1QQorMTZDMDVCNDlFQjFGODAxMjAzNUJBMjE1M0YwMDA3MTUwMDVCQTI1RDAwMEYxNDdFNUIxNUZFNUQxMjFGRDk4MDAxMTMxQzE1CitGODE2M0MwMDNGMDEwMzEzMzgwMTAwMTNGMEEyMTY3MDQ4MTRFMDAwN0UxNUYwMTZFMEVERTFDMDAwRkU5MDM4MDFFMzgwNDgKKzkwMzgwMEZGMDAwMDM4MTQzQzI2M0I3QkI5MkE+STxFQjAxQzBFQjA3RTAxNEYwMTMwRjE0RTAxMzA3RUIwMzgwOTBDN0ZDCitBQjEzRjBFQTAzRkNFQTA3MUVFQTBFMUYxMjFDQTIxMjM4NUIxMjcwQTI1QkVBRjA3RTEyRTAxM0ZFQzY1QUEyMTIwMTVCMTIKKzAzQTI1QjEyMDc1QkEyMDAwRjEzRTAxM0MwMTNDMTAwMUYxM0MwMTM4MUEyRUI4MzgwMTMwM0VCMDcwMEEyMTMwRTZDNUFFQQorMDdGOEVBMDFFMDE0Mzg3OUI2MTk+STwxNTBFMTUzRjE1N0ZBMzE1N0UxNTFDMTUwMEFCRUMxRjgwRUM3RkMwRUNGMUYwRUIKKzAxQzA5MDM4MDM4MEY4MTMwNzE0MDExMzBGMTMwRTEzMUVFQjFDMDMxMzNDMDEzODEzRjBBMkVCMDAwN0EyMTVFMEEyMTQwRgorQTIxNUMwQTIxNDFGQTIxNTgwQTIxNDNGQTIxNTAwQTI1Q0EyMTQ3RUEyMTRGRUEyNUNBMjEzMDFBMjVDQTIxMzAzNUMxMjFDCiszODdFMDdFMEEyMzhGRTBGQzA1QzQ5QzdGQ0VBRjgzRUVBNzg3Q0VBM0ZGMEVBMEZDMDIwNDg4M0I2MTk+STxFQjAzRjBFQQorMDFGRkEzRUEwMDA3NUNBMzEzMEY1Q0EzMTMxRjVDQTMxMzNGOTFDOEZDQTM1QjAxN0VFQjBGODBFRDNGRTAxNUYwOTAzOUZFCiswMUMxRjA5MDM4RkMwMzg3RUMwNzA3MTQwRTAwMDEwMTFDMTNFMEVCRjgzODkxMzgzMDAzODAwMjcwQzdGQzAwMDM1QkVCRjEKK0MwRUJGMzgwMDFGRkM4RkNFQTA3RkM3RkVCRkZDMEVCRTdGODM4MEZFMUZDRUJDMDdFMTQ3RjgwMDAxRjgwOTAzOTgwMUY4MQorQzBBMjE1ODMwMDNGMDEzRjEzODAwMTAwMTMwM0EyMTUwNzQ4MTUwMDAwN0UxMzNFRUMxRTBFMTUxRTAwRkU2RDVBNDhFQjA3CitGODAwMzhFQjAxRTAyNDNCN0JCOTI2Pkk8RUIwRkMwRUEwN0ZGQTNFQTAwMUYxNDgwQTIxMzNGQTIxNDAwQTI1QkEyMTM3RQorQTIxM0ZFQTI1QkEyMTIwMUEyNUJBMjEyMDNBMjVCQTIxMjA3QTI1QkEyMTIwRkEyNUJBMjEyMUZBMjVCQTIxMjNGQTI5MEM3CitGQ0EyNUFBMkVBN0UwRUEyMTJGRTEzMUVFQUZDMUNBMjEzM0MxMzM4MTJGODEzNzhFQTc4NzBFQTdDRTAxMjFGRUEwRjgwMTIKKzNCNzlCOTE1Pkk8RDgwMUUwMDFGRUVCMDdGMDNDMDdGODAzRkY4MDFGRkMzQzBFM0MwRjA3QzA3ODNFM0MxRTNFM0MwM0UxCitFMDFGMjYxQzFGNzhEOUYzQzAxMzgwM0MzODNGRjAwMUY3ODAwRjAyRTAxNDAwMDA3ODAxQzAxM0ZFMDA3MDE4QzAwMjgwNUIKKzRBNDg0OEVCMUY4MEVBRjA3RkQ4RTA3RTVDQTIwMDAwMDIwNzE0M0YwMUZFMTcwMDQ5NUNBMjAzMEY1QzAwMDExNzdFNDk1QworMThGRTAzMUY1QzEyMDM0OURBODAwMTEzMUMxOEY4MDMzRjE1M0MwMDA3MDQwMzEzMzg0OTAyMDAxM0YwQTI0QjE1NzAwMDBGCisxN0UwNDkwMTdFMTVGMDE5RTAwM0ZFRUNFMUMwMDAxRkVFMDFFMzQ5NDk5MDM4MDBGRjAwMDAwN0M3MDAzODE0M0MzRTI2NzkKK0E0NDQ+STxEODAxRTAxM0ZFM0EwN0Y4MDNGRjgwM0EwRTNDMEYwN0MwM0ExRTNFM0MwM0UwMjYxQzFGNzg3RjM5MzgzRkYwCiswMTE0RTAwMDc4MTNDMDAwNzA4MTE0ODA0QTQ4NUFFQUYwN0ZFQUUwN0VBMjAwMDAxNDA3MDFGRTVDNUJBMjE1MEYwMDAxNUQKKzVCMTUxRjVFMTIwMzQ5OTAzODNGODM4MDE2MDMxNjA3MDAwNzAyN0YxMzAwNDkxMzdFQTIxNjBFMDAwRjE0N0M0OTE0MUUxNgorMUM1RTAwMUZFQzNDNzg0OUVCMUZFMDAwMDdDN0VBMDc4MDI5MjY3OUE0MkY+STwxNDdGOTAzODAzRkZDMDkwMzgwRkMxRjAKKzkwMzgxRjAwRjgwMTdFMTM3QzVCNDg0ODEzN0U0ODQ4MTMzRTAwMDcxNDNGNUIxMjBGNDg1QUEyNDg1QTE1N0YxMjdGOTBDNworRkNBMjE1RkY1QTQ4MTRGRUEyMTQwMTE1RkM1QUVDMDNGOEEyRUMwN0YwMTVFMDE0MEYwMDdDMTRDMDAwN0VFQjFGODAwMDNFCitFQjNGMDAxNDdFNkMxM0Y4MzgwRjgzRjAzODAzRkZDMEM2NDhDN0ZDMjAyNjc3QTQyQT5JPDkwMzkwNzgwMDdDMDkwMzkxRgorRTAzRkYwOTAzOTNDRjA3ODdDOTAzOTM4RjhFMDNFOTAzODc4N0ZDMDAxNzA0OTdFRUNGRjAwRDlGMEZFMTQ4MDEzRTA1Q0VBCiswMUUxMTNDMTVDQTJEODAwMDMxNDNGQTI1Q0EyMDEwNzE0N0ZBMjRBMTQwMEEyMDEwRjVDNUU1QzRCNUExMzFGNUVFQzgwMDMKKzVFMDEzRjQ5NUE2RTQ4NUE1RTZFNDhDN0ZDMDE3RjEzM0VFQzcwRkM5MDM4N0UzRkYwRUMwRjgwMDFGRUM5RkNBMjVCQTIxMgorMDFBMjVCQTIxMjAzQTI1QjEyMDdCNTEyQzBBMzI5MzU4MEE0MkE+STxFQ0Y4MDM5MDM4MDdGRTA3OTAzODFGODcxRjkwMzgKKzNFMDNCRjAxN0MxM0ZFRUJGODAxMTIwMTM4MDNGMDAwNDg0ODEzRkMxMjBGNUIwMDFGMTMwMTE1RjhFQTNGODBBMjAwN0YxMworMDMwMTAwMTNGMEEzNDgxMzA3NDgxNEUwQTMxNDBGNDgxNEMwQTMxNDFGMTU4MDE0M0ZBMjAwN0MxMzdGRUNGRjAwNkM1QUVCCiswM0JGMzgxRjBGN0YzODA3RkU3RUVBMDFGMEM3RkMxNEZFNUNBMzEzMDE1Q0EzMTMwMzVDMTMwNzQ4QjUxMkMwQTMyMDM1NzcKK0E0MjY+STwzOTAzQzAwM0YwMzkwRkYwMUZGQzM5MUU3ODNDMEYzODFDN0M3MDNBM0MzRUUwM0Y4MDM4MzgzRkMwRUI3RjgwCiswMDc4MTUwMDAwNzAxMzAwMTUxQ0Q4RjA3RTkwQzdGQ0VBRTBGRTVCQTIxMjAwMTIwMTVCQTMxMjAzNUJBMzEyMDc1QkEzMTIKKzBGNUJBMzEyMUY1QkEzMTIzRjkwQzlGQzEyMEUyMTI2NzlBNDIzPkk8MTRGRTkwMzgwN0ZGODA5MDM4MEY4M0MwOTAzODNFCiswMEUwNDkxM0YwMDE3ODEzNzAwMUY4MTNGMDAwMDExMzAzMTNGMEEyMTVFMDAwMDNFQjAxQzA2REM3RkM3RkVCRkZDMDZDMTMKK0Y4MTRGRTZDN0Y2RDEzODA3RjAxMEYxM0MwMTMwMDE0M0YxNDFGMTQwRjEyM0UxMjdFMDBGRTE0ODBBMzQ4RUIxRjAwMTJFMAorNkMxMzNFMDA3MDVCNkM1QjM4MUUwM0UwNkNCNDVBRDgwMUZFQzdGQzFDMjY3QUE0MjI+STxFQjAzODBFQjA3QzAxMzBGQTQKKzEzMUYxNDgwQTMxMzNGMTQwMEEzNUIxMzdFMDA3RkI1RkNBMkI2RkMzODAwRkMwMEEzMTIwMTVCQTMxMjAzNUJBMzEyMDc1QgorQTMxMjBGNUJBMzEyMUZFQjgwMUNBMjE0M0MwMDNGMTMzOEVCMDA3ODE0NzAxNEYwMTRFMEVCMDFDMEVBM0UwMzM4MUYwNzgwCiszODBGMEYwMEVBMDdGQ0VBMDFGMDE4MzU3OUIzMUM+STwxM0Y4RDgwM0ZFRUIwMUMwRDgwNzhGRUIwM0UwMzkwRTBGODAwNworMTIxRTEyMUMwMDM4MTQwRjEzMUYwMDc4MTVDMDEyNzAwMTNGMTMxRjAwRjAxMzAwMDBFMDE1ODA1QkQ4MDA3RTEzM0ZBMjAxCitGRTE0MDA1QjVEMTIwMTQ5MTM3RUEyMTVGRTEyMDM0OUVCRkMwRUEyMDIwMTEzMUUxNjFDMTVGODEzRTAxNjNDRDlGMDAzMTMKKzM4MTQwNzAwMDFFQ0YwNzA5MTM4MUVGOEYwM0EwMEY4M0M3OEUwOTAzOTNGRjAzRkMwOTAzOTBGQzAwRjAwMjcyNjc5QTQyRAorPkk8MDFGMDEzMEVEODAzRkMxMzNGRDgwNzFFRUI3RjgwRUEwRTFGMTIxQzEyM0MwMDM4MTQzRjQ5MTMxRjAwNzAxNDBGQTIKKzVCRDhGMDdFMTQwMDAwRTA4MDEzRkVDNjQ4NUIxNTBFMTIwMTVCMTUxRTAwMDMxNDFDNUJBMjE1M0MwMDA3MTQzODVCNURBMworNURBMjRBNUExNDAzMDAwMzVDNkQ0OEM3RkMwMDAxMTMwRTM4MDBGODNDRUI3RkY4RUIwRkMwMjEyNjc5QTQyNj5JPDAxRjAKKzE1MDdEODAzRkM5MDM5MDM4MDFGODBEODA3MUU5MDM5MDdDMDNGQzBEODBFMUYxMzBGMTIxQzEyM0MwMDM4MDIxRjEzMUY0OQorRUM4MDBGMDA3MDE2MDdBMjQ5MTMzRkQ4RjA3RTE2ODAwMEUwRUQwMDAzMTNGRUM2NDg0OTEzMDcxODAwMDAwMTE0N0U1QjAzCitGRTVCMDAwMzE2MEU0OTVCQTIxNzFFMDAwNzAxMDExNDFDMDFFMDVCMTczQzE3MzhBMjE3NzgxNzcwMDIwMzE0RjA1RjAwMDMKKzAxMDcxMzAxNkQ0ODZDNDg1QTAwMDE5MDM5MUU3QzA3ODAyODAwRkMzQzNFMEZDN0ZDOTAzOTNGRjgxRkZFOTAzOTBGRTAwMworRjAzMjI2NzlBNDM3Pkk8OTAzOTA3RTAwN0MwOTAzOTFGRjgxRkY4OTAzOTc4N0MzODNDOTAzOEYwM0U3MDNBMDFFMDFFRTAKK0ZFMzgwM0MwMUYwMTgwMTNDMEQ4MDcwMDE0RkM0ODE0ODAwMDBFMTU3MDAyM0YxMzAwMDAxRTkxQzdGQzEyMUNBMkM3NUFBMgorMTQ3RUEyMTRGRUEyNUNBMjEzMDFBMjRBMTM3MEEyMDEwMzE0RjAxNkUwMDAxQzVCMDA3RTE0MDEwMTA3MTRDMDAwRkVFQzAzCis4MDAxMEYxMzA3MDEwRUVCMEYwMDM5NzgxQ0Y4MUU5MDM4Mzg3QzNDMzkzRkYwM0ZGMDM5MDdDMDBGQzAyNzI2N0NBNDI3PgorSTwxM0YwRDgwM0ZDRUIwMUMwRDgwNzFFRUIwM0UwRDgwRTFGMTMwNzEyMUMxMjNDMDAzODE0MEY0OTE0QzAxMjcwQTI0OTEzCisxRkQ4RjA3RTE0ODAxMkUwMTNGRUM2NDgxMzNGMTYwMDEyMDE1QjVEMDAwMzE0N0U1QkEyMTVGRTAwMDc1QzVCQTIxNDAxNUQKK0EzMTQwMzVEMTQwNzAwMDMxMzBGRUJGMDFGMzkwMUY4N0ZFMDM4MDA3RkY3RUIxRkM3RUIwMDBGNURBMjE0MUYwMDNGNUM0OAorMTMzRjkyQzdGQzE0N0UxNDdDMDA3RTEzRkMzODcwMDFGOEVCMDNFMDZDNDg1QTM4M0MxRjgwRDgwRkZFQzhGQ0VBMDNGMDIzCiszNjc5QTQyOD5JPDkwMzkwM0MwMDM4MDkwMzgwRkYwMDdEOTFGRjgxMzAwNDk2QzVBMDE3RjEzMEU5MDM4RkZGRTFFOTAzOAorRjgzRkZDMzkwMUYwMDdGODQ5QzY1QTQ5NUIxNDAxQzc0ODVBNEE1QTRBQzdGQzE0MUU1QzVDNUM0OTVBNDk1QTQ5NUE0OUM4CitGQzEzMUU1QjQ5MTMxQzVCNDg0ODEzM0M0ODQ4MTMzODQ5MTM3ODAwMDcxNEY4MzkwRkY4MDFGMDM5MUZGRjA3RTAzODNFMUYKK0ZGRDgzQzBGNUIwMDc4NUNEODcwMDc5MEM3RkMzOEYwMDNGQzM4RTAwMEYwMjEyNjdCQTQyMj5JCitFCislRW5kRFZJUFNCaXRtYXBGb250CislRFZJUFNCaXRtYXBGb250OiBGZSBlY3R0MTIwMCAxMiAxMQorL0ZlIDExIDEyMiBkZjwzODdGRkZGOEI1N0U4MEEyNUM2QzVCRDgwMUZDQzlGQ0IzQjNBM0VFMDNFMEVFMDdGMEE5MDA3RkI3CitGQ0I4RkNBNDZDMTZFMDJDM0Q3REJDMzM+NzYgRDxEOTA3RkUxMzc4OTAzOTNGRkZDMDdDOTBCNUVBRjBGQzQ4MTRGQzAwMDcKKzE0RkY1QUVCRkMwMzM5MUZGMDAwN0Y0ODQ4MTMzRjAxODAxMzFGMDA3RjE0MEY5MEM3MTIwNzQ4MTQwMzVBQTIxNTAxQTQ2QworRUMwMEY4NkMxNTAwN0Y3RjZDN0U3RkVBMUZGRTM4MEZGRkUwNkMxM0ZGNkMxNEYwNkMxNEZDNkM2QzEzRkYwMTFGMTQ4MDAxCiswMzE0QzBEOTAwM0YxM0UwMDIwMzEzRjA5MTM4MDAzRkY4RUQwRkZDMTUwN0VEMDNGRTE1MDExNTAwMTZGRkEyMDA3QzE1N0YKKzEyRkVBNTZDMTVGRjE2RkU3RkVEMDFGQzZEMTMwMzAxRjBFQjA3RjgwMUZDMTMwRjkwMzlGRjgwN0ZGMDkxQjUxMkUwMTZDMAorMDBGQzE1ODAwMTNGRUJGRTAwRDhGODBGNUJEODc4MDAxM0UwMjgzRjdCQkQzMz44MyBEPEVCMUZGQzkwQjU3RTAwMDMxNEUwCis0ODgwNDgxNEZDNDg4MDkwMzhGMDA3RkZFQkUwMDE2RTdGMTUzRjZDNDg4MDZDNDgxMzFGQzg3RjE1MEZBNUVDMEZGRjQ5QjUKK0ZDMTMxRjEzN0Y0OEI2RkMwMDA3MTQwRjQ4MTNDMDM4MUZGQzAwRUEzRkYwRUE3RkMwNUI0OEM3RkM1QUE1NkMxNDFGN0U2RAorMTM3RkQ4M0ZFMDQ5N0VEOUY4MDdFQkZGRjA2Q0I3MTJGODdFNkMxNEYzNkMxNEMxQzY5MTM4MDAzRkYwRDkxRkYwOTBDN0ZDCisyRDJFN0JBQzMzPjk3IEQ8RUNGRkYwMDEwNzEzRkUwMTFGRUJGRjgwNDkxNEMwNDkxNEUwNDhCNjEyRjA0OEVCQzAxRjkwMzgKK0ZFMDAwRjQ4NUE0ODVBNDg0OEVCMDdFMDQ5RUIwM0MwNDg0ODkwQzdGQzVCQTIxMjdGOTBDOUZDQTI1QTVBQTk3RTdFQTI3RgorMDAzRkVDMDFGMDZERUIwM0Y4NkM3RTZEMTMwNzZDNkMxNEYwNkM2QzEzMEYwMUZGRUIxRkUwNkNFQkUwN0Y2QzkwQjUxMkMwCis2QzE1ODAwMTNGMTQwMDZEMTNGQzAxMDc1QjAxMDAxM0MwMjUyRTc5QUMzMz45OSBEPEVEN0ZGODRCN0U1Q0EyODAxNTdGMTUKKzAxQUJFQjAxRkYwMTA3MTNDMTAxMUYxM0YxMDE3RjEzRjk5MEI2RkM1QTQ4MTM4MTM5MDdGRTAwM0ZEODBGRjgxMzFGNDkxMworMEY0ODQ4MTMwNzQ5MTMwMzEyM0Y0OTEzMDExMjdGOTBDN0ZDQTI1QTVBQTk3RTdFMTUwMzdGMTIzRjZEMTMwN0EyNkM2QzEzCiswRjZEMTMxRjZDNkMxMzNGNkM2QzEzN0YyNjAzRkY4MUI1MTJGMDkxQjYxMkY4QzYwMkZEMTNGQzZEMTNGOTZEMDFFMTEzRjgKKzAxMEYwMTgwMTNGMEQ5MDFGRUM4RkMyRTNFN0RCQzMzPkk8NEFCNEZDMjYzRkZDMDcxM0MwMjY3RkZFMUYxM0YwMDBGRjAxCis3RjdGOTFCNUZDNkNCNjdFNkNFQzA3RkVDNkVCRjgwMUVDRjAwMDRBN0Y0QTdGNUNBMjkxQzdGQ0EzNUJCM0E0M0IzRkZGRjgKKzBGRkZGQzQ4NkQ0ODEzRkVCNTZDNDgxM0ZGQTI2QzQ5NkMxM0ZFNkM0OTZDMTNGQzMwMkM3RkFCMzM+MTEwCitEPEVCMDFGRTkwMzgwRkZGQzAwMTNGMTNGMDQ5N0Y5MEI1N0U0ODgwNDhFQjAzRkYyNjA3RkMwMDEzODA0ODQ4RUI3RkMwNDkKKzEzM0Y0ODQ4RUIxRkUwNDkxMzBGNDg0OEVCMDdGMEEyMDA3RjE1Rjg5MEM3MTIwM0EzMDBGRUVDMDFGQ0FBNkMxNDAzNkMxNQorRjhBMjZEMTMwNzAwM0YxNUYwNkQxMzBGQTI2QzZDRUIxRkUwNkQxMzNGNkM2Q0VCN0ZDMDZDNkNFQkZGODAyNjAzRkYwMzEzCiswMDZDRUJGRkZFNkM1QzZENUI2RDVCMDEwRjEzQzBEOTAxRkVDN0ZDMjYyRTdBQUMzMz5JPEVDMDFGRTNBM0ZGQzBGRkZDMAorNDg2QzQ4MTNGMDAwRkYwMTdGN0Y5MUI1MTJGRTZDQjdGQzZDRUJGRTA3QzZEOUY4MDAxMzgwMDJFMEVCN0ZDMDRBRUIzRkUwCis0QTEzMUZFRTBGRjA5MUM3RkMxNjA3NDkxNUY4MTYwM0EyMTdGQzE2MDFBOTE2MDMxN0Y4QTI2RDE0MDcxN0YwNkUxMzBGMTcKK0UwNkUxMzFGRUUzRkMwNkUxMzdGOTEzOUY4MDFGRjgwREFGRTA3MTMwMDkxQjU1QTQ5NUM2RTVCNkUxM0UwMDIwRjEzODBEQQorMDNGRUM3RkM5MUM5RkNBRjM4M0ZGRkY4NDg3RkI1N0VBMjZDNUI2QzVCMkU0MjdGQUIzMz5JPEVEMDNGRTNCN0ZGRjgwMUYKK0ZGODBCNUQ4QzA3RjEzRTAwMkMxQjVGQzAyQzMxNEYwMTRDNzZDOTAzOENGRkUwRjM5MDAxRkRGRjA5MTM5RkZDMDA3RTA5MgorMzg4MDAzQzA5MkM4RkM1QzVDNUNBMjVDQTI1Q0EzNUNCMjAwN0ZCNTEyRkVCN0ZDQTQ2QzVDMkMyQzdEQUIzMz4xMTQKK0Q8RUIwM0MwNDk3RTEzMEZBQTAwM0ZCNjEyRkM0ODgxQjdGQ0EzNkM1RDI2MDAwRkUwQzhGQ0IzQTMxNjFGRUUzRjgwQTUxNgorN0Y2RTE0MDAwMTA3NUM2RTVBOTEzOEZFMDdGRTZEQjU1QTZENUM2RDVDNkU1QjAyMUYxMzgwREEwN0ZDQzdGQzI5Mzg3RUI2CiszMz4xMTYgRDwzQjdGRkY4MDFGRkZFMEI1NkM0ODEzRjA2RTQ4MTNGOEEyNEE2QzEzRjA2QzQ5NkMxM0UwRDgwM0Y4QzdFQQorRkMwMDAwMDExNDAxNUU3RjAwMDAxNDAzNkQ1QzEzN0VBMjAxN0Y0OTVBN0ZBMjZFNDg1QTEzMUZBMjZENkM0ODVBQTIxNEUwCiswMTA3NDlDN0ZDQTIxNEYwMTMwMzE1N0VFQjAxRjhBMjE1N0MwMTAwMTNGQzE0RkM1RDE0N0MxNDdERUMzRkYwQTM2RTVBQTMKKzZFNUFBMjE0MUY1REEyMTQzRjkyQzhGQ0EzMTQ3RUEyMTRGRTAwM0Y1QjEzMDEzODdGODFGODEzODNFQjg3RjAxMzlGRUJGRgorRTA2QzVCNUM2QzkwQzlGQ0VBMEZGQ0VBMDNGMDJENDI3REFBMzM+MTIxIEQgRQorJUVuZERWSVBTQml0bWFwRm9udAorJURWSVBTQml0bWFwRm9udDogRmYgZWN0dDE0NDAgMTQuNCA2CisvRmYgNiAxMTMgZGY8MDA3RkI1RkNCNjdFODFBMzVENkM5MUM5RkNDNjQ4Q0FGQ0IzQjNBQkVGMDdDMEVGMEZFMEFCMDA3RgorQjhGQ0I5RkNBNTZDMTdDMDMzNDk3QkM4M0Q+NzYgRDwwMTAzQjUxMkMwMDEzRjE0RkM5MEI3RkMwMDAzMTZDMDQ4MTZFMDQ4CisxNkYwNDgxNkY4OTFDN0ZDMDFGODE0MUY0ODQ4RUMwRkZDMDFDMDE0MDNBMjQ4NDhFQzAxRkVBMzkwQzlGQ0E1NDgxNkZGNDgKKzE2N0ZCM0FFNkMxNkZGQTI2QzE2RkVBNTZEMTQwMUEzNkM2Q0VDMDNGQzZEMTQwNzZEMTQwRkQ4MUZGQ0VDM0ZGODkwMzlGRgorODAwMUZGOTFCNkZDNkMxNkYwNkMxNkUwNkMxNkMwQzYxNjAwMDEzRjE0RkMwMTAzMTRDMDMwNEI3QUM5M0Q+NzkKK0Q8REFGRkUwMTNGMDAxMDcwMUZDMTNGODAxMUZFQkZGODEwMTdGMTRFMTQ4QjYxMkYxNDgxNUZCNDgxNUZGNDhFQjgwM0Y5MAorMzhGQzAwMDdEODFGRjAxMzAxNDg0ODdGNDkxNDNGNDg1QTE2MUY5MEM4MTIwRjVBNDgxNTA3QTMxNjAzQTM3RTZDRUQwMUYwCis5M0M3RkM3RjZDN0U3RjZDN0UxM0ZDNkNCNEZDNkMxM0YwNkMxM0ZGNkMxNEY4NkM2Q0VCRkY4MDZEMTRFMDAxMEYxNEY4MDEKKzAxMTRGRUQ5MDAxRjdGMDIwMTE0ODBEQTAwMUYxM0MwMDMwMTEzRTA5MjM4MDAzRkYwRUUxRkY4MTYwN0VFMDNGQ0EyRUUwMQorRkUxNjAwQTIxN0ZGMDA3QzE2N0YxMkZFQTU3RTE3RkYxN0ZFN0YxNjAxNkRFQzAzRkM2RDE0MDcwMUY4RUMwRkY4NkQxNDFGCitEOUZGODBFQjdGRjA5MTM5RjgwMUZGRTA5MUI2MTJDMDQ4MTY4MDQ4NkMxNTAwMDExRjVDMDEwNzE0Rjg0OEM2MTRFMDAwNzgKKzAxMEY5MEM3RkMzMDRCN0FDOTNEPjgzIEQ8RUMxRkY4OTFCNTdFMDEwMzE0RTAwMTBGMTRGODQ5ODA0OTgwNDk4MDkwMjZGRgorRjgwRjEzODA0OEQ5QzAwMTEzQzA0ODkwQzdFQTdGRTBEODA3RkMxNDFGNDg0OEVDMEZGMDVCNDg0OEVDMDdGODE2MDM0ODVBCis0OTE1RkMxNjAxMTI3RjkwQzhGQzE3RkU0ODE1MDA1QUI4RkNBNjE3RkM0OENBRkM3RTdFQTM3RjEyM0Y3RjZDNkMxNTdDMTcKK0ZFNkM3RTdGNkM2QzE0MDE2Q0I0RUMwM0ZDNkUxMzA3NkMwMUYwRUIxRkY4NkMwMUZFRUJGRkYwNkRCNjEyRTA2RDE1QzAwMQorMEYxNTgwNkQxNTAwMDEwMTE0RkM2RDZDMTNFMDAyMDc5MEM3RkMyRjM2NzlCNDNEPjEwMQorRDxFRDNGRTAzQTdGRkUwMUZGRkNCNTAwMDc3RjAyMUY2RDdFNUM0QTgwOTFCNjdFNkNFQ0MwN0YzQjAwN0ZGRTAwMUZGMDRBCisxMzBGNEExMzA3NEE4MDVDNEExMzAzQTI1Q0EzOTFDN0ZDQjNBOTAwN0ZCNTQ4QjUxMkY4QjYwMDgzMTRGQzE1ODdBMzE1ODMKKzZDMDIwMTE0RjgzNjM0N0RCMzNEPjExMCBEPEVEMUZGMEQ4N0ZGRUVCRkZGQ0I1MDAwMzEzRkYwMjBGMTRDMDAyM0Y4MDRBCis4MDkxQjY3RTZDOTEzOEMwN0ZGQ0M2NkM5MDM4MDAwRkZFMDJGQzEzMDc0QUVCMDFGRjRBN0Y0QTE1ODA0QTE0N0Y0QUVDM0YKK0MwQTJFRjFGRTA5MUM4RkMxNzBGQTIxOEYwQTIxNzA3QTkxNzBGQTIxOEUwODAxNzFGMThDMDZFMTQzRkEyNkVFQzdGODAxNworRkY2RTQ5MTMwMDZFNUI2RTQ5NUE2RUVCMUZGQzkxMzlGRkMwRkZGODkyQjVGQzZFMTRFMDZFNUMwMjBGNUM2RTQ5QzdGQzAyCiswMTEzRjg5MTM4MDAzRkUwOTJDOUZDQjMwMDdGQjVGQ0I2N0VBNTZDOTFDOUZDMzQ0RjdEQjMzRD4xMTIKK0QgRQorJUVuZERWSVBTQml0bWFwRm9udAorJURWSVBTQml0bWFwRm9udDogRmcgZWNzczEwMDAgMTAgNTMKKy9GZyA1MyAxMjIgZGY8QkQxMkMwQTU1MjA1ODA5ODUzPjIyIEQ8OTAzOTAxRjgwN0YwRUIwN0ZFMTMwRjEzMUYxMzNGRUI3RgorMEVFQjdFMDIwMUZFQzhGQzVCQTIxMjAxQUVCNTM4RkUwN0YwQTUzODAxRkMwMEIzQUUyNDNEN0ZCQzJDPjI4CitEPEI1MTJGQ0E1MTYwNTdGOTQxQz40NSBEPDEyRkVBNzA3MDc3ODg2MTc+STxFQjAzRjhFQjFGRkYwMTdGMTNDMDkwQjU3RQorNDg4MDM5MDNGRTBGRjgzOTA3RjgwM0ZDNDg0ODZDN0VFQkUwMDA0ODQ4MTM3RjQ5N0YwMDNGMTU4MEEyOTBDNzEyMUY0ODE1CitDMEEzMDA3RTE0MEZBMzAwRkUxNUUwQjMwMDdGRUMxRkMwQTU2QzZDRUIzRjgwQTM2QzZDRUI3RjAwQTI2QzZDMTNGRUVCRjAKKzAxNkM2QzQ4NUEzOTAzRkUwRkY4NkNCNTVBNkM1QzZENUIwMTFGOTBDN0ZDRUIwM0Y4MjMzQTdEQjcyQT40OAorRDwxNEMwMTMwMTEzMDcxMzFGMTNGRkI1RkNBNDEzMUYxMjAwQjNCM0E1MDA3RkI1MTJGMEE1MUMzODc5QjcyQT5JPEVCMEYKK0Y4RUI3RkZGNDhCNTEyQzA0ODgwNDg4MDQ4ODAzOTFGRjAxRkZDOTAzOEMwMDdGRTM5M0YwMDAxRkYwMDNFN0YwMDdFMTU4MAorMDA3QzE0N0YwMEZDMTQzRjVBMDA3ODE1QzAxMjM4MDAzMDE0MUYxMjEwQzhGQ0EyMTUzRkEyMTY4MEEyMTU3RjE2MDAxNUZFCitBMjRBNUE0QTVBNEE1QTRBNUE0QTVBNEE1QTRBQzdGQzE0RkU0OTVBNDk1QTQ5NUFFQjBGQzA0OTVBNDlDOEZDMTM3RTVCNDgKKzVBNDg1QTQ4NUE0ODVBNDg1QTQ4QzlGQzQ4QjYxMkMwQTYyMjM4N0RCNzJBPkk8RUIwN0Y4RUIzRkZGOTBCNTEyQzA0ODgwCis0ODgwMDAwRjgwOTAzOEZDMEZGQzM5MUZFMDAzRkUzODNGQzAwMTZDQzdGQzAwMEU4MEEyMDAwNDgwQzhGQ0EyNURBMjVEMTQKKzAxNUQxNDAzNEE1QTRBNUFFQzdGRTA5MDM4MUZGRkMwNUQ0QUM3RkM2RTdFMTVFMDkwMzgwMDBGRjhFQzAzRkNFQzAwRkUxNQorN0YxNjgwMTUzRjE2QzBBMkVEMUZFMEE3MDA0MDE0M0YwMDYwMTVDMDEyNzAwMEY4RUM3RjgwN0VCNEVDRkYwMDM4N0ZDMDAzCiszOTNGRjgwRkZFNkNCNTVBNkM1QzAwMDM1QzZDMTRDMDZDNkM5MEM3RkNFQjA3RkMyMzNBN0RCNzJBPkk8RUMwN0Y4MTQwRgorQTIxNDFCMTQzQkEyMTQ3QjE0NzMxNEYzMTMwMUEyRUIwM0UzQTJFQjA3QzMxMzBGQTJFQjFGODNBMkVCM0YwMzEzN0YxMzdFCisxM0ZFMTNGQ0VBMDFGODEyMDMxM0YwMTIwNzEzRTAxMjBGRUExRkMwMTM4MDEyM0YxMzAwNUExMkZFQjcxMkY4QTVDNzM4MDMKK0Y4MDBBRTI1MzY3RUI1MkE+STwwMDFGQjUxMkZFQTYwMUMwQzhGQ0FERUJDMUZDRUJDRkZGMDFERjEzQzA5MEI1N0U4MTkwCiszOEZFMDdGODkwMzhGODAzRkM0OTZDN0U0OTZDN0U1QjQ5N0ZDODEzODBBMjE1M0YxNkMwQTlFRDdGODAxMjEwMTIzOEVERkYKKzAwMDA3QzVCQjQ0OTVBNkM2QzQ4NUEzOTNGRjAxRkY4NkNCNTVBNkM1QzZDNUM2QzVDQzY0OUM3RkNFQjFGRjAyMjM4N0RCNQorMkE+STxFQzNGRTA5MDM4MDFGRkY4MDEwNzEzRkU1QjEzM0Y1QjkwMzhGRkUwMUU0OEVCMDAwNjQ5OTBDN0ZDRUEwM0Y4NDgKKzVBQTI0ODVBNDg1QUEyNUIxMjNGQTIzODdGMDA3RjkwMzgwM0ZGQzAwMTBGMTNGMDAxM0Y3RkQ4N0U3RjdGMzlGRUZFMDdGRQorMzhGRkY4MDE5MDM4RTAwMEZGNDk3RkVEM0Y4MDVCRUQxRkMwOTBDN0ZDQTJFRDBGRTA1QUE0N0UxMjdFMTI3RkE0NkNFQzFGCitDMDdGQTIwMDFGRUMzRjgwN0Y2QzZDRUI3RjAwNUQzOTA3RjgwMUZFOTAzOEZFMDdGQzZDQjU1QTZDNUM2QzVDMDEzRjVCNkQKKzkwQzdGQ0VCMDNGQzIzM0E3REI3MkE+STxCNzEyRTBBNkM4MTIwN0VEMEZDMEVEMUY4MEVEM0YwMDE1N0UxNUZFNUQ0QTVBCisxNDAzNEE1QUEyNEE1QTRBNUFBMjRBNUFBMjRBQzdGQ0EyMTRGRUEyMTMwMTVDMTMwMzVDMTMwN0EyNUMxMzBGQTM1QzEzMUYKK0EzNUMxMzNGQTU1QzEzN0ZBODIzMzc3REI1MkE+STxFQjAzRjhFQjFGRkYwMTdGMTNDMDkwQjU3RTAwMDMxNEY4QTIzOTA3CitGQzA3RkMzOTBGRjAwMUZFRUJFMDAwNDg0ODEzN0Y0OTdGMDAzRjE1ODA5MEM3MTIxRkE2NkM2Q0VCM0YwMEEyNkM2QzEzN0UKK0EyNkM2QzVCMzkwM0Y4MDNGOEM2QjUxMkUwNkQ1QkQ5MEZGRUM3RkM0OTdFOTBCNTEyRTA0OEVCMUZGMDM5MDdGODAzRkMzOQorMEZFMDAwRkU0ODQ4MTM3RjQ4NDhFQjNGODA5MEM3MTIxRjQ4MTVDMEEyMDBGRUVDMEZFMEE4MDA3RkVDMUZDMEEyNkQxMzNGCiswMDNGMTU4MDZEMTM3RjNBMUZGMDAxRkYwMDM5MEZGQzA3RkU2Q0I1NUE2QzVDNkM1QzZDNUMwMTNGMTM4MEQ5MDdGQ0M3RkMKKzIzM0E3REI3MkE+STxFQjAzRkNFQjFGRkYwMTdGMTNDMDkwQjU3RTQ4ODA0ODgwMzkwN0ZDMDdGQzM4MEZGMDAxNDg0ODZDCis3RTQ5MTM3RTQ4NDgxMzdGODE0OEM3MTM4MEEyMTUxRjAwRkUxNUMwQTMxNTBGQTIxNkUwQTUxNTFGMTI3RkEyMTUzRjZDN0UKKzE1N0Y2QzdFNkQxM0ZGMzgwRkYwMDM5MDM4RkMwRkVGNkNCNUVBQ0ZDMDZDMTQ5RjZDRUJGRTFGMzgwMDdGRjhFQjFGQzA5MAorQzcxMzgwMTUzRkEyRUQ3RjAwQTIxNUZFQTI0QTVBNEE1QTAwMDYxMzA3MDAwN0VCMUZGMDM5MEZDMDdGRTA5MEI1NUE0ODVDCis2QzkxQzdGQzZDMTNGQzAwMDE1QjM4MDAzRkMwMjMzQTdEQjcyQT5JPEVDMDdGOEEyNEE3RUEyNEE3RUEyMTU3RUVDM0Y3RgorMTQzRUEyOTEzODdFM0Y4MEEyMTQ3QzAyRkM3RjE1MUZBMkQ5MDFGODdGMTUwRjAxMDM4MDE0RjBBMjAxMDc2RDdFMTRFMEEyCiswMTBGNkQ3RTE0QzBBMjAxMUY2RDdFMTQ4MDAxM0Y4MDgxOTFDN0ZDNDk4MTE2N0YxMzdFMDFGRTZFN0U5MEI3RkNBMjQ4ODIKK0EzRDgwM0Y4QzdFQTBGRjA1QjAwMDc4MjE2MDc1QjAwMEY4MjE2MDM1QjAwMUY4MjE2MDE1QjAwM0Y2RjdFQTI0OEM5MTM4MAorMTc3RjEyN0UwMEZFMTdDMDMyM0E3RUI5Mzc+NjUgRDxCNjdFMTVGODE1RkU2RjdFODJEOTAwMDExM0YwOTEzODAwM0ZGODE1CiswRjZGN0U2RjdFMTUwMTE1MDA4MjgyQTQ1RTVFMTUwMTRCNUExNTA3NEI1QUVEM0ZGMEVERkZDMDkwQjY1QTRCQzdGQzE1RjgKKzE1RkYxNkMwRDkwMDAzMTNGMDkxMzgwMDNGRjhFRDA3RkM2RjdFRUQwMEZGRUU3RjgwRUUzRkMwQTIxNjFGMTdFMDE2MEZBNAorMTYxRjE3QzAxNjNGQTJFRTdGODBFRDAxRkY0QjEzMDBFRDBGRkVFRDdGRkM5MEI2NUExNkUwMTY4MDRCQzdGQzE1RTAyQjNBCis3OUI5Mzc+STw5MTM4MDNGRjgwMDIxRjEzRjg5MUI2RkM0OTE1QzAxMzA3NUI0OTQ4QzYxMzgwRDk3RkYwMTMwRkQ5RkZDMAorMTMwMzRBMTMwMTQ4OTBDOUZDNDg1QTQ4NUE1QjEyMEY1QjQ4NUFBMjQ4NUFBMzQ4NUFBNDQ4Q0FGQ0FDNkM3RUE0NkM3RUEzCis2QzdFQTI2QzdFN0YxMjA3N0Y2QzdFNkM2QzE1MjA2QzZEMTRFMDZFMTMwMUQ5N0ZGMDEzMEZEOTFGRkUxMzdGNkRCNkZDNkQKKzE1QzAwMTAxMTUwMDZENUMwMjFGMTNGMDAyMDMxMzgwMkIzRTdCQkIzNT5JPEI3MTJGMEE2OTBDOUZDQjM5MEI2MTJDMEE1Cis5MEM5RkNCM0EzOTBCNjEyRkNBNzI2M0E3OEI5MzI+NjkgRDw5MTM4MDNGRjgwMDIzRjEzRjg5MUI1MTJGRTAxMDNFQ0ZGQzAKKzQ5MTVFMDVCOTAzODNGRkUwMEQ5N0ZGMEVCMUZDMEQ5RkZDMDEzMDc0QTEzMDE0ODkwQzgxMjQwNDg0ODE1MDA0ODVBNUIxMgorMEY1QjQ4NUFBMjQ4NUFBMzQ4NUFBNDQ4Q0FGQ0E5OTIzODNGRkZGMEEzNkM3RUEyRUQwMDA3QTI2QzdFQTM2QzdFQTI2QzdFCis3RjEyMDc3RjZDN0U2QzdFNkM3RjgwRUI3RkYwRDkzRkZFMTM3RjAxMEZCNkZDN0Y2RDE1QzAwMTAwMTUwMDAyM0YxM0Y4MDIKKzAzMTM4MDJDM0U3QkJCMzc+NzEgRDwxMkZGQjNCM0IzQTQwODNBNzlCOTE3PjczIEQ8MDBGRUVEMUZGMEVFM0ZFMEVFN0ZDMAorRUVGRjgwNEIxMzAwNEI1QTRCNUE0QjVBNEI1QTRCNUE1RTRCNUE0QkM3RkM0QTVBNEE1QTRBNUExNDBGNEE1QTRBNUE0QTVBCis0QTVBNDk5MEM4RkM0OTVBMTMwNzQ5N0VBMjQ5N0Y0OTdGRUI3RjlGOTAzOEZGMUZFMDZDNDg2QzdFMTQwNzAxRkM3RjQ5NkMKKzdFRUJGMDAxMDFFMDdGNDk2QzdFNDk3RjkwQzc3RjQ4NkU3RTE1MUY4MjZGN0UxNTA3ODI2RjdFMTUwMTgyNkY3RTgyMTc4MAorRUUzRkMwMTYxRjE3RTBFRTBGRjAxNjA3MTdGOEVFMDNGQzJFM0E3OEI5M0E+NzUgRDxCNEZDQjNCM0IwOTBCNjEyQzBBNjIyCiszQTc5QjkyRD5JPEQ4RkZDMEVEMDdGRkEzNkQ1REEyNkQ1RDAwRkUxNzdGQTI2RDE1M0YwMTc4MTUzRUEyMDE3QzE1N0VBMgorNkQxNUZDQTMwMTNGMTQwMTZEMTVGOEEyNkUxMzAzMDEwRjE1RjA2RTEzMDdBMjAxMDcxNUUwNkUxMzBGQTIwMTAzMTVDMDZFCisxMzFGQTIwMTAxMTU4MDZFMTMzRkEyMDEwMDE1MDA2RTVCMDI3QzEzN0UwMjdFMTNGRUEyMDIzRTVCRUMzRjAxQTIwMjFGNUIKKzE1ODNBMjAyMEY1QjE1QzcwMjA3NUJBMzkxMzgwM0VGQzBBMjE1RkY2RTVCQTI2RTkwQzdGQ0EzOTJDOEZDQTIzODNBNzhCOQorNDk+STxEOEZGRTBFQzFGQzBBMjdGQTI3RkEyNDg3RUEyMTM3RUEyMTM3RjdGODAxMzFGQTI2RDdFQTI4MDEzMDc4MDEzMDMKKzgwMTMwMTgwMTMwMDgwQTIxNDdGQTJFQzNGODBBMkVDMUZDMEEyMTQwRjE1RTAxNDA3MTVGMDE0MDMxNUY4MTQwMTE1RkMxNAorMDBBMjE1N0VBMjE1N0YxNTNGMTY5RjE1MUZBMkVEMEZERkEyRUQwN0ZGQTI4MUEyODFBMjJBM0E3OEI5M0I+STxFQzA3RjgKKzkxMzg3RkZGODA0OUI1MTJFMDQ5ODAwMTBGMTRGQzkwMzkxRkZDMEZGRTkwMzkzRkUwMDFGRjkwM0E3RjgwMDA3RjgwNDlDNworNkM3RTQ4NDg2RTdFNDg0ODZFN0U0OTE0MDcwMDA3ODI0ODQ4NkU3RTQ5MTQwMTAwMUY4MjQ5MTQwMEEyMDAzRjgyNDk4MTAwCis3RjE3ODBBMzkwQzkxMjNGQTI0ODE3QzBBQzZDNkNFRDdGODBBNTZDNkNFREZGMDBBMjZENUMwMDFGNUVBMjZDNkM0QTVBQTIKKzZDNkM0QTVBNkM2QzRBNUE2RDE0MUYwMDAxNUU2QzZDNEE1QUQ5N0ZDMEVCRkY4MDZENkM0ODkwQzdGQzkwMzkxRkZDMEZGRQorNkRCNTVBNkQ1QzAxMDExNEUwNkQ2QzEzODBEQTA3RjhDOEZDMzIzRTdCQkIzRD5JPEI2MTJDMDE1RjgxNUZGODIxNkUwOTAKK0M3N0ZFRDFGRjhFRDA3RkMxNTAzNkY3RTE1MDA4MjgyMTc4MEEyMTYzRkE0MTY3RkEyMTcwMDVFNUUxNTAxNEI1QTE1MDdFRAorMUZGOEVERkZGMDkwQjY1QTE2ODA5M0M3RkMxNUY4MTVDMDkwQ0FGQ0IzQTYyOTNBNzlCOTM1Pkk8QjY3RTE1RjgxNUZFNkYKKzdFODI5MEM3N0ZFRDFGRjA2RjdFRUQwM0ZDMTUwMTgyMTUwMDgyQTI4MkEzNUVBMjVFMTUwMTVFMTUwM0VEMEZGODRCNUFFRAorRkZFMDkwQjY1QTVFNEJDN0ZDMTVGODE1RTA5MDM4MDAwRkYwMTQwNzgxMTQwMzgxMTQwMTgxNkU3RTgxODIxNTNGODI2RjdFCitBMjZGN0VBMjZGN0UxNTAzODI2RjdFQTI2RjdFQTJFRTdGODBFRTNGQzBBMkVFMUZFMDJCM0E3OEI5MzY+ODIKK0Q8RUIwM0ZGMDExRjEzRjAwMTdGMTNGRTQ4QjYxMjgwNDgxNUMwNUE0ODQ4QzZGQ0Q4MUZGMEVCMUY4MDQ4NDgxMzA3MDE4MAorMTMwMzAwN0YxNDAwOTBDOUZDQTIxMkZFQTY3RTdFN0Y3RkVBM0ZGMDEzRkMzODFGRkZDMDZDMTNGQzZDRUJGRjgwNkMxNEUwCis2QzE0Rjg2QzgwMDEzRjdGMDEwNzdGRDkwMDdGMTM4MDAyMDcxM0MwMDIwMDEzRTAxNTdGRUQxRkYwMTUwRkEyRUQwN0Y4QTIKKzE1MDNBNkVEMDdGMDEyNDAxMjYwMDA3OEVDMEZFMDAwN0MxNDFGQjRFQzNGQzAwMUMwRUJGRjgwRUJGQzAzNkNCNjEyMDAwMAorMUY1QzZDMTRGODAwMDE1QzZDNkMxM0MwRDkwN0ZFQzdGQzI1M0U3Q0JCMkU+STwwMEZFREI3RkMwRUMwRkUwMDA3RjFBQzAKKzA0RkYxNTFGODNBMjZDNkMxOTgwREIwMUZCMTUzRjgzMTZGMzZDNkNGMDdGMDA5MjM4MDNGMUY4QTI2QzZDMTg3RURCMDdFMQorMTVGRTgzMTZFMDZDNkM2MERCMEZDMDE0MDE4MzE3N0U2QzZDNjBEQjFGODAxNDAzMTc3RjZDNkM2RjVDMTkwN0RCM0YwMDEzCis4MDE3MUY2QzZDNjAwMzdFMTUwRjE4QzAwMTdFMDMwRjVDMTM3RjRCMTUxRjE4RTA2RDAzMDc1QzE0ODA0QjE1M0YwMjgxMTUKK0YwMDExRjAzMDM5MUM3RkNBMkRBQzFGMDVERDkwRkMzOTEzODAxRjg3RUEyNUQxNEUzMDEwNzAzMDA1QjAyRTcxNUZDNURBMgorMDEwM0VFN0NGODAyRjcxNTdENUREOTAxRkZFRDNGRjBBMjkyQzhGQ0EyNkQ3MDVBQTI0QjNBN0ZCOTRFPjg3CitEPEQ4M0ZFMDE1RkY2RDRBNUEwMDFGMTUwMzZDNkM1RDZDNkM0QTVBMTYwRjZDNkM1RDZDNkM0QTVBNkMxNTNGNkU1QzZENkMKKzQ5NUE2RDZDNDlDN0ZDMDExRjVCMDJGMDVCNkQ2QzQ4NUEwMTA3MTMwNzAyRkM1QjZENkM0ODVBMDEwMTEzMUZEOTAwRkY1QgorRURCRkMwNkVCNDVBODA2RTkwQzhGQzVEMTQwRjZFNUE2RTVBNEE3RTRBN0U0QTdFQTI0QTdGOTEzODdGQkZDMDE1M0Y0QTZDCis3RTQ5NDg2QzdFNEE2QzdFMTMwMzQ5NDg2QzdFNDk0ODZDN0U4MjQ5NDg3RTQ5NDg2RDdFODM0OTQ4NkQ3RTQ5QzcxMjFGNDgKKzgyNDk2RTdFNDg0ODZFN0UxMjA3NDk2RTdFNDg0ODZFN0UwMDFGNkYxMzgwNUI0ODQ4RUQ3RkMwMDA3RkVFM0ZFMDQ4NDgxNgorRjAzNDNBN0ZCOTM3Pkk8RUIxRkYwRUJGRkZDMDAwMzEzRkYwMDBGMTQ4MDQ4MTRDMDkwMzhFMDFGRTA5MDM4MDAwRkYwMDAKKzFDMTMwNzAwMThFQjAzRjgxMjEwQzdGQ0VDMDFGQ0E3MTQzRkVCMEZGRjkwQjVGQzEyMDMxMjBGMzgxRkZFMDFFQTNGRTBFQQorN0Y4MDEzMDAxMkZFQTQxNDAzN0UzODdGODAwRkVCRTAzRjZDQjVGQzdFNkMxM0Y5NkMxM0UxRDgwMUZFQzdGQzFFMjg3REE2CisyOD45NyBEPDEyRkVCM0E0RUIwMUZDRUIwRkZGMDEzRjEzQzA5MEI1N0VCNjdFOTAzOEYwM0ZGOEVCQzAwNzQ5NkM3RUVCMDAKKzAxNDg2RDdFQTIxNTdGQTNFRDNGODBBQUVEN0YwMEEzNUQ1RDE0MDE2QzVDRUI4MDAzOTAzOEMwMEZGODkwMzhGMDNGRjA5MAorQjU1QTQ4NUM2RDVCRDkxRkZFQzdGQzM4MDAwN0Y4MjEzRDdBQkIyQj5JPEVCMDNGRTkwMzgxRkZGQzAwMTdGMTNFMDkwQjUKKzEyRjg0ODE0RkMzODAzRkMwMzM5MDdGODAwN0NEODBGRTAxMzM4NDg0ODEzMDgxNTAwNDg1QUEyNDhDOEZDQTMxMjdFMTJGRQorQTkxMjdGQTM2QzdFQTI2RDEzMDIwMDFGMTQwNjZDNkMxMzFFNkM2QzEzN0U5MDM4RkMwM0ZFNkNCNUZDQzYxNEZDNkQxM0YwCiswMTFGMTNDMDkwMzgwN0ZDMDAxRjI4N0RBNjI1Pkk8RUQzRjgwQjNBNEVCMEZFMEVCM0ZGQzkwQjVGQzQ4MTRCRjQ4MTRGRgorMzgwN0ZFMDczODBGRjgwMTM4MUZFMDAwNDkxMzdGMDAzRjE0M0Y1QjEyN0Y5MEM3RkNBMzEyRkVBQTEyN0ZBMzZDN0UxNTdGCis2QzdFNkQxM0ZGMzgwRkYwMDMzODA3RkUwNzZDQjUxMkJGNkMxNDNGNkMxM0ZFRUI3RkY4RDkwRkUwQzdGQzIxM0Q3REJCMkIKKz5JPEVCMDdGOEVCMUZGRTkwMzg3RkZGODA0OEI1MTJDMDQ4MTRFMDM5MDdGQzBGRjAzOTBGRjAwM0Y4RUJFMDAxMzkxRkMwCiswMEZDNDkxMzdDMDAzRjE0N0U5MEM3MTIzRTVBMTI3RTE1MUYxMkZFQjdGQ0E1MDBGQ0M4RkNBMjdFQTIxMjdFQTIxMjdGN0UKKzdGNkM3RTZEMTMwMjZDNkMxMzBFNkM2QzEzM0UzOTAzRkUwMUZFNkNCNUZDNkMxNEZDNkQxM0YwMDExRjEzQzA5MDM4MDNGRQorMDAyMDI4N0VBNjI1Pkk8MTRGRjAxMDMxM0MwMTMwRjVCNUJFQjdGODE5MDM4RkUwMDQwNDkxMzAwMTIwMTVCQTIxMjAzQUQKK0I1MTJGQ0E1RDgwM0Y4QzdGQ0IzQUUxQTNEN0ZCQzE5Pkk8OTAzOTA3RTAwMUY4OTAzODNGRkMxRjkwMzk3RkZFRkZGQzQ4CitCNkZDNUE5MDM5RjgxRkY4MDAzOTA3RjAwRkUwNDg0ODZDN0VFQkMwMDNBMjQ4NDg2QzdFQTc2QzZDNDg1QUEyRUJFMDA3NkMKKzZDNDg1QTZDNkM0ODVBNDhCNUZDNUQ0ODQ5QzdGQ0VCM0ZGQzM4MUYwN0UwOTBDOUZDQTM3RjdGNkNCNTEyQzAxNUY4MTVGRQorNkNFQ0ZGODAxNkMwNDgxNUUwNUEzQTNGODAwMDdGRjA0OEM3MTIwRjAwN0VFQzAzRjg0ODE0MDFBNDZDMTQwMzAwN0UxNUYwCitEODdGODAxMzBGNkM2Q0VCMUZFMDNBMUZGQzAxRkZDMDZDQjYxMjgwNkMxNTAwMDAwMTE0RkM2QzZDMTNGMDAxMDc5MEM3RkMKKzI2Mzg3RUE1MkE+STwxMkZFQjNBNEVCMDFGQzkwMzgwRkZGODA0OTEzQzAwMTdGMTNFMDkwQjUxMkYwMzlGRkY4MUZGOEVCCitFMDA3RUJDMDAzMDE4MDEzRkMxNDAxMTMwMEEzNUFCM0E3MUUzQzdBQkIyQj5JPDEyRkZBODEyMDBBQzEyN0ZCM0IzMDgzOQorN0JCODE0Pkk8RUIwRkYwQTg5MEM3RkNBQ0VCMDdGMEIzQjNBQTM4NDAwRkUwRUE2MDFGMzhGQzdGQzBCNUZDMTQ4MDZDMTMKKzAwRUExRkZFRUEwM0Y4MTQ0QTg1QjgxNj5JPDEyRkVCM0IzQjNBNjA3M0M3QUJCMTQ+MTA4CitEPEQ5MDFGQ0VCMDNGODNCRkUwRkZGODAxRkZGNDk2RDQ4MTM4MDAxN0Y2REI1MTJDMDkwQjUwMEYxMTRFMDNDRkZGODFGRkIKK0YwM0ZGMEQ5RTAwN0VCQzAwRjkwM0FDMDAzRkY4MDA3MDE4MDAyMDAxM0Y4NkUxNDAzMDEwMDVCQTM0ODVDQjNBNzM1MjY3QQorQTU0Mj5JPEVCMDFGQzM5RkUwRkZGODA0OTEzQzAwMTdGMTNFMDkwQjUxMkYwMzlGRkY4MUZGOEVCRTAwN0VCQzAwMzAxODAKKzEzRkMxNDAxMTMwMEEzNUFCM0E3MUUyNjdBQTUyQj5JPEVCMDNGRTkwMzgwRkZGODAwMTNGMTNFMDkwQjUxMkY4NDg4MDM5CiswM0ZFMDNGRTM5MDdGODAwRkY0ODQ4RUI3RjgwNDkxMzNGNDg0OEVCMUZDMDQ4NDhFQjBGRTBBMjkwQzcxMjA3NDgxNUYwQTIKKzAwN0UxNDAzMDBGRTE1RjhBOTAwN0ZFQzA3RjBBMzZDNkNFQjBGRTBBMjZDNkNFQjFGQzA2RDEzM0Y2QzZDRUI3RjgwNkM2QworRUJGRjAwMzkwM0ZFMDNGRTZDQjU1QTZDNUM2RDVCMDExRjEzQzBEOTAzRkVDN0ZDMjUyODdFQTYyQT5JPEVCMDFGQzM4RkUKKzBGRkYwMTNGMTNDMDkwQjU3RUI2N0U5MDM4RjAzRkY4RUJDMDBGOTAzODgwMDNGQzEzMDA0ODZEN0UxNDAwODE4MUEyMTY4MAorMTUzRkE5RUQ3RjAwQTM1RDVEMTQwMTZDNDk1QUVCODAwNzZENDg1QTkwMzhGMDNGRjA5MEI1NUE0ODVDNkQ1QkQ5MUZGRUM3CitGQ0VCMDdGODkwQzlGQ0FGMjEzNjdBQTUyQj5JPDkwMzkwN0YwM0Y4MEVCM0ZGQ0VCRkZGRTQ4RUJGRkJGNDgxNEZGMzgwNworRkUwNzM4MEZGODAxNDg0ODdFNUI0ODQ4MTM3RjVCMDA3RjE0M0Y5MEM3RkNBMzEyRkVBOTdFN0VBMjdGMTIzRjZEMTM3RjZDCis3RTE1RkYzODBGRjgwMTM4MDdGRTA3OTBCNkZDNkMxNDNGQzYxM0ZFRUI3RkY4RUIxRkUwOTBDN0ZDQUYyMTM2N0RBNTJCPgorSTwxNEYwRUFGQzA3MTMwRjEzM0YxMzdGMTNGRjAwRkQxMzAwMTNGQ0VBRkZGMDVCNUJBMjVCOTBDN0ZDQTM1QUIzQTQxNDI2Cis3QUE1MUM+STxFQjdGRTAzODAxRkZGQzAwMDdFQkZGODA0ODE0QzA1QTM4M0ZDMDNGOTAzODAwMDc4MDE0MDEwMDdFOTBDNworRkNBNDEyN0ZBMjZDN0UxM0YwRUJGRjgwNkMxM0YwNkMxM0ZDNkM3RjZDN0ZDNjE0ODAxMzFGMDEwMDEzQzAxNDNGRUMwRkUwCitBMjE0MDdBMzEyNDAxMjYwMDA3OEVCMEZDMDAwRkUxMzFGMzlGRkMwN0Y4MDkwQjVGQzZDMTQwMDAwMUY1QjAwMDMxM0Y4MzgKKzAwN0ZDMDFCMjg3RUE2MjA+STxFQTAxRkNBQUI2RkNBNUQ4MDFGQ0M3RkNCM0E3NkQxMzgwMTQwMTM5MDBGRjA3QzAxNEZGCitBMjZEMTMwMEVCM0ZGQ0VCMUZFMDFBMzA3RkFFMUU+STwwMEZFRUIwMUZDQjNBQTE0MDNBMjE0MDc2QzEzMUYzODdGODA3RgorOTBCNUZDNkMxM0Y5MTRGMTAwMEYxM0MxRDgwM0ZDQzdGQzFFMjY3QUE0MkI+STwwMEZFRDkwMUZFRUIwMUZDMDA3RjE3RjgKKzAyMDMxNDAzQTIwMTgwMTNERjAwM0ZFRTA3RjAxNDA3RUQ5RjgwRDgxRkMwMTZFMDAyMEYxNDBGMTU4RkQ4MEZFMDAyQzAxMworQzAwMzBGMTMxRjE0MUZFRDA3RTBEODA3RjAxNjgwMDIxRTE0M0YxNDNFMDAwM0RBMDNGMDEzMDAxM0Y4MDIzQzVDMDAwMTAxCis3QzE0N0VFRDAxRjgxM0ZDMDI3ODE0RkUwMDAwRDlGODAwNUJBMjRBMTNGQzAxN0M1RDE2N0QxMzdFNUMwMTNFRUMzREYwMDEKKzNGMTQzRjVDMDExRjVEMTYxRjM2MjU3RkE0Mzk+MTE5IEQ8RDg3RjgwRUIwRkUwMDAzRkVDMUZDMDZDNkMxMzNGNkRFQjdGCis4MDZDNkMxNDAwMDAwNzE0RkU2QzZDNDg1QTM4MDFGQzAzMDFGRTVCNkM2QzQ4NUE2RDQ4NUE5MDM4M0Y5RkMwRUIxRkRGNkQKK0I0NUE5MkM3RkM2RDVBNkQ1QTEzMDFBMjQ5N0UxMzA3NDk3RUVDREY4MDkwMzgxRjlGQzA5MDM4M0YwRkUwNDk2QzdFRUJGRQorMDMwMUZDN0YwMDAxNkQ3RTQ4NDg2QzdFNDg0ODEzN0YxMjBGNDlFQjNGODA0ODQ4RUIxRkMwNDg0ODE0RTAwMDdGRUMwRkYwCis0OEM3RUEwN0Y4MjUyNTgwQTQyNj5JPEI0RUMwRkUwNkNFQzFGQzBBMjZDN0VFRDNGODA3RjAwMUZFQzdGMDBBMjZDN0UxNQorRkU3RjAwMDc1QzE0MDFFQTAzRjg1REVCRkMwMzEyMDE1RDM4MDBGRTA3NUQxMzdFMTQwRjAxN0Y1QjEzM0ZBMjkwMzgxRjlGCis4MEEyOTJDN0ZDMTMwRkEyRUIwNzlFMTRERUEyRUIwM0ZDQTI2RDVBQTM1QzEzMDM1Q0EyMTMwNzVDMTMwRkEyNDk1QTEyMjAKK0Q4MzgzRkM4RkNFQTNGRkVBMjVCNUJFQTBGRTAyMzM2N0ZBNDI2PkkgRQorJUVuZERWSVBTQml0bWFwRm9udAorJURWSVBTQml0bWFwRm9udDogRmggZWNybTA4MDAgOCAyOQorL0ZoIDI5IDEyMiBkZjwxNEZGMDEwNzEzRTA5MDM4MUY4MEYwOTAzODNFMDAzODQ5MTM3QzQ5MTNGQzQ4NUExMjAzNDkxMzc4CisxNTMwOTJDN0ZDQTcxNTdDQjYxMkZDQTIzODAzRTAwMDE1N0NCM0E1NDg2QzEzRkUzQTdGRkYwRkZGRTBBMjIzMkY3RkFFMjcKKz4yOCBEPDEyM0MxMjdFMTJGRkE3MTI3RUE5MTIzQ0FBMTIxOEE0MTIwMEE3MTIzQzEyN0UxMkZGQTQxMjdFMTIzQzA4MkY3QQorQUUxND4zMyBEPDEyM0MxMjdFQjRGQ0EyMTM4MEEyMTI3RjEyM0QxMjAxQTMxMjAzMTMwMEEyNUExMjA2MTIwRTVBNUE1QTEyCis2MDA5MTU3QUFEMTQ+MzkgRDwxMjNDMTI3RUI0RkNBMjEzODBBMjEyN0YxMjNEMTIwMUEzMTIwMzEzMDBBMjVBMTIwNjEyMEUKKzVBNUE1QTEyNjAwOTE1N0E4NzE0PjQ0IEQ8NEE3RTRBN0VBMzRBN0VBMjRBN0VBM0VDMUJGODE0MTlBMkVDMzBGQ0EyRUM3MAorRkVFQzYwN0VBMjRBN0VBMzQ5NDg2QzdFQTIwMTAzODBFQzAwMEZBMjAxMDY2RDdFQTM0OTZEN0VBMjAxMUZCNTdFQTI5MDM4CisxODAwMDE0OTZEN0VBMzQ5MTQ3RUEyMDFFMDE0N0Y0OTgwQTIwMDAxRUQxRjgwMTIwMzAwMDcxNkMwRDgwRkYwRUMzRkUwRDgKK0ZGRkMwMTAzQjVGQ0EyMzAyRjdFQUUzNT42NSBEPEI1MTJGMEEyMzgwM0ZDMDA2QzVBQjNCM0EzNDg3RUI1MTJGMEEyMTQyRAorN0VBQzE5PjczIEQ8OTAzODNGODAzMDM5MDFGRkYwNzAzODA3QzA3QzM5MEYwMDBFRjAwMDFFMTMwNzQ4MTMwMzQ4MTMwMTE0CiswMDEyNzAwMEYwMTQ3MEEzMTUzMDdFQTI2QzE0MDAxMjdFMTI3RkVBM0ZFMDEzRkUzODFGRkZFMDZDMTNGQzZDMTNGRjAwMDEKKzE0ODBEODAwM0YxM0UwMTMwMzkwMzgwMDNGRjBFQzA3RjgxNDAxMTQwMDE1RkMxNTdDMTJDMDE1M0NBMzdFQTIxNTc4N0U2QworMTQ3MDZDMTRGMDZDRUIwMUUwMzlGNzgwMDNDMDM5RTNGMDBGMDAzOEUwN0ZGRTM4QzAwRkYwMUUyRjdDQUQyNz44MworRDwxM0ZGMDAwNzEzQzAzODBGMDFGMDM4MUMwMEY4MDAzRjEzN0M4MEEyMTQzRjAwMUU3RkM3RkNBNEVCMDdGRjEzN0YzODAxCitGRTFGRUEwN0YwRUExRkMwRUEzRjgwRUE3RjAwMTI3RTAwRkUxNDA2NUFBMzE0M0Y3RTAwN0UxMzdGMDA3RkVCRUY4QzM5MUYKKzgzQzdGQzM5MEZGRjAzRjgzOTAxRkMwMUUwMUYyMDdEOUUyMz45NyBEPEVBMDdDMDEyRkZBMjEyMEYxMjA3QUMxNEZFOTAzOAorQzdGRjgwOTAzOENGMDNFMDkwMzhEQzAxRjA5MDM4RjgwMDdDNDkxMzdFNDkxMzNFNDk3RjE2ODBBMjE1MEYxNkMwQTlFRDFGCis4MEEyMTYwMDVENkQxMzNFNkQ1QjAxQjA1QjkwMzhCQzAxRjA5MDM4MEUwN0UwMzkwNjA3RkY4MDI2MDAwMUZDQzdGQzIyMkYKKzdFQUQyNz5JPEVCMUZFMEVCN0ZGQzM4MDFGMDFFMzgwM0UwMDczOTA3QzAxRjgwRUEwRjgwRUExRjAwNUEwMDNFRUIwRjAwCiswMDdFOTBDN0ZDQTIxMjdDMTJGQ0E5MTI3RUEyMTVDMDdFNkMxMzAxMDE4MDEzODAzODBGQzAwMzM5MDdFMDA3MDAzODAxRjAKKzNFMzgwMDdGRjhFQjFGQzAxQTIwN0U5RTFGPkk8MTVGODE0MUZBMjE0MDExNDAwQUNFQjBGRTBFQjdGRjgzODAxRjgxRTM4CiswM0UwMDczODA3QzAwMzM4MEY4MDAxRUExRjAwNDgxMzAwMTIzRTEyN0VBMjVBQTkxMjdDMTI3RUEyMDAzRTEzMDE3RUVCODAKKzAzMDAwRjEzMDczOTAzRTAwRUZDM0EwMUYwM0NGRkMwMzgwMDdGRjA5MDM5MUZDMEY4MDAyMjJGN0VBRDI3Pkk8RUIxRjgwCitFQkZGRjAzODAzRTA3ODM4MDdDMDNFMzgwRjgwMUUzODFGMDAxRkVDMEY4MDEyM0UwMDdFMTMwNzE1QzAxMjdDMTJGQ0EzQjYKK0ZDQTIwMEZDQzhGQ0E1MTI3RUEyMDAzRTE0QzAxMjNGNkMxMzAxMzkwRjgwMDM4MDAxQzAxMzAwMzgwM0UwMEYzODAxRjAzQworMzgwMDdGRjhFQjFGQzAxQTIwN0U5RTFGPkk8MDEzRjEzRjg5MDM4RkZDM0ZFMzkwM0UxRkYxRTM4MDc4MDdDMDAwRjE0MEMKKzM5MUYwMDNFMDBBMjAwM0U3RkE3NkMxMzNFQTI2QzZDNUEwMDA3MTM3ODM4MEZFMUYwMzgwQ0ZGQzBEODFDM0ZDN0ZDOTBDOAorRkNBMzEyMUUxMjFGMzgwRkZGRjgxNEZGNkMxNEMwNDgxNEYwMzkxRTAwMDdGODQ4MTMwMDQ4MTQ3QzEyRjg0ODE0M0NBNDZDCisxNDdDMDA3QzE0Rjg2Q0VCMDFGMDZDRUIwM0UwMzkwN0UwMUY4MDM5MDFGRkZFMDAzODAwM0ZGMDFGMkQ3RTlEMjM+MTAzCitEPEVBMDdDMDEyRkZBMjEyMEYxMjA3QUMxNEZFOTAzOEMzRkY4MDkwMzhDNzAzRTA5MDM4REUwMUYwMTNGODQ5NkM3RUEyNUIKK0EyNUJCMjQ4NkM0ODdFM0FGRkZFMUZGRkMwQTIyMjJFN0VBRDI3Pkk8RUEwNzgwRUEwRkMwRUExRkUwQTRFQTBGQzBFQTA3Cis4MEM3RkNBOEVBMDdDMDEyRkZBMjEyMEYxMjA3QjNBNUVBMEZFMEVBRkZGQ0EyMEUyRTdFQUQxND5JPDEzMEZFQjFGODBFQgorM0ZDMEE0RUIxRjgwRUIwRjAwOTBDN0ZDQThFQjA3QzAxM0ZGQTIxMzBGMTMwN0IzQUQxMjMwMTI3ODM4RkMwRjgwQTIxNDAwCis0ODVBRUE3ODNFRUEzRkY4RUEwN0UwMTIzQzgzQUQxNj5JPEVBMDdDMDEyRkZBMjEyMEYxMjA3QURFQzFGRkVBMkVDMEZGMAorRUMwN0MwNUQwMjBFQzdGQzVDNUM1QzVDRUJDM0MwMTNDN0VCQ0ZFMEVCREZGMDEzRjlFQkYwRjg0OTdFRUJDMDdFMTQzRTgwCis4MTZFN0UxNDA3NkU3RTgxNkU3RTQ4NkM0ODdFM0FGRkZFMDdGRjgwQTIyMTJFN0VBRDI1Pkk8RUEwN0MwMTJGRkEyMTIwRgorMTIwN0IzQjNBM0VBMEZFMEVBRkZGRUEyMEYyRTdFQUQxND5JPDI2MDdDMDdGRUIwN0YwM0JGRkMzRkZDMDNGRkM5MDNBQzcKKzgzRjA3ODNGM0MwRkNFMDFGOEUwMUY4MDNCMDdEQzAwRjlDMDBGMDFGOEQ5RkY4MDEzQzA0OTkwMzg3RjAwMDc0OTEzN0VBMgorNDkxMzdDQjI0ODZDMDFGRUVCMEZFMDNDRkZGRTBGRkZFMEZGRkVBMjM3MUU3RTlEM0M+STwzODA3QzBGRTM5RkZDM0ZGODAKKzkwMzhDNzAzRTAzOTBGREUwMUYwRUEwN0Y4NDk2QzdFQTI1QkEyNUJCMjQ4NkM0ODdFM0FGRkZFMUZGRkMwQTIyMjFFN0U5RAorMjc+STxFQjFGRTBFQjdGRjgzODAxRjAzRTM4MDNDMDBGMzkwNzgwMDc4MDM5MEYwMDAzQzA0ODE0RTAwMDNFRUIwMUYwQTIKKzQ4RUIwMEY4QTMwMEZDMTRGQ0E5MDA3QzE0RjhBMjZDRUIwMUYwQTI2Q0VCMDNFMEEyMzkwRjgwMDdDMDM5MDdDMDBGODAzOQorMDFGMDNFMDAzODAwN0ZGOEVCMUZFMDFFMjA3RTlFMjM+STw5MDM4MEZFMDE4OTAzODdGRjgzODM4MDFGODFDMzkwM0UwMEUKKzc4MzgwN0MwMDczOTBGODAwM0Y4MDAxRjEzMDFFQTNGMDBBMjAwN0UxMzAwQTIxMkZFNUFBODEyN0VBMzZDMTMwMTdFRUI4MAorMDMzODBGQzAwNzM4MDNFMDBFMzgwMUYwM0MzODAwN0ZGMEVCMUZDMDkwQzdGQ0E5NEE3RTkxMzgxRkZGQzBBMjIyMkI3RTlECisyNT4xMTMgRDwzODA3ODFGMDM4RkY4N0ZDRUI5RTdFRUEwRjk4RUEwN0I4MTNCMEVCRjAzQ0VCRTAwMEEzNUJCMTQ4N0VCNQorRkNBMjE3MUU3RTlEMUI+STwzODAxRkUxODM4MDdGRkI4MzgxRTAxRjhFQTNDMDA0ODEzNzg0ODEzMzhBMjE0MThBMjdFN0UKK0I0MTMwMEVBN0ZGMDZDQjRGQzZDMTNDMDZDMTNGMDAwMDExM0Y4MzgwMDFGRkMxMzAxMzhDMDAwN0UxNDNFQTI2QzEzMUVBMgorN0VBMjZDMTMzQ0EyNkMxMzc4MzhGRjAxRjAzOEUzRkZDMDAwQzAxMzAwMTcyMDdFOUUxQz5JPDEzNjBBNDEzRTBBMzEyMDEKKzEyMDNBMjEyMDcxMjFGQjUxMkYwQTIzODAzRTAwMEFGMTQxOEE3MTQzODM4MDFGMDMwMTQ3MDM4MDBGODYwRUIzRkUwRUIwRgorODAxNTJBN0ZBODFCPkk8RDgwN0MwMTNGODAwRkYxMzFGQTIwMDBGMTMwMTAwMDcxMzAwQjIxNDAxQTMxNDAzMzgwM0UwMDcKK0VDMEVGQzNBMDFGODFDRkZDMDM4MDA3RkY4OTAzOTFGRTBGODAwMjIxRjdFOUQyNz5JPDNBRkZGQzAxRkZDMEEyM0EwRkUwCiswMDdFMDAwMDA3MTQ3QzE1MzgwMDAzMTQzMDE1NzA2QzZDMTM2MEEyNkM2QzVCQTM5MDM4N0MwMTgwQTI2RDQ4QzdGQ0EyRUIKKzNGMDdFQjFGMDZBMkVCMEY4Q0EyMTREQ0VCMDdEOEEyRUIwM0YwQTM2RDVBQTI2RDVBMjIxRTdGOUMyNT5JPDNCRkZGQzNGCitGRTA3RkZBMjNCMEZFMDAzRjAwMUY4MDFDMDkwMzhFMDAwRjAwMDA3MDEwMTE0RTA4MTI2MDNFMDAzMTRDMEEyOTEzODA3RjgKKzAxMjcwMUYwMDY3ODEzODBBMjkwMzlGODBFN0MwMzAwMDBEOTBDM0MxMzAwQTI5MDM5N0MxODFFMDZBMjE1MUY2RDQ4NkM1QQorQTIxNjhDOTAzOTFGNjAwNzk4QTIxNkQ4OTAzOTBGQzAwM0YwQTM2RDQ4NkM1QUEzNkRDNzVBMzAxRTdGOUMzMz5JPDNBRkYKK0ZDMDFGRkMwQTIzQTBGRTAwMDdFMDAwMDA3MTQ3QzE1MzgwMDAzMTQzMDZEMTM3MDAwMDExNDYwQTI2QzZDNUJBMkVCRkMwMQorMDE3QzVCRUI3RTAzMDEzRTkwQzdGQ0EyRUIxRjA2QTIxNDhFRUIwRjhDQTJFQjA3RDhBMkVCMDNGMEEzNkQ1QUEyNkQ1QUEyCis0OTVBQTIxMzAzOTFDOEZDMTI3OEVBRkMwNkEyNUIxMzFDRUE3ODM4RUE3MDcwRUEzRkUwRUEwRjgwMjIyQjdGOUMyNT4KKzEyMSBEIEUKKyVFbmREVklQU0JpdG1hcEZvbnQKKyVEVklQU0JpdG1hcEZvbnQ6IEZpIGVjcm0wNjAwIDYgNQorL0ZpIDUgNTQgZGY8MTNFMDEyMDExMjA3MTJGRjEyRjkxMjAxQjNBNzQ4N0VCNTEyQzBBMjEyMjE3QUEwMUU+NDkKK0Q8RUEwMUZDMzgwN0ZGODAzODFDMEZDMDM4MzAwM0UwMzg2MDAxRjBFQjAwRjgxMkY4NkMxM0ZDQTIxNDdDMTI3ODAwMzAxMworRkNDN0ZDMTRGOEEyRUIwMUYwRUIwM0UwMTRDMEVCMDc4MEVCMEYwMDEzMUUxMzM4NUI1QjM4MDFDMDBDRUEwMzgwMzgwNjAwCisxODVBNUEzODNGRkZGODVBQjUxMkYwQTIxNjIxN0NBMDFFPkk8MTNGRjAwMDMxM0MwMzgwRjAzRTAzODFDMDBGMDE0RjgwMAorM0UxM0ZDMTQ3Q0EyMDAxRTEzRkMxMjBDQzcxMkY4QTJFQjAxRjBFQjAzRTBFQjBGQzAzODAxRkYwMEEyMzgwMDAzRTBFQjAwCitGMDE0NzgxNDdDMTQzRTE0M0YxMjMwMTI3ODEyRkNBMjE0M0U0ODEzN0UwMDYwMTM3QzAwMzgxM0Y4MzgxRTAzRjAzODBGRkYKK0MwMDAwMTEzMDAxODIyN0RBMDFFPkk8MTRFMDEzMDFBMjEzMDMxMzA3QTIxMzBEMTMxRDEzMzkxMzMxMTM2MTEzRTExM0MxCitFQTAxODExMjAzRUEwNzAxMTIwNjEyMEMxMjFDMTIxODEyMzAxMjcwMTJFMEI2RkNBMjM4MDAwMUUwQTZFQjAzRjBFQjNGRkYKK0EyMTgyMjdEQTExRT5JPDAwMTAxMzMwMzgxRTAxRjAzODFGRkZFMDE0QzAxNDgwRUJGRTAwRUExQkYwMDAxOEM3RkNBNTEzCitGRTM4MUJGRjgwMzgxRjAzQzAzODFDMDFFMDM4MTgwMEYwMTRGOEM3MTI3OEEyMTQ3Q0EyMTIzMDEyNzgxMkY4QTIxNDc4NDgKKzEzRjgwMDYwMTNGMDM4NzAwMUUwMTIzODM4MUUwNzgwMzgwN0ZGMDBFQTAxRjgxNjIyN0NBMDFFPkkKK0UKKyVFbmREVklQU0JpdG1hcEZvbnQKKyVEVklQU0JpdG1hcEZvbnQ6IEZqIGVjdHQwOTAwIDkgMjYKKy9GaiAyNiAxMjIgZGY8MDA3RkI1MTI4MEI2MTJDMEEzNkMxNDgwMUEwNTdBOTIyNz40NSBEPDEyMUVFQTdGODBBMkVBRkZDMAorQTRFQTdGODBBMkVBMUUwMDBBMEE3Mjg5Mjc+STwxNTM4MTU3Q0EyMTVGQzE1RjgxNDAxMTVGMDE0MDMxNUUwMTQwNzE1QzAKK0EyMTQwRjE1ODAxNDFGMTUwMDVDMTQzRTE0N0UxNDdDMTRGQzVDMTMwMTVDMTMwMzVDMTMwNzVDMTMwRjVDQTIxMzFGOTFDNworRkM1QjEzM0UxMzdFMTM3QzEzRkM1QjEyMDE1QjEyMDM1QjEyMDc1QjEyMEY1QkEyMTIxRjkwQzhGQzVBMTIzRTEyN0UxMjdDCisxMkZDNUFBMjEyNzAxRTNBN0NCMzI3Pkk8RUIzRkUwMzgwMUZGRjg0ODEzRkUwMDBGRUJGRjgwNDgxNEMwMzkzRkUwN0ZFMAorRUI4MDBGMzk3RjAwMDdGMDAwN0VFQjAzRjgwMEZFMTMwMTVBNkMxNEZDMTQwMEEzMTI3Q0M4RkNBMjE0MDExNUY4QTIxNDAzCisxNUYwMTQwN0VDMEZFMEVDMUZDMDE0M0ZFQzdGODBFQ0ZGMDA0OTVBNDk1QTQ5NUE0OTVBNDk1QTQ5NUE0OTVBMDFGRUM3RkMKKzQ4NUFEODA3RjgxMzc4NDg0ODEzRkM0ODVBNDg1QTQ4QjVGQ0I2RkNBMzZDMTRGODFFMkY3Q0FFMjc+NTAKK0Q8RUIxRkY4RUJGRkZFMDAwM0VCRkY4MDAwMEYxNEMwMTVFMDM5MUZGMDFGRjAzOTNGQzAwN0Y4RUI4MDAxMTVGQzE0MDBBMgorNkNDN0ZDMTIwNEM4RkMxNDAxMTVGODE0MDNFQzA3RjAxNDBGRUMzRkUwOTAzODFGRkZDMDQ5MTM4MEEyMTVFMDZEMTNGMDkwCiszODAwMUZGOEVDMDNGQzE0MDFFQzAwRkUxNTdFMTU3RjE1M0ZBMjEyMzgxMjdDMTJGRUEyMTU3RjQ4MTQ3RTZDMTRGRTAwN0YKK0VCMDFGQ0VCODAwMzM5M0ZGMDFGRjg2Q0I1MTJGMDZDMTRFMDAwMDMxNDgwQzZFQkZFMDBFQjFGRjgyMDMwN0RBRTI3Pkk8CiswMDdGQjUxMkUwQjYxMkYwQTM2QzE0RTAzOTAwMUY4MDAwQjNCMjAwN0ZCNTEyRTBCNjEyRjBBMzZDMTRFMDFDMkU3QkFEMjcKKz43MyBEPDM4N0ZGRkMwODBCNUZDN0U1Q0Q4MDNGMEM4RkNCM0FBRUQwNzgwRUQwRkMwQTcwMDdGQjZGQ0EyQjdGQzdFMTY4MAorMjIyRTdGQUQyNz43NiBEPDEyNzAxMkY4QTI3RTEyN0MxMjdFMTIzRTEyM0Y3RTdGMTIwRkEyN0YxMjA3N0YxMjAzN0YxMjAxCis3RjEyMDA3RjEzN0MxMzdFMTMzRTEzM0Y3RjgwMTMwRkEyODAxMzA3ODAxMzAzODAxMzAxODAxMzAwODAxNDdDMTQ3RTE0M0UKKzE0M0Y4MDE1ODAxNDBGMTVDMDE0MDdBMjE1RTAxNDAzMTVGMDE0MDExNUY4MTQwMDE1RkMxNTdDQTIxNTM4MUUzQTdDQjMyNworPjkyIEQ8MDA3RkI1MTJGOEI2MTJGQ0E0NkMxNEY4MUUwNjdDN0UyNz45NSBEPDM4MDFGRkUwMDAwNzEzRjg0ODEzRkU0ODZECis3RTgxRUJDMDdGRUMwRkUwMzgwRjgwMDdEODAyMDA3RkM3MTIwM0EyRUIwN0ZGMTM3RjAwMDNCNUZDMTIwRjVBMzgzRkZDMDMKK0VBN0ZFMDEzMDAxMkZFNUFBNDZDMTMwNzAwN0YxMzBGRUJDMDdGNkNCNjEyQzA2QzE1RTA3RTAwMDMxM0Y4M0EwMDdGQzAzRgorQzAyMzIwN0Q5RjI3Pjk3IEQ8RUE3RkUwNDg3RUEzMTI3RjEyMDNBOUVDN0Y4MDkwMzhGMUZGRTAwMUY3MTNGODkwQjU3RTgxCitFQ0MwRkY5MTM4MDA3RjgwMDFGQ0VCMUZDMDQ5MTMwRjE2RTA0OTEzMDdBMjE2RjAxNTAzQTYxNTA3NkQxNEUwQTIxNTBGNkQKK0VCMUZDMDZEMTMzRjZERUI3RjgwOTEzOEMxRkYwMEVDRkZGRTVEMDFGNzVCMDFGMzEzRTAyNjAxRTA3RkM3RkMyNDJFODBBRAorMjc+STxFQjBGRkYwMTdGMTNDMDQ4QjUxMkUwNDgxNEYwNUEzODBGRjgwN0VBMUZFMDM5M0ZDMDAzRTA5MDM4ODAwMDgwNDgKK0M4RkMxMjdFQTIxMkZFNUFBNjdFMTI3RUEyMDA3RjE0RjAzOTNGODAwMUY4MTNDMDM4MUZFMDAzMzkwRkY4MEZGMDZDQjVGQworNkMxNEUwNkMxNEMwNkM2QzEzMDBFQjBGRjgxRDIwN0I5RjI3Pkk8RUMxRkY4NEE3RUEzMTQxRjE0MDBBOUVCMEZGMEVCN0YKK0ZDNDhCNUZDNUE1QTM4MEZGODFGMzgxRkUwMDczODNGQzAwM0VCODAwMUVBN0YwMDAwN0UxMzAwQTIxMkZFNUFBNjdFMDA3RQorMTMwMUEyMDA3RjEzMDM3RUVCODAwNzM4MUZFMDBGMzgwRkYwM0Y2Q0I2MTJFMDZDMTVGMDZDNUIzODAwN0ZGODkwMzkxRkUwCis3RkUwMjQyRTdFQUQyNz5JPEVCMEZGOEVCM0ZGRTkwQjUxMjgwMDAwMzE0QzA0ODE0RTAzOTBGRkMwRkYwMzkxRkUwMDNGOAorRUJDMDAxRDgzRjgwMTNGQzQ4QzdGQzEyN0UxNTdFMTJGRUI2MTJGRUE0MTVGQzAwRkNDOEZDN0UxMjdFMTI3RjZDMTQzQzZECisxMzdFNkM3RTAxRjAxM0ZFMzkwRkZDMDdGQzZDQjVGQzAwMDExNEY4NkMxNEYwMDEzRjEzQzA5MDM4MDdGRTAwMUYyMDdEOUYKKzI3Pkk8RUE3RkUwNDg3RUEzMTI3RjEyMDNBOUVDM0ZDMDkwMzhGMUZGRjAwMUY3N0Y5MEI1N0U4MTE0RTBFQzAwN0Y0OTdGCis1QjVCQTI1QkIwM0E3RkZGODNGRkY4QjUwMEM3MTNGQ0EzNkMwMTgzMTNGODI2MkU4MEFEMjc+MTA0CitEPDEzMEY0OTdFNDk3RUE0NkQ1QTZEQzdGQzkwQzhGQ0E3MzgzRkZGODA0ODdGQTM3RUVBMDAwRkIzQTQwMDdGQjUxMkYwQjYKK0ZDMTVGODE1RjA3RTFEMkY3QkFFMjc+STwzODdGRkY4MEI1N0VBMzdFRUEwMDBGQjNCMjAwN0ZCNTEyRjhCNjEyRkNBMzZDCisxNEY4MUUyRTdDQUQyNz4xMDggRDwzOTdGRTAzRkMwMzlGRkYxRkZGMDAxRjc3RjkwQjU3RTZDODAwMDAzMTNFMEVDMDA3RgorNDk3RjVCNUJBMjVCQjAzQTdGRkY4M0ZGRjhCNTAwQzcxM0ZDQTM2QzAxODMxM0Y4MjYyMDgwOUYyNz4xMTAKK0Q8RUIxRkUwRUI3RkY4MzgwMUZGRkU0ODdGNDgxNDgwMzkwRkYwM0ZDMDM5MUZDMDBGRTAzOTNGODAwN0YwRUIwMDAzNDgxNAorRjgwMDdFMTMwMUEyNDhFQjAwRkNBNzZDMTMwMTAwN0UxNEY4QTIwMDdGMTMwMzM5M0Y4MDA3RjBBMjM5MUZFMDFGRTAzOTBGCitGMDNGQzA2Q0I1MTI4MDZDMTQwMDZDNUIzODAwN0ZGOEVCMUZFMDFFMjA3QzlGMjc+STwzOTdGRTA3RjgwMzlGRkYxRkZFMAorMDFGNzEzRjg5MEI1N0U2QzgwMDAwM0VCQzBGRjkxMzgwMDdGODAwMUZDRUIxRkMwNDkxMzBGMTZFMDQ5MTMwN0EyMTZGMDE1CiswM0E2MTUwNzZEMTRFMEEyMTUwRjZERUIxRkMwNkQxMzNGNkRFQjdGODA5MTM4QzFGRjAwRUNGRkZFNUQwMUY3NUIwMUYzMTMKK0UwRDlGMDdGQzdGQzkxQzhGQ0FDMzg3RkZGODBCNTdFQTM2QzVCMjQzMTgwOUYyNz5JPDM5N0ZGQzAzRkMzOUZGRkUwRkZGCiswMjNGMTM4MDRBMTNDMDAwN0Y5MEI1RkMzOTAwN0ZGRTFGMTRGODkxMzhGMDBGODA5MTM4RTAwMjAwNEFDN0ZDNUNBMjkxQzgKK0ZDQTIxMzdFQUQwMDdGQjU3RUI2N0VBMzZDNUMyMjIwN0U5RjI3PjExNCBEPDkwMzhGRkYzODAwMDA3RUJGRkMwMTIxRjVBCis1QUVCODAzRjM4RkMwMDBGNUFBMkVDMDc4MDZDOTBDN0ZDRUE3RjgwMTNGQzM4M0ZGRkYwNkMxM0ZDMDAwNzEzRkYwMDAxMTQKKzgwRDgwMDBGMTNDMDkwMzgwMDNGRTAxNDA3MDA3OEVCMDNGMDAwRkMxMzAxQTI3RTE0MDM2Q0VCMDdFMEVCRTAxRjkwQjUxMgorQzAxNTgwMTUwMDAwRkIxM0ZDMzg3MDdGRjAxQzIwN0I5RjI3Pkk8MTMzQzEzN0VBODAwN0ZCNTEyRjBCNjEyRjhBMzZDMTQKK0YwRDgwMDdFQzdGQ0FFMTUxODE1N0VBNDE1RkU2RDEzRkMxNDgzRUNGRkY4NkQxM0YwNkQxM0UwMDEwMzEzQzAwMTAwMTMwMAorMUYyOTdFQTgyNz5JPDM5N0ZFMDA3RkU0ODZDNDg3RUEzMDA3RjdGMDAwM0VCMDAzRkIyNURBMjRBNUFFQkZDMDc2Q0I2MTIKK0Y4NkMxNUZDQTIwMTNGMTNCRjkwMzkwRkZDMUZGODI2MjA4MDlGMjc+STwzOTNGRkMxRkZGNDg2QzVBMTY4MDE2MDA2QzQ4Cis3RTM5MDFGODA3RTA2QzZDNDg1QTRBNUEwMTdFOTBDN0ZDNkQ1QUVCMUY3RTVDNkQ1QTEzMDc2RDVBNUM4MDQ5N0UxMzBGNDkKKzdFMTQzRUVCM0UzRkVCN0UxRjkwMzg3QzBGODAwMUY4N0YwMDAxNkQ3RTM4MDNGMDAzM0E3RkZFMUZGRjgwQTJCNTQ4MTNDMAorNkM0ODZDMTM4MEEyMjIyMDdFOUYyNz4xMjAgRDwzQTdGRkMwRkZGODA0ODZDNDgxM0MwQTM2QzQ4NkMxMzgwM0EwN0UwMDAKK0Y4MDAwMDAzMTMwMTVEMTNGMDAwMDExMzAzMDFGODVCMTIwMEEyNkQ0ODVBMTM3Q0EyOTAzODdFMEY4MDEzM0VBMjAxMUY5MAorQzdGQzVDQTIxMzBGMTQ5RTE0QkUxMzA3MTRGQzEzMDNBMjVDMTMwMUEyNUNBMjEzMDM1Q0EyMTMwNzVDMTIwOEVBM0UwRjAwCis3RjVCMTMxRkQ4N0U3RkM4RkNFQTdGRkU2QzVBNUI2QzVBRUEwN0MwMjIzMTdFOUYyNz5JCitFCislRW5kRFZJUFNCaXRtYXBGb250CislRFZJUFNCaXRtYXBGb250OiBGayBlY3NzMTIwMCAxMiA0MQorL0ZrIDQxIDEyMiBkZjxCRjEyODBBNjYxMDY4MDlENjI+MjIgRDwwMjdGRUIzRkMwOTAzODAxRkZDMDVCMTMwRkEyNUJFQjNGCitDMUVDODA0MDQ5QzlGQ0EyMTNGRUEzMTIwMUIxQjYzOEMwM0ZDMEE2RDgwMUZFQzdGQ0IzQjNBMjJBNEE3RUM5MzQ+MjgKK0Q8QjYxMkMwQTYxQTA2N0Y5ODIxPjQ1IEQ8MTJGRkE4MDgwODc3ODcxQj5JPDE0MTgxNDc4MTRGODEzMDMxMzBGMTM3RkI1CitGQ0E0MTNGNzEzODdFQTAwMDdCM0IzQUQwMDdGQjYxMjgwQTYyMTQzNzhDMjMxPjQ5IEQ8RUIwM0ZFOTAzODFGRkZFMDAxN0YKKzEzRjg5MEI1N0U0ODE0RkY0ODE1ODAyNjA3RkMwNzEzQzAzODBGRjAwMEQ4MUZDMEVCM0ZFMDQ5RUIxRkYwMDAzRjE0MEY5MAorQzcxM0Y4NDgxNDA3MDA3RUVDMDNGQ0EyMTJGRTQ4RUMwMUZFMTI3QzEyM0MxMjM4MTIxODEyMDhDOEZDQTRFRDAzRkNBM0VECiswN0Y4QTJFRDBGRjAxNkUwMTUxRkVEM0ZDMDE2ODBFRDdGMDA1RDRBNUE0QTVBNEE1QTRBNUE0QTVBNEE1QTRBQzdGQzE0RkUKKzQ5NUE0OTVBNDk1QTQ5NUE0OTVBNUM0OUM4RkMxMzdFNUI0ODVBNDg1QTQ4NUE0ODVBNDg1QTQ4QzlGQzQ4QjYxMkZFQTYyNworNDM3Q0MyMzE+STw0OUI0RkMwMTBGMTNFMDAxM0YxM0Y4OTBCNTEyRkU0ODgwMDAwNzE1ODA0ODAxMDExM0MwM0ExRkY4MDAKKzdGRTBEODNGRTAxMzFGNDkxNEYwNDhDNzEyMEYxMjNFRUQwN0Y4MTIxQzEyMTgxMjA4QzhGQ0EzRUQwRkYwQTNFRDFGRTBBMgorRUQzRkMwMTU3RkVERkY4MDAyMDMxMzAwRUMxRkZFOTAzODBGRkZGQzVEMTVFMDgxMTVGQzE1RkZEOTAwMDExMzgwOTEzODAwCis3RkMwRUQxRkUwRUQwRkYwMTZGOEVEMDdGQ0EyRUQwM0ZFQTNFRDAxRkZBODAwNDBFQzAzRkUxMjYwQTIwMEYwRUMwN0ZDN0UKKzAwRkVFQzBGRjgxMjdGRDgzRkMwRUIxRkYwRDgxRkYwRUI3RkUwMzkwRkZFMDFGRjZDQjYxMjgwNkMxNTAwNkM1QzZDNkMxMworRjgwMTFGMTNFMDAxMDE5MEM3RkMyODQ1N0NDMjMxPkk8RURGRjgwNUM1Q0EyRUMwNzdGQTIxNDBGQTIxNDFFMTQzRUEyMTQKKzdFMTQ3QzE0RkNBMkVCMDFGODEzMDMxNEYwMTMwN0EyRUIwRkUwQTJFQjFGQzAxMzNGMTQ4MDEzN0YxNDAwNUI1QjEyMDE1QgorMTIwMzQ4NUFBMjQ4NUE1QjEyMUY1QjEyM0Y0ODVBQTI0OEM3RkM5MEI3MTJDMEE2QzgzODdGODAwMEIxMkE0MTdEQzAzMT4KK0k8RURGRjgwNEE3RkEzNEE3RkEzOTEzODA3RjdGMEEyMTVFNzAyMEY3RjE1RTNBMjkxMzgxRkMzRkMxNUMxMDIzRjdGMTU4MQorQTI5MTM4N0Y4MEZGNURBMjRBNkQ3RTVDQTIwMTAxNkU3RTVDQTIwMTAzNkU3RTVDQTIwMTA3NkU3RTVDQTIwMTBGNkU3RTVDCiswMTFGODExNjAzNUMwMTNGODExNjAxNUMwMTdGODE4MjkxQjdGQzkwQjg3RUEzNDg4M0EyMDFGQ0M4MTIzRjAwMDM3MDdFQTIKKzQ4NDg4MjE3MEY1QjAwMEY4MzE3MDc1QjAwMUY4MzE3MDM1QjAwM0Y4MzE3MDE1QjAwN0Y3MDdFQTI5MENBRkM0OEVGN0Y4MAorQTIzOTQ1N0RDNDQwPjY1IEQ8QjYxMkY4RURGRjgwMTZFMDE2RjgxNkZFODI5MEM3MDAzRjEzQzAwMzA3N0YwMzAwN0YxNjNGCis3MDdFMTYwRjcwN0UxNjAzODMxNjAxQTUxNjAzNUYxNjA3NUYxNjBGNEM1QUVFN0ZFMDRDNUEwMzA3NUIwMzNGOTBDN0ZDOTAKK0I2MTJGQzE2RjAxNkMwODIxNkZDMTZGRjkwQzcwMDNGMTNDMDAzMDM3RjkyMzgwMDdGRjBFRTFGRjg3MDdFNzA3RTcwN0U4MgorNzAxMzgwMTc3RjE4QzBBMjE3M0ZBNDE3N0ZBMjE4ODAxN0ZGNUU0QzEzMDA0QzVBMTYwRkVFM0ZGQ0VFRkZGODAzMEY1QjkwCitCNzVBMTc4MDk0QzdGQzE2RkMxNkUwNEJDOEZDMzI0NTc3QzQ0MT5JPEVEM0ZGRTAyMDNCNTEyRjAwMjBGMTRGRTAyM0ZFQworRkY4MDkxQjdGQzVCNDlEOUUwMDcxMzAwMDEwRjkwQzdGQ0Q5MUZGQzE0MUY0OTQ4MTQwN0Q5N0ZFMDgwNEE5MUM3RkM0OTVBCis0ODkwQ0FGQzVBNUI0ODVBQTI0ODVBQTI0ODVBQTI0ODVBQTM0ODVBQTU0ODVBQUQ2QzdFQTU2QzdFQTM2QzdFQTI2QzdFQTIKKzZDN0VBMjZDN0U3RjdFNkM2RDE1ODA2RDZDMTQwMTZFMTQwM0Q5M0ZGODE0MEY2RDZDRUMxRkMwNkRCNDE0N0YwMTAzOTAzOAorRTAwM0ZGNkQ5MEI2MTI4MDZERURGRTAwMDIzRjVDMDIwRjE0RjAwMjAzMTRDMDkxMjYwMDNGRkNDN0ZDMzI0OTdBQzYzRT4KK0k8QjgxMkUwQTY5MENBRkNCM0E2OTBCN0ZDQTY5MENBRkNCM0E4OTBCNzEyRjBBNzJDNDU3N0M0M0E+NjkKK0Q8RUQzRkZDNEFCNTEyRTAwMjBGMTRGODAyM0YxNEZGOTFCNzEyQzA0OTE2RTA0OUVCRTAwNzQ5OTBDNzEyN0ZEOTFGRkNFQworMUZDMDQ5NDgxNDA3NEExNDAzRDk3RkMwMTQwMTQ5NDgxNDAwNDgxNzAwNDg5MENBRkM1QjQ4NUFBMjQ4NUFBMjQ4NUFBMjQ4Cis1QUEzNDg1QUE1NDg1QUFBNEJCNTEyRjBBMzZDN0VBMzkyQzcxMjBGQTI2QzdFQTM2QzdFQTI2QzdFQTI2QzdFQTI2QzdFN0YKKzZDN0Y3RTZEN0VFQjNGRjA4MDZEN0VEOTA3RkYxNDNGNkQ5MDM4RTAwN0ZGNkQ5MEI2RkM2RDE2RTAwMjNGMTUwMDAyMEYxNAorRkMwMjAxMTRFMDkxMjYwMDNGRkNDN0ZDMzQ0OTdBQzY0MT43MSBEPEI0RkNCM0IzQjNBOTkwQjYxMkZFQTYyNzQ1NzdDNDM1Cis+NzYgRDxEOEZGRTA5MzM4MDNGRkMwNkQ1RUEzNkQ1RUEzMDE3Q0VFMUZCRkEyMDE3RTE2M0ZBMjAxM0UxNzNGMDEzRjE2N0YKK0EyNkQxNjdFNkUxNUZFQTI2RTE0MDEwMTBGMTZGQ0EyNkUxNDAzMDEwNzE2RjhBMjZFMTQwNzAxMDMxNkYwQTI2RTE0MEYwMQorMDExNkUwNkUxNDFGQTIwMTAwMTZDMDZFMTQzRkEyMDI3RTE1ODAwMjdGMTQ3RkEyNkUxNTAwNkY1QjAyMUY1Q0VEQzAwMUEyCiswMjBGNUNFREUwMDNBMjAyMDc1Q0VERjAwN0EyMDIwMzVDRURGODBGMDIwMTVDQTJFREZDMUYwMjAwNUNBMkVERkUzRjAzN0UKKzVCQTJFRDdGN0YwMzNGOTBDN0ZDQTJFRDFGRkVBMzZGNUFBMzZGNUE5MkM5RkNBMjQyNDU3N0M0NTU+STxFRDNGRTA5MTM4CiswM0ZGRkUwMjFGRUJGRkMwNEE4MDkxQjYxMkY4MDEwMzE1RkU0OTkwMzhDMDFGRkY0OUQ5MDAwNzdGRDkxRkZDMDEwMTdGRDkKKzNGRjA2RDZDN0U0OTQ4NkU3RTQ5NDg2RTdFNEExNDBGNDg5MEM4NkM3RTQ4NDg2RjdFNDkxNTAxMDAwNzgzNDg0ODZGMTM4MAorQTI0OTE2N0YwMDFGMThDMDQ5MTYzRjAwM0YxOEUwQTI0OTE2MUYwMDdGMThGMEE0NDkxNjBGMDBGRjE4RjhBQzZEMTYxRjAwCis3RjE4RjBBNDZEMTYzRjAwM0YxOEUwQTM2QzZDRUU3RkMwQTI2RDE2RkYwMDBGMTg4MDZENUQwMDA3MTgwMDZENUQ2QzZDNEIKKzVBNkM1RjZFMTQwRjZDNkQ0QTVBNkQ2QzRBNUFEOTNGRjhFQ0ZGRTA2RDZDNDk1QjZEQjQwMTA3NUI2REQ5RTAzRjkwQzdGQworNkQ5MEI1NUEwMTAwMTVGODZFNUMwMjFGMTRDMDAyMDM0OUM4RkM5MTM4MDA3RkYwM0Q0OTdCQzY0OD43OQorRDxFQzNGRjgwMTAzQjU3RTAxMEYxNEUwMDEzRjE0Rjg0OTE0RkU5MEI3RkM0OEVCQzAwRjM5MDNGRTAwMDFEODA3RjhFQjAwCis3RTQ4NDgxNDNFNDkxNDFFNDg0ODE0MDYxMjNGNDk5MUM3RkNBMjQ4Q0FGQ0E2N0ZBMjdGMTIzRjdGN0ZFQTFGRkM2Q0I0RkMKKzE0RTA2QzEzRkM2Q0VCRkZDMDZDMTRGQzZDMTRGRjZEMTRDMDZEODAwMTBGMTRGODAxMDM4MEQ5MDAzRjdGMTQwMzkxMzgwMAorN0ZGRjAzMDcxMzgwMDMwMTEzQzA4MTE2N0ZFRTNGRTAxNjFGQTJFRTBGRjBBMjE2MDdBN0VFMEZFMDEyNjAxMjcwMDA3OEVECisxRkMwMDA3QzE1M0YwMDdFMTY4MEI0NkNFQ0ZGMDAwMUUwNUIwMUZDRUIwN0ZFM0E3RkZGODAxRkZDMDAxRjkwQjU1QTAwMDcKKzVEMDAwMTE1QzA2QzZDNUMwMTBGMDFGQ0M3RkMwMTAwMTNFMDJDNDk3Q0M2MzY+ODMgRDxCNEVEMDFGRUIzQjNBRjZDNkNFQworMDNGQ0E0NkM2Q0VDMDdGOEEyNkM2Q0VDMEZGMEEyNkM2Q0VDMUZFMDZEMTQzRjZDNkNFQzdGQzA2QzZDRUNGRjgwMjcwMUZGCis4MDAzMTMwMDZDOTAzOEYwMUZGRTZEQjU1QTZENUMwMTBGMTRFMDZENUMwMTAxOTFDN0ZDOTAzODAwMUZGMDJGNDc3N0M0NDIKKz44NSBEPEI0NkM5MTI2MDFGRkMwRUQ3RjgwMDA3RkYzRkYwMEEyNUU2QzZDNzA1RDFCMDFBMkVFMDdGNzZDNkM3MDVEMDVFNworMTUwMzE2MEY2REVERTNGODAwMEY1MDVBQTJFRTFGQzM2QzZDNzA1RDA1QzExNTBGQTJFRTNGODE2QzZDNzA1RDA1ODAxNTFGCitBMkVFN0YwMDZDNkM3MDRBNUE4NDVFNkM2QzRBNkU1QzFCN0YxODNGMTUwMUQ5N0Y4MDQ5NkU5MUM3RkMwNjFGNUNBMjRCNUEKK0Q5M0ZDMDcwNUIwNjBGMTMwMUEyMDExRjQ5NDg1RTAyRTAxNkYwMDYwNzEzMDNBMjAxMEY0OTQ4NUUwMkYwMTZGODA2MDMxMworMDdBMjAxMDc0OTQ4NUUwMkY4RUQwMUZDMUEwRjAxMDM0QTVFMTUzRkYwMDBGRTAyRkMxNzFGMDEwMTkxQzg1Q0EyNEIxNTdFCiswMkZFMTY3RjAxMDAwMTdFNEM1QTE5M0ZBMkRBN0U3Qzk0QzhGQzAzRkMxNkJGMTkxRjAyN0YxN0ZGNkU0ODVFQTIxOTBGQTIKKzZFNDg1RTE5MDc1OTQ1N0ZDNDVDPjg3IEQ8RUIwN0ZFOTAzODdGRkZDMDAwMDNCNTdFMDAwRjE0Rjg0ODgwODE5MDM4RjgwMworRkZFQjgwMDEwMDFFQzcxMzgwMDAxODE0N0YwMDEwRUMzRkMwQzhGQzE2RTAxNTFGQThFQzdGRkYwMTBGQjVGQzEzM0Y0OEI2CitGQzVBMDAwRkVCRTAxRjM4MUZGRTAwRUEzRkYwRUE3RkMwNUI0OEM3RkM1QUE0MTUzRjdFNkM2QzEzN0Y5MDM4QzAwMUZGRUIKK0YwMEY2Q0I2RkM3RTE1REY2QzE0MUYwMDAzMTNGOEM2MDE4MEM3RkMyMzJGN0NBRDJGPjk3CitEPEI0RkNCM0FBRUMzRkMwOTAzODAzRkZGMDAxMEY3RjAxM0YxM0ZFNDk3RjkwQjZGQ0Q5RkUwNzEzODBEOUYwMDAxM0MwNDkKKzEzN0Y0OUVCMUZFMDQ5MTRGMDkwQzcxMjBGMTUwNzE2RjgxNTAzQTMxNkZDMTUwMUFBRUQwM0Y4QTMxNTA3MTZGMDE1MEZBMgorNkRFQjFGRTA2RDEzM0Y2REVCN0ZDMDkwMzlGMDAxRkY4MEVCRkMwNzkwQjYxMjAwNkQ1QjZENUI2RDEzRjAwMTA3MTNDMEM3Cis5MEM3RkMyNjRBNzlDODMyPkk8RUNGRkMwMDEwNzEzRkMwMTFGMTNGRjQ5MTRDMDkwQjYxMkUwNUE0OEVCMDAzRjAxRkNFQgorMDdDMDQ4NDgxMzAxNDg0ODEzMDA0ODQ4MTQwMDVCMTIzRjVCQTI0OEM5RkNBNDEyRkVBQTEyN0ZBMzdGMTIzRkEyNkM2QzE0CisyMDZEMTQ2MDZDNkNFQjAxRTA2RDEzMDM2QzZDMTMwRjZDQjQxMzdGNkM5MEI1RkM2QzE1QzA2RDE0MDAwMTFGNUIwMTA3MTMKK0YwMDEwMDEzODAyMzJGN0NBRDJCPkk8RUQwM0ZDQjNBQUVCMDdGODkwMzgxRkZGODMwMTdGMTNFMzkwQjUxMkYzNDgxNEZGCis1QTQ4MTM4MDM5MEZGRTAwM0YwMUY4MTMwRjQ4NDgxMzA3NUI0ODQ4MTMwM0EyNDg1QUEyOTBDN0ZDQTI1QTVBQUE3RTdFQTMKKzdGMTIzRjZEMTMwNzZDN0UxNTBGRDgwRkY4MTMxRjZEMTM3RjM5MDdGRjgxRkY2QzkwQjVGQzZDMTRGQjZDMTRFMzZEMTNDMworMDExRjEzMDNEOTA3RjhDN0ZDMjY0QTdDQzgzMj5JPEVCMDFGRTkwMzgwN0ZGQzAwMTFGMTNGMDAxN0Y3RjkwQjU3RTQ4ODAKKzQ4RUIwM0ZGMzkwN0ZDMDA3RjQ4NDhFQjNGODA0OTEzMUY0ODQ4RUIwRkMwNUI0ODQ4RUIwN0UwQTI0OEM3MTIwM0EyMTI3RQorRUQwMUYwQjdGQ0E2MDBGQ0M5RkNBMjdFQTMxMjdFQTIxMjdGN0U3RkEyNkM3RTZEMTQxMDZDNkMxNDcwNkM2Q0VCMDFGMEQ4CiswM0ZFMTMwNzkwMzhGRjgwM0Y2QzkwQjVGQzZDMTVFMDAxM0YxNDgwNkRFQkZFMDAwMTA3MTNGODAxMDAxM0MwMjQyRjdEQUQKKzJCPkk8RUMxRkYwRUM3RkZFRUIwMUZGNUI1QjVCOTAzODFGRjAxRTkwMzgzRkMwMDJFQzgwMDA0OUM3RkNBMjEzRkVBMzEyCiswMUIwQjYxMjgwQTZEODAxRkVDN0ZDQjNCM0EyMUY0QTdFQzkxRT5JPEQ5MDNGQ0VCMEZFMEQ5MEZGRjEzRkYwMTNGMTNDNworNDk5MEI1MTJGMDkwQjdGQzVBMjYwM0ZFMDdFQjgwMDAyNzA3RjgwMUZFQzdGQ0VCRjAwMDQ4NDgxMzdGNDk3RkEyNDg0ODZECis3RUE4NkM2QzQ5QzdGQ0EyNkQ1QjZDNkMxM0ZFRUJGODAxMzkwM0ZFMDdGQzQ4QjU1QTVENDg1QzAxQkY1QkQ4MUY4RjkwQzgKK0ZDRUI4M0ZDOTBDQUZDN0ZBMzdGN0Y5MEI1MTJGODZDRUNGRjgwMTZFMDZDMTVGODZDODE0ODgxMDAxRjgxQTIyNzNGQzAwMAorMEYxMzgwNDg0ODEzMDA5MEM4MTI3RjQ4RUQzRkMwNDgxNTFGQTUwMDdGRUQzRjgwNkQxNDdGNkM2Q0VDRkYwMDAxRjgxMzA3Cis2Q0I0RUIzRkZFNkM5MEI1NUE2QzVEMDAwMTE1RTA2QzZDMTQ4MDAxMUY0OUM3RkMwMTAxMTNFMDJDNDI3REFDMzE+STxCNAorRkNCM0FBRUM3RkMwOTAzODAxRkZGODAxMDc3RjAxMUY3RjQ5N0Y0OTE0ODBFQkZFMDNEOUY4MDAxM0MwNDkxMzdGNDkxMzNGCis0OTE0RTAxNTFGNUJBMzkwQzdGQ0IzQUMyMzQ5NzlDODMyPkk8RUFGRjgwQTlDN0ZDQjBFQTdGODBCM0IzQTgwOTQ1N0FDNAorMTc+STxCNEZDQjNBQkVEN0ZFMEVERkZDMDRBMTM4MDRBMTMwMDRBNUE0QTVBNEE1QTVENEE1QTRBNUE0QTVBNDk5MEM3RkMKKzQ5NUExMzA3NDk1QTQ5NUE0OTVBMTM3RjEzRkY4MDgwQTJFQkZERkVFQkY5RkYxM0YwNDk2QzdFMDFDMDdGMTQzRjAxODA3RgorNDk2QzdFMTQwRjgxMTQwNzZFN0U4MTE0MDE2RTdFMTY4MDE1N0ZFRDNGQzAxNkUwMTUxRkVEMEZGMDE2RjgyNTQ5NzlDODJGCis+MTA3IEQ8MTJGRkIzQjNCM0IzMDg0OTc5QzgxNz5JPERBN0ZDMEVCMEZGODI3RkYwMUZGRjhFQjNGRkYwMTA3NkQ5MEI1MTIKKzgwMDExRkQ5RkUwMzE0QzA0OTZENDgxNEUwNDkwMjhGMTRGMEQ5RkUwMzkwMzg5RkMwN0ZEOUY4MDA5MDM5RkYwMDFGRjg0OQorNkQ0ODEzMEY0OTZENDgxMzA3NDk0QTE0RkMwMzFGMTQwMzQ5NUNBMzkwQzc1QkIzQUMzRTJENzlBQzREPkk8RUM3RkMwMzkKK0ZGMDFGRkY4MDEwNzdGMDExRjdGNDk3RjQ5MTQ4MEVCRkUwM0Q5RjgwMDEzQzA0OTEzN0Y0OTEzM0Y0OTE0RTAxNTFGNUJBMworOTBDN0ZDQjNBQzIzMkQ3OUFDMzI+STxFQzdGODA5MDM4MDNGRkYwMDEwRjEzRkMwMTNGMTNGRjQ5ODA5MEI2N0U0ODkwMzgKKzgwN0ZFMDNBMDNGRTAwMUZGMEQ4MDdGOEVCMDdGODQ4NDg2RDdFNDkxMzAxNDg0ODZEN0VBMjQ4NDgxNDdGQTI0OEM4RUEzRgorODBBMzAwN0UxNTFGMDBGRTE2QzBBOTZDMTUzRjZDMTY4MEEzNkQxNDdGMDAzRjE2MDA2RDVDMDAxRjVENkQxMzAxNkM2QzQ5Cis1QTZDNkM0OTVBMDFGRTEzMUYzQTAzRkY4MDdGRjA2QzkwQjU1QTZDNUQwMTNGOTFDN0ZDNkQ1QjAxMDMxM0YwOTAzODAwN0YKKzgwMkEyRjdEQUQzMT5JPEVDM0ZDMDM5RkYwM0ZGRjAwMTBGN0YwMTNGMTNGRTQ5N0Y5MEI2RkNEOUZFMDcxMzgwRDlGMDAwCisxM0MwNDkxMzdGNDlFQjNGRTA0OUVCMUZGMDkwQzcxMjBGQTJFRDA3RjhBMjE1MDNBMjE2RkMxNTAxQUFFRDAzRjhBMzE1MDcKKzE2RjAxNTBGMTUxRjZEMTRFMDZEMTMzRjZERUJGRkMwNkQ0ODEzODBFQkZDMEY5MEI2MTIwMDZENUI2RDVCNkQxM0YwMDEwNworMTNDMDAxMDA5MEM3RkM5MUM4RkNCMjI2NDA3OUFDMzI+STwxNDFGMDBGRTEzRkYxMzAzNUIxMzFGNUI1QkVCRkZGMDE0ODAKKzM4RkZGRTAwNUI1QjVCNUI1QkEyNUJBMzkwQzdGQ0IzQTgxODJENzlBQzIxPjExNCBEPEVCM0ZGODQ4QjVGQzQ4MTRDMDAwCiswRjE0RjA0ODE0Rjg1QUVCRTAwRjM5N0Y4MDAxRjA5MEM3MTI3MDAwRkUxNDMwMTUwMEE1N0U3RkVBN0ZFMDEzRkMzODNGRkYKK0UwNkMxM0ZDMTRGRjAwMDcxNDgwNkMxNEUwNkMxNEYwNkM3RTAxMDcxM0Y4OTAzODAwM0ZGQzE0MDcxNDAzRUMwMUZFQTIxNAorMDBBNDEyNDAwMDcwRUIwMUZDMTI3ODAwN0UxMzAzMzlGRkUwMUZGODkwQjUxMkYwQTI2QzE0RTAwMDFGMTQ4MDAwMDNFQkZFCiswMDM4MDAzRkYwMUYyRjdEQUQyNT5JPEVBMDFGRUFEQjYxMkYwQTZEODAxRkVDN0ZDQjNBQjdGMTUwODE1Mzg2Q0VCODFGOAorRUNGRkZDN0ZBMjZEMTNGMDZEMTM4MDkwMzgwRkY4MDAxRTNBN0VCODIzPkk8QjRFQzFGRTBCM0FFMTUzRkEyMTU3RkEyNkQKKzEzRkYxNDAzMzg3RkUwMEY5MEI2RkM2QzE0REYxNTFGNkMxM0ZDMDAwNzEzRjAwMDAxOTBDOEZDMjMyRDc5QUIzMj5JPEI0Cis2Q0Q5MUZFMEVCMDFGRTAwN0Y2RkVCMDNGQ0EyMTUzRjZDNkM2RUVCMDdGODE1M0QxNTdENkM2QzE3RjBEQjdDRkMxMzBGQTIKKzE1RkM2QzZDNkVFQjFGRTAxNUY4MTQwMUQ4MDdGODAyN0UxNEMwMDQ3RjEzM0YxNUYwMTQwM0Q4MDNGQzZFMTQ4MEVGODA3RgorMTVFMDAwMDEwMTA3MTYwMDAxRkUxNDFGNzE1QTE1QzAwMDAwMDEwRjVEMDFGRjE0MEYxN0UxMDE3RjAxODA1Q0EyMDIxRjEzCiswN0Q5M0Y5RkVDRjNGODE1MDAxNjAzQTJEOTFGOUU1RDE0QkUxNjAxMDEwRjVFMDJGQzE0RkY4MkEyNkQ0ODVEQTIzRjJDN0YKK0FCNDI+MTE5IEQ8RDg3RkMwRUM3RkMwNkM2Q0VDRkY4MDAwMUYxNjAwNkQ1QjZDNkM0OTVBNkM2QzQ5NUE2QzZDNUMwMDAxCis0QTVBNkM2QzEzMUY2RTQ4NUFEOTdGQzA1QjZENkM0ODVBMDExRjQ5QzdGQ0VCMEZGMTkwMzgwN0ZCRkVFQ0ZGRkM2RDVCNkQKKzVCN0Y2RTVBNUQ2RTVBNEE3RTRBN0U4MTQ5N0Y5MDM4MDNGQkZDRUIwN0Y5OTAzODBGRjBGRTRBN0UwMTFGNkQ3RTQ5NDg2QworN0U0OTQ4NkM3RUVCRkYwMDZGN0U0ODQ4NkQ3RTQ4NDg4MDAwMDc2RTdFNDg0ODEzMDE0OTZEN0U0ODQ4MTU4MDAwM0ZFRDdGCitDMDQ4NDhFQzNGRTA0ODQ4RUMxRkYwMkMyQzgwQUIyRD5JPEI0MTVGRkEyN0YwMDdGRUMwMUZFN0YxMjNGRUQwM0ZDN0YwMAorMUZFQzA3Rjg3RjEyMEZFRDBGRjA3RjEyMDc2REVCMUZFMDEyMDMxNkMwNkM2QzEzM0ZBMjE2ODA2QzZDMTM3RkEyNkQxNDAwCis2RTVBNUQxMzNGMTRDMTAxMUY1QkEyRUNFMUY4RUIwRkUzQTIwMTA3NUIxNEYzQTI5MDM4MDNGN0UwQTIwMTAxNUJBMkVCMDAKK0ZGNURBMjE0N0Y5MkM3RkNBMjE0N0UxNEZFQTI1QzEzMDFBMjVDMTMwMzVDMTMwNzVDRUE0MDBGMzg3ODFGQzBFQTdGRkY1QworOTFDOEZDNUI1QkVBMEZGMDI4NDA3RUFCMkQ+SSBFCislRW5kRFZJUFNCaXRtYXBGb250CislRFZJUFNCaXRtYXBGb250OiBGbCBlY3JtMDcwMCA3IDUKKy9GbCA1IDU0IGRmPDEzMzgxMzc4RUEwMUY4MTIxRjEyRkUxMkUwMTIwMEIzQUI0ODdFQjUxMkY4QTIxNTI2N0JBNTIxPjQ5CitEPDEzRkYwMDAzMTNFMDM4MEUwM0YwMzgxODAwRjg0ODEzN0M0ODEzN0UwMDc4N0YxMkZDNkNFQjFGODBBNDEyN0NDN0ZDMTUKKzAwNUMxNDNFMTQ3RTE0N0M1QzQ5NUE0OTVBNUM0OTVBMDEwRUM3RkM1QjVCOTAzODcwMDE4MDEzRTBFQTAxODAzOTAzMDAwMworMDAxMjA2NUEwMDFGQjVGQzVBNDg1QkI1RkNBMjE5MjY3REE1MjE+STwxM0ZGMDAwMzEzRTAzODBGMDFGODM4MUMwMDdDMDAKKzMwMTM3RTAwM0MxMzNFMDA3RTEzM0ZBNDEyM0NDNzEyM0UxNDdFMTQ3QzVDNDk1QUVCMDdFMDM4MDFGRjgwOTFDN0ZDMzgwMAorMDFFMDZEN0UxNDdDODAxNDNGODAxNTgwQTIxMjM4MTI3QzEyRkVBMjE1MDA0ODVCMDA3ODEzM0UwMDcwNUI2QzVCMzgxRjAxCitGMDM4MDdGRkMwQzY5MEM3RkMxOTI3N0RBNTIxPkk8MTQzOEEyMTQ3ODE0RjgxMzAxQTIxMzAzMTMwNzEzMDYxMzBDMTMxQworMTMxODEzMzAxMzcwMTM2MDEzQzAxMjAxMTM4MEVBMDMwMDVBMTIwRTEyMEMxMjFDNUExMjMwNUExMkUwQjYxMkUwQTJDN0VBCitGODAwQTc0OTdFOTAzODNGRkZFMEEyMUIyNzdFQTYyMT5JPDAwMTgxMzBDMDAxRjEzN0NFQkZGRjg1QzVDMTQ4MEQ4MTlGQworQzdGQzAwMThDOEZDQTcxMzdGMzgxOUZGRTAzODFGODFGMDM4MUUwMDc4MDAxQzdGMDAxODEzM0VDN0ZDODBBMjE1ODBBMjEyCiszMDEyN0MxMkZDQTMxNTAwMTJGMDAwNjAxMzNFMTI3MDAwMzA1QjAwMUM1QjM4MEYwM0UwMzgwM0ZGQzBDNjQ4QzdGQzE5MjcKKzdEQTUyMT5JIEUKKyVFbmREVklQU0JpdG1hcEZvbnQKKyVEVklQU0JpdG1hcEZvbnQ6IEZtIGVjdHQxMDAwIDEwIDY4CisvRm0gNjggMTIzIGRmPDE0MzgxNEZDMTMwMTEzMDNFQjA3RjhFQjBGRjBFQjFGQzBFQjNGODBFQjdGMDAxM0ZFNDg1QTQ4NUEKKzVCMTIwNzVCMTIwRjVCNDg1QUEyMTIzRjkwQzdGQ0EyNUExMjdFQTMxMkZFNUFBQzdFMTI3RUEzMTI3RjdFQTI3RjEyMUZBMgorNkM3RTdGMTIwNzdGMTIwMzdGNkM3RTZDN0UxMzdGRUIzRjgwRUIxRkMwRUIwRkYwRUIwN0Y4RUIwM0ZDMTMwMTEzMDAxNDM4CisxNjQyNzJCOTJDPjQwIEQ8MTI3MDEyRkM3RTdFNkM3RTZDN0VFQTBGRTA2QzdFNkM3RTZDN0U2QzdFMTM3RjdGMTQ4MDEzMUYKKzE0QzAxMzBGRUIwN0UwQTIxNEYwMTMwM0EyMTRGODEzMDFBMzE0RkMxMzAwQUMxMzAxMTRGOEEzMTMwMzE0RjBBMjEzMDcxNAorRTBBMkVCMEZDMDEzMUYxNDgwMTMzRjE0MDA1QjEzRkU0ODVBNDg1QTQ4NUE0ODVBRUEzRkMwNDg1QTQ4QzdGQzVBNUExMjcwCisxNjQyNzlCOTJDPkk8RUIwMzgwNDk3RUE2MDAyMDE0MDgwMEY4MTQzRTAwRkUxNEZFMDBGRjEzQzFFQkM3QzdFQkU3Q0YwMAorM0ZCNTEyRjgwMDBGMTRFMDAwMDMxNDgwNkMxNDAwMzgwMDdGRkNBMjQ4QjVGQzQ4MTQ4MDAwMEYxNEUwMDAzRjE0RjgzOUZGCitFN0NGRkVFQkM3QzdFQjA3QzEwMEZFMTNDMDAwRjgxNDNFMDAyMDE0MDgwMDAwMTQwMEE2NkQ1QTFGMjQ3QUFBMkM+STxFQQorMEY4MEVBMUZFMEVBM0ZGMEVBN0ZGOEEyMTNGQ0EzMTIzRjEyMUYxMjBGMTIwMDEzRjhBMjEyMDFFQTAzRjAxMjA3RUExRkUwCitFQTdGQzBFQUZGODAxMzAwMTJGQzEyNzAwRTE3NzE4QTJDPjQ0IEQ8MDA3RkI1MTJGMEI2MTJGOEEzNkMxNEYwMUQwNTc5OTQKKzJDPkk8MTIxRkVBM0Y4MEVBN0ZDMEVBRkZFMEE1RUE3RkMwRUEzRjgwRUExRjAwMEIwQjcwOEEyQz5JPDE1MDdFRDBGODBBMgorMTUxRjE2MDA1RDE1M0UxNTdFMTU3Q0EyMTVGQzVEMTQwMTVEMTQwMzVEMTQwNzVEMTQwRjVEMTQxRjkyQzdGQzVDMTQzRUEyCisxNDdFMTQ3QzE0RkM1QzEzMDE1QzEzMDM1QzEzMDc1QzEzMEY1QzEzMUY5MUM4RkM1QjEzM0VBMjEzN0UxMzdDMTNGQzVCMTIKKzAxNUIxMjAzNUIxMjA3NUIxMjBGNUIxMjFGOTBDOUZDQTI1QTEyM0UxMjdFMTI3QzEyRkM1QUEyMTI3MDIxNDE3QkI5MkM+CitJPEVCMDNGOEVCMEZGRTkwMzgzRkZGODA0OTdGOTBCNTdFMzkwMUZFMEZGMDM5MDNGODAzRjg0ODQ4NkM3RUVCRTAwMDQ4NDgKKzEzN0VBMjQ4NDg3RkEyNDhDN0VBMUY4MEEyMDAzRTE0MEYwMDdFMTVDMEEzMDA3QzE0MDcwMEZDMTVFMEFDNkMxNDBGMDA3RQorMTVDMEE0NkNFQzFGODBBMzZDNkNFQjNGMDBBMjZDNkMxMzdFNkQxM0ZFMDAwNzVDRUJGMDAxNkM2QzQ4NUEzOTAxRkUwRkYwCis2Q0I1NUE2RDVCNkQ1QkQ5MEZGRUM3RkNFQjAzRjgyMzM1N0NCMzJDPkk8MTMwNzQ5N0VBMjEzMUZBMjEzM0YxMzdGMTNGRgorNUExMjA3MTI3RkI1RkMxM0RGMTM5RkVBN0MxRjEyMDBCM0FFMDA3RkI1MTJFMEI2MTJGMEEzNkMxNEUwMUMzNDc3QjMyQz4KK0k8RUIwRkY4OTAzODdGRkY4MDQ4QjUxMkUwMDAwNzgwNDgxNEZDMzkxRkY4MEZGRTM5M0ZFMDAxRkY5MDM4ODAwMDdGNDhDNworRUEzRjgwMDA3RTE0MUYwMEZFMTVDMDE1MEY2QzE1RTAxNTA3QTMxMjdFMTIzQ0M4RkNBMjE1MEYxNkMwMTUxRjE2ODAxNTNGCisxNjAwNUQxNUZFNEE1QTE0MDM0QTVBNEE1QTRBNUE0QTVBRUNGRjgwNDk0OEM3RkM0OTVBNDk1QTQ5NUFFQjNGRTBFQjdGODAKKzQ5QzhGQzQ4NUE0ODQ4RUIwM0MwNDg0OEVCMDdFMEVBMUZFMDQ4NUE0OEI2RkNCN0ZDQTM2QzE1QzAyMzM0N0NCMzJDPkk8CitFQjBGRkM5MDM4N0ZGRjgwNDhCNTEyRTAwMDA3MTRGODQ4ODAzOTFGRjgwN0ZFRUJDMDAwNDg0ODEzN0Y2RDdGMTY4MDE1MUYKK0EyNkM1QTZDQzdGQ0M4RkMxNTNGMTYwMDVEMTVGRTE0MDE0QTVBRUMxRkY4OTAzODFGRkZGMDQ5NUJBMjE1Rjg2RDdGOTAzOAorMDAwN0ZFRUMwMEZGODFFRDNGODBFRDFGQzAxNTBGQTIxNkUwMTUwN0EyMTIzQzEyN0VCNEZDMTUwRjE2QzBBMjQ4MTQxRjAwCis3RkVDM0Y4MDZERUI3RjAwNkM2QzVCMzkxRkY4MDdGRTZDQjU1QTZDNUM2QzE0RTBDNjZDMTM4MEQ5MEZGQ0M3RkMyMzM1N0MKK0IzMkM+STxFQzA3RjA0QTdFMTQxRjE0M0ZBMjE0N0VBMjE0RkNFQjAxRjhBMkVCMDNGMEVCMDdFMEEyRUIwRkMwRUIxRjgwCitBMkVCM0YwMDEzN0VBMjVCNDg1QUEyNDg1QTVCMTIwNzQ4NUFBMjQ4NUE0OEM3RkNBMjEyN0U1QUI3MTJGQzE2RkVBMzZDMTUKK0ZDQzhFQUY4MDBBQTkxMzg3RkZGRjA5MUI1MTJGOEEzNkUxM0YwMjczNDdFQjMyQz5JPDAwMEZCNTEyRkU0ODgwQTM1RDAxCis4MEM4RkNBREVCODNGRTkwMzg5RkZGODA5MEI1MTJFMDE1Rjg4MTkwMzhGRTAzRkU5MDM4RjAwMEZGMDFDMDdGNDlFQjNGODAKKzkwQzcxMjFGNkMxNUMwQzgxMjBGQTJFRDA3RTBBNDEyM0MxMjdFQjRGQzE1MEYxNkMwQTI0ODE0MUYwMDdFRUMzRjgwMDA3RgorRUM3RjAwNkM2QzVCNkQ0ODVBMzkxRkY4MEZGQzZDQjU1QTZDNUMwMDAxMTRDMDZDNkM5MEM3RkNFQjBGRjgyMzM0N0NCMjJDCis+STxFQzNGQzA5MDM4MDFGRkY4MDEwNzdGMDExRjdGNDk3RjkwMzg3RkUwN0Y5MDM5RkYwMDNGODA0ODQ4MTM3RkVBMDNGOAorNDg1QTVCMDAwRkVDM0YwMDQ4NDgxMzFFNDk5MEM3RkMxMjNGOTBDOUZDQTI1QTEyN0VFQjAzRkU5MDM4MUZGRjgwRDhGQzdGCisxM0UwMDBGREI1N0VCNjdFOTAzOEZFMDdGQzkwMzhGMDAxRkU5MDM4QzAwMDdGNDlFQjNGODA5MEM3MTIxRjE2QzA0ODE0MEYKKzE2RTAxNTA3QTMxMjdFQTQ3RTE1MEY2RDE0QzAwMDFGMTQxRjZEMTQ4MDAwMEYxNDNGNkRFQjdGMDAzOTA3RjgwMUZFMzkwMworRkUwN0ZDNkNCNTVBNkM1QzZENUIwMTFGMTM4MEQ5MDdGQ0M3RkMyMzM1N0NCMzJDPkk8MTI3OEI3MTJDMDE2RTBBMzE2QzAKKzAwRkNDN0VBM0Y4MEVEN0YwMDE1RkUwMDc4NUNDNzEyMDE0QTVBNEE1QTVEMTQwRjVENEE1QTE0M0Y5MkM3RkM1QzE0N0UxNAorRkU1QzEzMDE1Q0EyNDk1QUEyMTMwNzVDQTM0OTVBQTQ0OTVBQTUxMzNGOTFDOEZDQUExMzFFMjMzNTdDQjMyQz5JPEVCMDcKK0ZDRUIzRkZGOTBCNTEyQzA0ODgwNDg4MDM5MDdGQzA3RjgzOTBGRjAwMUZDNDg0ODZDN0VEODNGODAxMzdFMTU3RjQ4Qzc3RQorMDA3RUVDMUY4MDEyRkU1QUVEMEZDMEE0MTZFMEEzN0UxMjdFMDA3RjE0MUY3RTZEMTMzRjZDNkMxMzdGMzkwRkYwMDFGRjM4CiswN0ZDMEY2Q0I2RkM2QzE0Rjc2QzE0QzcwMTNGMTMwRkQ5MEZGODEzQzA5MEM3RkNBMjE1MUYxNjgwMTUzRjE2MDAwMDBGNUMKKzQ4NkMxMzdFNDg2QzEzRkU0QTVBNEE1QTE0MDc5MDM4ODAxRkYwMzkxRkUwN0ZFMDkwQjU1QTZDOTFDN0ZDNkM1QjAwMDExMworRjgzODAwN0ZDMDIzMzU3Q0IzMkM+NTcgRDwxNEZFNDk3RUE0NDk3RkEyMTRFRkEyMTMwNzgxQTIxNEM3QTIwMTBGN0ZBMzE0CitDMzkwMzgxRjgzRjBBNTkwMzgzRjAxRjhBNDkwMzg3RTAwRkNBNTQ5MTM3RTkwQjUxMkZFQTM0ODgwQTI5MDM4RjgwMDNGQTMKKzQ4NDhFQjFGODBBNDAwMDcxNUMwNDkxMzBGRDg3RkZFRUJGRkZDNkQ1QUI1MTRGRTZDMTVGQzQ5N0UyNzM0N0VCMzJDPjY1CitEPDAwN0ZCNTEyRTAxNUY4QjYxMkZFNkM4MDE2QzAzOTAzRjAwMDNGRUQwRkUwRUQwN0YwMTUwM0EyRUQwMUY4QTZFRDAzRjAKK0EyMTUwN0VEMEZFMEVEMUZDMEVERkY4MDkwQjYxMjAwNUQ1RDE1RkYxNkMwOTAzOUYwMDAxRkUwRUQwN0YwRUQwM0Y4MTUwMQorRUQwMEZDQTIxNkZFMTY3RUE2MTZGRTE2RkMxNTAxRUQwM0Y4MTUwRkVEM0ZGMDAwN0ZCNjEyRTAxNkMwQjcxMjgwNkNFQ0ZFCiswMDE1RjAyNzMzN0ZCMjJDPkk8MDJGRjEzNzAwMTA3RUJFMEY4NDkxM0Y5MDEzRjEzRkQ0OTEzRkZFQkZGODEzOTAxRkUwMAorN0Y0ODQ4MTMxRkQ4MDdGMDEzMEYxNTA3NDg1QTQ5MTMwMzQ4NUExNTAxNDhDN0ZDQTI1QTAwN0VFQzAwRjAxNjAwQTIxMkZFCis1QUFCN0UxMjdFQTMwMDdGMTVGMDZDRUMwMUY4QTI2QzdFQTI2QzZDMTMwMzZEMTRGMDZDNkMxMzA3MTZFMEQ4MDNGQzEzMUYKKzZDNkNFQjNGQzAzQTAwRkY4MUZGODA2REI1MTIwMDZENUIwMTBGNUI2RDEzRjAwMTAwMTM4MDI1MzU3REIzMkM+STwwMDdGCitCNUZDQjYxMkMwMTVGMDgxNkM4MDM5MDdFMDAzRkVFQzAwRkZFRDdGODAxNTNGRUQxRkMwRUQwRkUwQTIxNTA3MTZGMDE1MDMKKzE2RjgxNTAxQTRFRDAwRkNBQ0VEMDFGOEEzMTUwMzE2RjBBMjE1MDcxNkUwMTUwRkVEMUZDMDE1M0ZFRDdGODBFREZGMDBFQworMDNGRTAwN0ZCNTVBQjY1QTVEMTVDMDZDOTFDN0ZDMjYzMzdFQjIyQz5JPDAwN0ZCNjEyRjBCNzEyRjhBMzdFMzkwM0YwMDAKKzAxQTdFRDAwRjAxNjAwQTRFQzAxRTA0QTdFQTQ5MEI1RkNBNUVCRjAwM0E0NkU1QTkxQzhGQ0E1MTYzQzE2N0VBODAwN0ZCNgorMTJGRUI3RkNBMzZDMTVGQzI3MzM3RUIyMkM+STwwMDdGQjYxMkY4QjcxMkZDQTM3RUQ4MDNGMEM3RkNBNzE2NzgxNjAwQTUKKzE1RjA0QTdFQTQ5MEI1RkNBNUVCRjAwMUE0NkU1QTkyQzdGQ0FEMzg3RkZGRTBCNUZDODA1QzdFMjYzMzdFQjIyQz5JPDkwCiszOTAxRkMwMzgwOTAzOTBGRkY4N0MwNDkxM0VGMDE3RjEzRkY5MEI2RkM0ODEzMDczODAzRkMwMTQ5N0U0ODQ4MTM3RjQ4NDgKKzEzM0Y0OTEzMUYxMjFGNUIwMDNGMTQwRjkwQzdGQ0EyMTI3RUVEMDc4MDkyQzdGQ0EyMTJGRTVBQTg5MTM4MDNGRkY4NEExMworRkNBMjdFMDA3RTZEMTNGODkxMzgwMDBGQzBBMzZDMTQxRkEyN0YxMjFGNkQxMzNGMTIwRjZEMTM3RjZDN0U2QzZDMTNGRjZECis1QTM4MDFGRjA3NkM5MEI1RkM2RDEzRUYwMTFGMTNDRjZERUIwNzgwRDkwMUZDQzdGQzI2MzU3REIzMkM+STxEODdGRkVFQgorRkZGQ0I1NDgxM0ZFQTM2QzQ4NkMxM0ZDRDgwN0UwRUIwRkMwQjE5MEI2RkNBNTkwMzhFMDAwMEZCM0Q4N0ZGRUVCRkZGQ0I1Cis0ODEzRkVBMzZDNDg2QzEzRkMyNzMzN0VCMjJDPkk8MDA3RkI1MTJGOEI2MTJGQ0EzNkMxNEY4MzkwMDBGQzAwMEIzQjNBNQorMDA3RkI1MTJGOEI2MTJGQ0EzNkMxNEY4MUUzMzc5QjIyQz5JPEQ4N0ZGQ0VCN0ZGODQ4NkNFQkZGRkNBMzZDNDhFQjdGRjgKK0Q4MDdDMEVCMUY4MDE1M0ZFRDdGMDAxNTdFNUQ0QTVBMTQwMzRBNUE1RDRBNUE0QTVBMTQzRjRBQzdGQzE0N0U1Q0VCQzFGOAorMTNDM0VCQzdGQ0EyRUJDRkZFRUJERkJFRUJGRkJGMTQxRjAxRkU3RjQ5NkM3RTEzRjg2RTdFRUJGMDAzMDFFMDdGRUJDMDAxCis4MTZFN0VBMjE1N0UxNTNFMTUzRjgxMTY4MEVEMEZDMEEyRUQwN0UwRDg3RkZDRUIxRkZDNDg2Q0VCM0ZGRUEzNkM0OEVCMUYKK0ZDMjczMzdFQjIyQz43NSBEPDM4N0ZGRkUwQjU3RUEzNkM1QkQ4MDNGMEM4RkNCM0FFMTZGMEVEMDFGOEE4MDA3RkI2RkNCNworRkNBMzZDMTVGMDI1MzM3REIyMkM+STxEODdGRTBFQjBGRkM0ODZDRUIxRkZFQTI2RDEzM0YwMDdGMTVGQzAwMEYxNUUwMDEKK0JDMTM3QkE0MDE5RTEzRjNBM0VCOUYwMUEyMDE4RjEzRTNBMjE0ODNBMjAxODcxM0MzMTRDN0EyMDE4MzEzODNBMjE0RUZBMgorMDE4MTEzMDNBMjE0RkZFQjgwRkVBMzE0N0MxNDM4MTQwMEFDRDg3RkYwRUIxRkZDNDg2Q0VCM0ZGRUEzNkM0OEVCMUZGQzI3CiszMzdFQjIyQz5JPEQ4N0ZGMEVCN0ZGQzQ4NkNFQkZGRkVBMjdGMDA3RkVDN0ZGQ0Q4MDdGRUVCMDdDMDEzREVBMjEzREYxMworQ0ZBMjE0ODAxM0M3MTRDMEEyMTNDMzE0RTBBMjEzQzExNEYwQTIxM0MwMTRGOEEyMTQ3Q0EzMTQzRUEyMTQxRTE0MUZBMjE0CiswRjE1ODdBMjE0MDcxNUM3QTIxNDAzMTVFNzE0MDFBMjE1RjcxNDAwQTIxNUZGRDg3RkZDMTM3RjQ4N0UxNTNGQTI2QzQ4RUIKKzFGODAyNzMzN0VCMjJDPkk8RUI3RkZGMDAwM0I1MTJFMDAwMEYxNEY4NDg4MDQ4ODBFQkUwMDNFQjgwMDA0OEM3MTI3RkEyCiswMDdFODBBMzAwRkUxNTgwNDgxNDFGQjNBODZDMTQzRkEyMDA3RTE1MDBBMzAwN0Y1Q0EyNkM2QzEzRkVFQkYwMDc5MEI1RkMKKzZDNUM2QzVDMDAwMzE0RTBDNjZDOTBDN0ZDMjEzNTdCQjMyQz5JPDAwN0ZCNTEyQzBCNjEyRjg4MTE1RkY2QzE1ODAyNjAzCitGMDAwMTNDMDE1M0ZFRDBGRTBFRDA3RjBBMjE1MDMxNkY4MTUwMUE2MTUwMzE2RjAxNTA3QTJFRDBGRTBFRDNGQzAxNUZGOTAKK0I2MTI4MDE2MDAxNUZDNUQxNUMwMDFGMEM4RkNCMDM4N0ZGRjgwQjU3RUEzNkM1QjI1MzM3RUIyMkM+STwzODdGRkZGQ0I2Cis3RTE1RTAxNUY4NkM4MDM5MDdFMDA3RkUxNDAxRUMwMDdGNkY3RTE1MUZBMjZGN0VBNjRCNUFBMjE1M0Y0QkM3RkNFQzAxRkUKKzE0MDc5MEI1NUE1RDE1RTA4MTgxOTAzOEUwMDdGQ0VDMDFGRTE0MDAxNTdGODFBODE2MEZFRTFGODBBNUQ4N0ZGRUVCMUZCRgorQjVFQ0ZGMDA4MTVFNkM0ODZENUFDOEVBMDFGMDI5MzQ3RUIyMkM+ODIgRDw5MDM4MUZGODA3OTBCNUVBMEY4MDQ4MTRDRjAwCiswNzE0RkY1QTM4MUZGMDFGMzgzRkMwMDM0OTdFNDhDN0ZDMDA3RTE0N0YwMEZFMTQzRjVBMTUxRkE0NkNFQzBGMDAwMDdFOTEKK0M3RkMxMjdGN0ZFQTNGRTBFQTFGRkNFQkZGQzA2QzEzRkMwMDAzRUJGRkMwNkMxNEYwNkM2QzdGMDEwNzdGOTAzODAwN0ZGRQorRUMwN0ZGMDIwMDEzODAxNTNGRUQxRkMwQTJFRDBGRTBBMjAwNzgxNDA3MTJGQ0E1NkNFQzBGQzBBMjZDRUMxRjgwNkQxMzNGCiswMUUwRUI3RjAwOTAzOEZFMDFGRjkwQjU1QTVEMDBGOTE0RjBEOEY4M0YxM0MwRDg3MDA3OTBDN0ZDMjMzNTdDQjMyQz5JPAorMDA3RkI2MTJGQ0I3MTJGRUE0M0FGQzAwN0UwMDdFQTcwMDc4MTUzQ0M3MTQwMEIzQUY5MDM4M0ZGRkZDQTI0OTdGNkQ1QkEyCisyNzMzN0VCMjJDPkk8M0I3RkZGODAzRkZGQzBCNTZDNDgxM0UwQTM2QzQ5NkMxM0MwM0IwM0YwMDAwMUY4MDBCM0FGNkQxMworMDMwMDAxNURBMjZEMTMwNzAwMDA1RDZEMTMwRjAxN0Y0OTVBNkQ2QzQ4NUFFQ0UwRkY2REI1QzdGQzZENUIwMTAzMTNGODZECis1QjkwMzgwMDNGODAyQjM0ODBCMjJDPkk8RDg3RkZDRUI3RkZDNDg2Q0VCRkZGRUEzNkM0OEVCN0ZGQ0Q4MEZDMEVCMDdFMAorNkQxMzBGMDAwNzE1QzBBMzZEMTMxRjAwMDMxNTgwQTM2RDEzM0YwMDAxMTUwMEEzNkQ1QjAwMDAxNDdFQTQwMTdFNUJBNDZECis0ODVBQTQ5MDM4MUY4M0YwQTQwMTBGNUIxNEM3QTMwMTA3NUJBMjE0RUZBMjAxMDM1QkEyMTRGRkEyNkQ5MEM3RkNBNDZENUEKKzI3MzQ3RUIyMkM+STxEODdGRjBFQjA3RkY0ODZDNDkxMzgwQTM2QzQ4NkQxMzAwMDAxRkM4MTI3Q0E0NkM2QzVDQTc2QzZDCis0OTVBQTQxNDNFMTQ3RkEzM0EwM0UwRkY4M0UwQTIxNEY3QTIwMUUxMTNDM0EzMDAwMTAxRTM1QkEyMDFGMTEzQzcwMUYzMTMKK0U3QTMxNEMxQTIwMDAwNURBMjAxRjcxM0Y3MTQ4MEEzMDFGRjEzRkYwMTdGOTFDN0ZDNEE3RUE0MDEzRTEzM0UyOTM0N0ZCMgorMkM+STwzQTNGRkYwM0ZGRTA0ODQ5MTNGMDE0ODcxNDA3NkM2RDEzRTAzQTAxRjgwMEZFMDA3RjAwMDA0OTVBMTNGRTAxN0UKKzVCRUI3RjAzMDEzRjVCMTQ4NzAxMUY1QjE0Q0YwMTBGNUIxNEZGNkQ1QkEyNkQ5MEM3RkNBMjZENUFBMjZENUFBMjQ5N0VBMgorNDk3RUEyNDk3RjgxRUIwRkNGODFFQjFGQzdFQzg3RjBFQjNGODNFQzAzRjhFQjdGMDEwMTdFN0ZFQkZFMDA0OTdGMDAwMTE0Cis3RTQ5MTM3RjAwMDM4MDQ5MTQ4MDE1MUZEODdGRkVFQkZGRkM2RDVBQjUxNEZFNkMxNUZDNDk3RTI3MzM3RUIyMkM+STxEOAorN0ZGQ0VCN0ZGQzQ4NkNFQkZGRkVBMzZDNDhFQjdGRkNEODA3RjBFQjBGQzAxNTFGMDAwMzE1ODA2RDEzM0YxMjAxNkRFQjdGCiswMDEyMDA2RDEzN0UwMTdFMTNGRTAxN0Y1QkVCM0YwMUVDODFGODEzMUZFQzgzRjBFQjBGQzMxNEM3OTAzODA3RTdFMEEyMDEKKzAzNUIxNEVGNkRCNDVBQTI5MkM3RkM3RjVDMTQ3RUIwOTAzODA3RkZFMDQ5N0ZBMzZENUIyNzMzN0VCMjJDPkk8MDAzRkI2CisxMkMwNDgxNUUwQTQwMDdFQzdFQTFGQzBFRDNGODBBMkVEN0YwMDE1N0UxNUZFNEE1QTAwM0M1Q0M3MTIwMzRBNUFBMjRBNUEKKzRBNUFBMjRBNUE0QUM3RkNBMjE0RkU0OTVBQTI0OTVBNDk1QUEyNDk1QTQ5NUFBMjQ5NUE0OUM4RkNBMjEzRkU0ODVBQTI0OAorNDhFQjAzQzA0OUVCMDdFMDEyMDc0ODVBNUIxMjFGNDg1QUEyNDhDN0ZDQjdGQ0E0NkMxNUMwMjMzMzdDQjIyQz5JPDEyNzAKKzEyRjhBMjdFMTI3QzEyN0UxMjNFMTIzRjdFQTI3RjEyMEY3RjEyMDc3RjEyMDM3RjEyMDE3RjEyMDA3RjEzN0MxMzdFMTMzRQorQTIxMzNGN0Y4MDEzMEY4MDEzMDc4MDEzMDM4MDEzMDE4MDEzMDA4MDE0N0MxNDdFMTQzRUEyMTQzRjgwODExNDBGODExNDA3Cis4MTE0MDM4MTE0MDE4MTE0MDA4MTE1N0NBMjE1N0UxNTNFMTUzRjgxMTY4MDE1MEZBMkVEMDcwMDIxNDE3QkI5MkM+OTIKK0Q8MDA3RkI2RkNCNzEyODBBNDZDMTUwMDIxMDY3QjdEMkM+OTUgRDwzODAxRkZGMDAwMDcxM0ZFMDAxRjZEN0UxNUUwNDg4MAorOTAzOEMwMUZGODE0MDdFQzAxRkMzODFGODAwMDAwMDZDNzdFQzgxMjdFQTNFQ0ZGRkUxMzFGOTBCNUZDMTIwMzEyMEY0OEVCCis4MDdFMzgzRkY4MDBFQTdGQzA5MEM3RkMxMkZFNUFBNDdFMDA3RjE0RkVFQjgwMDMzODNGRTAxRjZDQjYxMkZDNkMxNUZFNkMKKzE0QkYwMDAxRUJGRTFGM0EwMDNGRjAwN0ZDMjcyNDdDQTMyQz45NyBEPEVBN0ZGMDQ4N0VBMzEyN0YxMjAxQUFFQzFGRTBFQworRkZGODAxRkIxM0ZFOTBCNkZDMTY4MDkxMzhGMDdGQzA5MTM4ODAxRkUwOTEzODAwMDdGMDQ5RUIwM0Y4NUJFRDAxRkM0OTEzCiswMEEyMTZGRTE2N0VBODE2RkU2RDE0RkNBMkVEMDFGODZEMTMwMzZERUIwN0YwMTUwRjkxMzg4MDFGRTA5MTM4RTA3RkMwOTEKK0I1MTI4MDE2MDAwMUZCNUIwMUY4MTNGODM5MDBGMDNGQzAyNzMzN0ZCMjJDPkk8OTAzODAzRkZFMDAxMUYxM0Y4MDE3RjEzCitGRTQ4QjVGQzQ4ODA0ODQ4QzZGQ0VBMEZGMDQ4NUE0OTEzN0U0ODQ4MTMxODkwQzlGQzVBMTI3RUEyNUFBODEyN0VBMjEyN0YKKzZDMTQwRjZERUIxRjgwNkM3RTZEMTMzRjZDNkNFQjdGMDAzOTA3RkUwM0ZGNkNCNTVBNkM1QzZDNkM1QjAxMUYxM0UwMDEwMworOTBDN0ZDMjEyNDdBQTMyQz5JPEVDMEZGRTRBN0VBMzgwRUMwMDNGQUFFQjA3RjhFQjNGRkU5MEI1MTJCRjQ4MTRGRjVBMzgKKzA3RkMwRjM4MEZGMDAzNDg0ODdFNDk3RTQ4NDg3RjkwQzdGQzAwN0U4MEEyMTJGRTVBQTg3RTAwN0U1Q0EyMDA3RjVDNkM3RQorNUM2QzZDNUEzODBGRjAwNzM4MDdGQzFGNkNCNjEyRkM2Q0VDQkZGRTZDMTQzRkVCM0ZGQzkwMzkwRkYwMUZGQzI3MzM3REIyCisyQz5JPEVCMDNGRTkwMzgxRkZGQzAwMTdGMTNGMDQ4QjU3RTQ4ODAzOTA3RkUwM0ZFMzkwRkY4MDBGRkQ4MUZFMEVCM0Y4MAorNUI0ODQ4RUIxRkMwOTBDNzEyMEY1QTAwN0UxNUUwMTUwNzVBQjdGQ0E0MTZDMDAwRkNDOUZDN0UxMjdFQTIxMjdGNkNFQzAzCitDMDZERUIwN0UwNkM3RUQ4MEZGMDEzMEY2QzZDRUIzRkMwMDFGRjEzRkYwMDAxOTBCNTEyODA2QzE1MDAwMTNGMTNGQzAxMEYKKzEzRjAwMTAxMTM4MDIzMjQ3Q0EzMkM+STxFQzBGRjhFQzNGRkU5MUI1RkM0OTE0ODA1QjkwMzgwN0ZDN0YxNEYwOTAzOTBGCitFMDNGMDAxNEMwOTJDN0ZDQTYwMDdGQjUxMkZFQjdGQ0EzNkM1QzI2MDAwRkMwQzdGQ0IzQTgwMDNGQjUxMkYwNDg4MEEzNkMKKzVDMjEzMzdEQjIyQz5JPEVEMDNGODkwMzkwN0Y4MEZGQzkwMzkxRkZFM0ZGRTAxN0ZCNkZDNDhCN0ZDNDhFQ0ZFN0Y5MDM4CitGQzBGRjgyNjA3RjAwMzEzM0UzQTBGRTAwMUZDMUNEOUMwMDAxMzAwMDAxRjgwNDkxMzdFQTY2RDEzRkUwMDBGNUNFQkUwMDEKKzZDNkM0ODVBMzkwM0ZDMEZGMDQ4QjVGQzVENDgxNDgwRDk5RkZFQzdGQ0VCODdGODAxODBDOEZDQTM3RjZDN0U5MEI1MTJGMAorNkMxNEZFNDhFQ0ZGODA0ODE1RTA0ODE1RjAzQTNGQzAwMDFGRjg0OEM3RUEwM0ZDMDA3RTE0MDAwMDdDMTU3QzAwRkMxNTdFCis0ODE1M0VBNDZDMTU3RTAwN0UxNUZDRDg3RjgwMTMwM0Q4M0ZFMEVCMEZGOEQ4MUZGQ0VCN0ZGMDZDQjYxMkUwMDAwMzE1ODAKKzZDMTUwMEQ4MDAzRjEzRjgwMTA3MTNDMDI4Mzg3RUE0MkM+STxFQTdGRjA0ODdFQTMxMjdGMTIwMUFBRUMxRkUwRUM3RkZDCis5MDM4RjlGRkZFMDFGQjdGOTBCNkZDOTEzOEYwM0Y4MEVDQzAxRjAyODA3RkVDMDAwRjVCNUJBMjVCQjMyNjdGRkZFMEI1RkMKK0I1MDBGMTE0ODBBMzZDMDFFMDE0MDAyOTMzN0ZCMjJDPkk8MTMwN0VCMUZDMEEyNDk3RUEzNkQ1QUEyMDEwN0M3RkM5MEM4CitGQ0E3Mzg3RkZGQzA4MEI1RkM3RUEyRUEwMDA3QjNBODAwN0ZCNTEyRkNCNjEyRkVBMzZDMTRGQzFGMzQ3OUIzMkM+STwxNAorMEVFQzNGODBBMkVDN0ZDMEEzRUMzRjgwQTJFQzBFMDA5MUM3RkNBNzQ4QjUxMjgwNDgxNEMwQTM3RUM3MTIwRkIzQjNBMjE0CisxRjAwM0MxNDgwMDA3RTEzM0ZCNDE0MDA1Q0VCMDFGRUVCRkZGQzZDNUI1QzAwMUY1QjAwMDc5MEM3RkMxQTQ2N0NCMzJDPgorSTxFQTdGRTA0ODdFQTMxMjdGMTIwMUFBOTEzODFGRkZGMDRBMTNGOEEzNkUxM0YwOTEzODAwRkUwMDRBNUE0QTVBNEE1QTRBCis1QTRBNUE0QTVBNEFDN0ZDMTRGRUVCRjFGQzEzRjNFQkY3RkU5MEI1RkNBMkVDOUY4MEVDMEZDMDAxRkU3RkVCRkMwNzQ5NkMKKzdFNDk2QzdFODExNDAwMTU3RTgxMTY4MDE1MUYzQTdGRkZDMEZGRkNCNTAwRTExM0ZFQTM2QzAxQzAxM0ZDMjczMzdFQjIyQworPkk8Mzg3RkZGRTBCNTdFQTM3RUVBMDAwM0IzQjNBNTAwN0ZCNjEyODBCNzEyQzBBMzZDMTU4MDIyMzM3QkIyMkM+STwzQTdGCis4M0YwMDdFMDkwMzlDRkZDMUZGODNBRkZERkZFM0ZGQ0Q4N0ZGRjEzRkY5MUI1N0UzQTA3RkUxRkZDM0UwMUZDRUJGODNGNDkKKzZDNDg3RTAxRjAxM0UwMDFFMDEzQzBBMzAxQzAxMzgwQjMzQjdGRkMzRkY4N0ZGMDAyN0YxM0ZGRDhGRkZFNkQxM0Y4RDg3RgorRkM0OTEzRjAwMjNGMTM3RjJEMjQ4MUEzMkM+STwzOTdGRjAxRkUwMzlGRkY4N0ZGQzkwMzhGOUZGRkUwMUZCN0Y2Q0I2RkMKKzAwMDE5MDM4RjAzRjgwRUNDMDFGMDI4MDdGRUMwMDBGNUI1QkEyNUJCMzI2N0ZGRkUwQjVGQ0I1MDBGMTE0ODBBMzZDMDFFMAorMTQwMDI5MjQ3RkEzMkM+STxFQjA3RkNFQjFGRkYwMTdGMTNDMDQ4QjUxMkYwNDg4MDM5MDdGQzA3RkMzOTBGRjAwMUZFNDgKKzQ4NkM3RTAxODAxMzNGMDAzRjE1ODA5MEM3MTIxRjAwN0VFQzBGQzBBMzQ4RUMwN0UwQTc2QzE0MEYwMDdFMTVDMEEyMDA3RgorMTQxRjZDMTU4MDZEMTMzRjZDNkNFQjdGMDA2RDVCNkM2QzQ4NUEzOTA3RkMwN0ZDNkNCNTVBNkM1QzZDNkMxM0MwMDExRjkwCitDN0ZDRUIwN0ZDMjMyNDdDQTMyQz5JPDM5N0ZGMDFGRTAzOUZGRjhGRkY4MDFGQjEzRkU5MEI2RkM2QzE1ODAwMDAxOTAzOAorRjA3RkMwOTEzODgwMUZFMDkxMzgwMDA3RjA0OUVCMDNGODVCRUQwMUZDNDkxMzAwQTIxNkZFMTY3RUE4MTZGRTZEMTRGQ0EyCitFRDAxRjg2RDEzMDM2REVCMDdGMDE1MEY5MTM4ODAxRkUwOTEzOEUwN0ZDMDkxQjUxMjgwMTYwMDAxRkI1QjAxRjgxM0Y4RUMKKzNGQzA5MUM4RkNBRDM4N0ZGRkUwQjU3RUEzNkM1QjI3MzY3RkEzMkM+STw5MDM5MDNGQzA3ODA5MDM5MUZGRjBGQzAwMTdGCisxM0NGNDhCNTEyRUY0ODE0RkYzODA3RkUwNzM4MEZGMDAxNDg0ODdFNDkxMzdGNDg0ODEzM0Y5MEM3RkM0ODE0MUYxMjdFMTUKKzBGNUFBODdFMDA3RTE0MUZBMjZDMTQzRjdGNkM2QzEzN0Y2RDEzRkYzODBGRjAwMzM4MDdGQzBGNkNCNkZDNkMxNEVGNkM2QworMTM4RjZEMTMwRkVCMDdGODkwQzdGQ0FEMDIwM0I1RkM0QTE0ODBBMzZFMTQwMDI5MzY3REEzMkM+STxEODdGRkVFQjNGQzAKK0I1MzgwMUZGRjAwMjA3MTNGODAyMUYxM0ZDNkM1QjM5MDAzRjdGRTFFQ0ZGMDE5MTM4RkMwMEY4NEExMzcwNEExMzAwNUNBMgorNUM1Q0EzOTFDOEZDQUYwMDdGQjUxMkUwQjY3RUEzNkM1QzI2MjQ3RUEzMkM+STw5MDM4N0ZGODcwMDAwM0I1MTJGODEyMEYKKzVBNUEzODdGQzAwRjM4N0UwMDAzNDgxMzAxNUFBMzZDRUIwMEYwMDA3RjE0MDAxM0YwMzgzRkZGQzA2QzEzRkU2Q0VCRkY4MAorMDAwMzE0RTBDNjZDMTNGODAxMDExM0ZDRUIwMDA3RUMwMEZFMDA3ODE0N0YwMEZDMTQzRjE1MUY3RUEyNkMxNDNGNkQxMzNFCis2RDEzRkU5MDM4RjAwN0ZDOTBCNUZDMTVGODE1RTAwMEY4MTQ4MDM5NzAxRkZDMDAyMDI0N0FBMzJDPkk8MTMxRTEzM0ZBOQorMDA3RkI2RkNCNzEyODBBMzZDMTUwMEQ4MDAzRkM4RkNCMUVEMDNDMEVEMDdFMEE1RUM4MDBGMDExRkVCMUZDMEVDRTA3RjZECitCNTEyODAxNjAwMDEwMzVCNkQxM0Y4OTAzODAwM0ZFMDIzMkU3RUFEMkM+STwzQTdGRjAwM0ZGODA0ODZDNDg3RkEzMDA3RgorN0YwMDAxRUIwMDBGQjNBMzE1MUZBMjE1M0Y2RDEzN0YzOTAwRkUwM0ZGOTBCN0ZDNkQxNTgwN0Y2RDEzQ0Y5MDI2MDNGRTA3CisxMzAwMjkyNDdGQTMyQz5JPDNBN0ZGRjAxRkZGQ0I1MTRGRTE0ODMxNDAxNkMxNUZDM0EwM0UwMDAwRjgwQTI2RDEzMUYwMAorMDExNTAwQTI2RDVCMDAwMDE0M0VBMjZEMTM3RTAxN0MxMzdDQTIwMTdFMTNGQzAxM0U1QkEyRUIzRjAxMDExRjVCQTIxNDgzCiswMTBGNUJBMjE0QzcwMTA3NUJBMjE0RUYwMTAzNUJBMjE0RkY2RDkwQzdGQ0EyNkQ1QTE0N0MyNzI0N0VBMzJDPkk8RDg3RgorRkZFQjdGRkY2RUI1RkNCNTE1ODA2QzE2MDA0QTdFRDgwN0MwRUIwMUYwQTY2QzZDNDk1QUEzMTQzRTE0N0ZBMkQ4MDFGMDQ5Cis1QUVDRkY4N0EyMTRGN0EyMDFGMTEzQzcwMDAwNUQ5MDM4RjlFM0NGQTIwMUZCMTNFRkEzRDk3QkMxOTBDN0ZDMDE3RjEzRkYKK0EyMTQ4MEEyMDEzRjVCOTAzODFGMDA3QzI5MjQ3RkEzMkM+STwzQTNGRkYwM0ZGRjA0ODAxODcxM0Y4QTM2QzAxMDMxM0YwCiszQTAwRkMwMDdFMDA1RDkwMzg3RTAxRjgwMTNGNUJFQjFGODNFQzg3RTA5MDM4MEZDRkMwOTAzODA3RUY4MEVCMDNGRjZEOTAKK0M3RkM1QzZENUExNDdDMTRGRTEzMDE4MDkwMzgwM0VGODA5MDM4MDdDRkMwRUIwRkM3RUM4M0UwOTAzODFGMDFGMDAxM0Y3RgorRUI3RTAwMDE3QzEzN0M0OTEzN0UwMDAxODAzQTdGRkYwMUZGRkMxNDgzQjUxNEZFNkMxNUZDMTQwMTI3MjQ3RUEzMkM+STwKKzNBN0ZGRjAxRkZGQ0I1MDA4MTEzRkUxNDgzMTQ4MTZDMDEwMTEzRkMzQTAzRTAwMDBGODA2QzdFMTUxRjZEMTQwMDEyMDA1RAorNkQxMzNFMTM3QzAxN0UxMzdFMDEzRTEzN0NBMjAxM0YxM0ZDNkQ1QkEyRUIwRjgxNURBMkVCMDdDMUVDQzNFMEEyRUIwM0UzCitFQ0U3QzAxMzAxMTRGNzVERUIwMEZGQTI5MkM3RkM4MEEyMTQzRUEyMTQ3RTE0N0NBMjE0RkM1Q0EyRUEwQzAxMDAzRjVCRUEKKzdGODNFQjg3RTBFQTdFMEY0OTVBMzg3RkZGODA2QzkwQzhGQzZDNUE2QzVBRUEwN0UwMjczNjdFQTMyQz5JPDAwM0ZCNjEyCitFMDQ4MTVGMEE0MDA3RUM3RUExRkUwRUQzRkMwRUQ3RjgwRURGRjAwNEE1QTAwM0M0OTVBQzc0ODVBNEE1QTRBNUE0QTVBNEEKKzVBNEFDN0ZDRUIwMUZDNDk1QUVCMEZGMDQ5NUE0OTVBNDk1QTQ5QzhGQzQ4NDhFQjAxRTA0ODQ4RUIwM0YwNDg1QTQ4NUE0OAorNUE0ODVBNDg1QUI3RkNBNDZDMTVFMDI0MjQ3REEzMkM+SSBFCislRW5kRFZJUFNCaXRtYXBGb250CislRFZJUFNCaXRtYXBGb250OiBGbiBlY2J4MTAwMCAxMCAyOQorL0ZuIDI5IDEyMiBkZjxCRTEyRkNBMzVFMDM4MDk3NUY+MjIgRDwxNDFFMTQzRTE0RkUxMzA3MTM3RkI1RkNBMzEzOEZFQTAwCiswRkIzQjNBNTAwN0ZCNjEyODBBNDIxMzY3OUI1MzA+NDkgRDxFQjBGRkU5MDM4N0ZGRkMwNDhCNTEyRjAwMDA3MTRGQzM5MEYKK0UwM0ZGRjI2MUY4MDBGMTM4MDI2M0YwMDAzMTNDMEQ4N0Y4MDE0RTBFQkUwMDEwMEZGNkQxM0YwN0ZBMkVEN0ZGOEE0NkM1QQorNkM1QTAwMDZDN0ZDQzhGQ0VERkZGMEEyMTZFMDVDMTZDMDRBMTM4MDE2MDA0QTVBNEE1QUVDMUZGMDVENEE1QTRBQzdGQzE0CitGRTQ5NUFEOTAzRjAxMzc4NDk1QTQ5NUE0OTVBNDlDNzEyRjgwMTdDMTRGMDVCNDkxMzAxNDhCNkZDNUE1QTVBNUE1QTQ4MTUKK0UwQjdGQ0E0MjUzNjdCQjUzMD5JPEVCMDNGRjAxMUYxM0YwMDE3RjEzRkMzOTAxRkMwN0ZGMjYwM0YwMDMxMzgwNDg0ODZDCisxM0MwNDk2QzEzRTBFQTBGRjg2RDE0RjA0ODdFQTY2QzQ4MTRFMDZDNUE2QzQ4NUFDNzE0QzA0QTEzODAxNjAwNEE1QTRBNUEKK0VDM0ZGMDkwMzgwRkZGQzA1RDE1RjA5MDM4MDAwN0ZFOTEzODAxRkY4MDZFMTNDMDE2RTBFRDdGRjAxNkY4RUQzRkZDQTIxNgorRkVFQTFGQzA0ODdFNDg3RTQ4N0VBNDE2RkNBMjQ5MTM3RjAwN0YxNUY4MDFDMEVCRkZGMDZDNUE2QzZDNDgxM0UwMjYwRkZDCiswNzEzODA2Q0I2MTIwMDAwMDExNEZDNkM2QzEzRjAwMTA3OTBDN0ZDMjczNzdDQjUzMD5JPEVEMDdDMDE1MEZBMjE1MUYxNQorM0YxNTdGMTVGRjVDQTI1QzVDNUM1QzE0M0UxNDNDNUM1QzEzMDE0OTVBNUM0OTVBNDk1QTVCMTMzRTVCMTM3ODVCNDg1QTEyCiswMzQ4NUE1QjQ4QzdGQzEyMUU1QTEyN0M1QUI4MTI4MEE0QzcwMDAxRUJDMDAwQUEwMTAzQjYxMjgwQTQyOTM2N0RCNTMwPgorSTxCODEyQzAxN0ZDMTdGRjE4QzAyODAwN0ZGMDAwMDM3RjA0MDA3RjcxN0U3MTdFMTcxRjg0QTI3MTdFQTc0RDVBQTI2MDE3CiszRjRENUE0RDVBNEMxM0MwMDQwRjVCOTFCNjAwRkNDN0ZDQTJFRkZGODAwMkYwQzcxM0YwRUYzRkY4NzE3RTcxN0U3MTdFMTkKKzgwNzExM0MwQTMxOUUwQTcxOUMwQTI1RjREMTM4MDE5MDA1RkVGN0ZGRTRDNDg1QUI5MTJGMDE4QzA5NUM3RkMxN0YwM0IzOQorN0RCODQ0PjY2IEQ8QjYxMkZDQTQzOTAwN0ZGODAwQjNCM0FEQjYxMkZDQTQxRTM5N0RCODI0PjczCitEPEI3RkNBNDI2MDA3RkY4QzlGQ0IzQUNFRjA3ODBBNTE3MEYxODAwQTM1RkEyNUZBMjVGNUY1RTVFRUUwRkZFMTY3RkI4RkMKK0E0MzEzOTdEQjgzOT43NiBEPEVERkZGODAyMEZFQkZGODAwMjdGMTRGMDkwM0EwMUZGQzAxRkZDMDEwNzkwMzgwMDA3RkZEOQorMUZGQzAxMDExM0MwRDkzRkYwNkQ2QzdFNDk0ODZFN0U0OTQ4NkU3RTQ4NDk2RTdFNDg4MzQ4OTBDODZDN0VBMjQ4NDg2RjEzCis4MEEyNDg0ODZGMTNDMEEyMDAzRjE4RTBBMzQ4NDg2RjEzRjBBNDAwRkYxOEY4QUMwMDdGMThGMDZENURBMzAwM0YxOEUwQTIKKzZENUQwMDFGMThDMEEyNkM2QzRCMTM4MDZDMTgwMDZFNUM2QzZENEE1QTZDNUY2QzZENEE1QTZENkM0QTVBRDkzRkZDNDk0OAorNUE2REI0MDEwNzVCMDEwN0Q5QzAxRjkwQzdGQzAxMDE5MEI1MTJGQzZENkMxNEYwMDIwRjE0ODAwMjAwMDFGOEM4RkMzRDNCCis3QkI5NDg+NzkgRDxCOEZDMTdGMDE3RkVFRkZGODAyODAwN0ZGODAwMEYxM0MwMDQwMTEzRTA3MDEzRjBFRjdGRjhFRjNGRkMKK0EyRUYxRkZFQTIxOEZGQTgxOEZFQTJFRjNGRkNBMkVGN0ZGOEVGRkZGMDRDMTNFMDA0MEYxM0MwOTFCNzEyMDAxN0ZDMTdFMAorMDJGOEM5RkNCM0E0QjYxMkZDQTQzODM5N0RCODQxPkk8RDkwN0ZGMTMwRTAxM0ZFQkUwMUU5MEI1RUFGODNFMDAwM0VDRkUKKzdFM0EwN0ZDMDFGRkZFMzkwRkYwMDAxRjQ4NDgxMzBGNDg0ODEzMDM0OTEzMDEwMDdGMTQwMDkwQzhGQzE2N0U1QTE2M0VBMgorN0YxNjFFN0Y3RjZEOTFDN0ZDMTNGQzM4N0ZGRkUwMTRGRUVDRkZGMDZDMTRGRTZGN0U2QzgxNkMxNUYwNkM4MTZDODFDNjgxCisxMzNGMDEwRjgwMTMwMUQ5MDAwRjE0ODBFQzAwN0YwMzBGMTNDMDE1MDM4MTgxMDBGMDE1N0ZBMzE2M0ZBMjdFMTc4MDdFMTYKKzdGNkMxNjAwN0U2RDE0RkUwMUUwNDk1QTAxRjgxMzAzOTAzOUZGODAxRkY4MDBGQzkwQjUxMkUwRDhGODNGNUNEOEYwMDc0OQorQzdGQzM5RTAwMDdGRjAyQTNCN0JCOTM1PjgzIEQ8RUIzRkZFMDAwM0I1MTJFMDAwMEYxNEY4MzkxRkYwMEZGRTAwM0ZFQjAzCitGRjZENkM3RjZFN0ZBMjZGN0VBMjZDNUE2QzVBRUEwMzgwQzhGQ0EyRUMzRkZGMDEwRkI1RkMxMzdGMzkwMUZGRjg3RjAwMDcKKzEzODAzODBGRkUwMEVBM0ZGODVCNDg1QTEyRkY1QkE0MTVGRjZENUExMjdGMjYzRkYwMDcxM0Y4M0IxRkZDMUZCRkZGQzAzOQorMEZGRkZFMUYwMDAzRUJGODBGMzkwMDNGRTAwMzJBMjU3REE0MkU+OTcgRDw5MDM4MDFGRkMwMDEwRjEzRkMwMTdGMTNGRkQ5CitGRjgwMTM4MDI2MDNGRTAwMTNDMDQ4NDg1QUVBMEZGODEyMUYxM0YwMTIzRjZFMTM4MDQ4NDhFQjdGMDAxNTFDOTJDN0ZDMTIKK0ZGQTkxMjdGQTI3RjEyM0ZFRDAxRTA2QzdFMTUwMzZDNkNFQjA3QzA2QzZDMTQ4MDZDNkMxMzFGQzY5MDM4QzA3RTAwNkRCNAorNUEwMTBGMTNGMDAxMDExMzgwMjMyNTdEQTQyQT45OSBEPEVFN0Y4MEVEN0ZGRkE0MTUwMzgxQUY5MDM4MDFGRjgxMDEwRjEzCitGMTAxM0YxM0ZEOTAzOEZGQzA3RjAwMDNFQjAwMUZEODA3RkMxMzA3MDAwRjgwNDg0ODdGNUIxMjNGQTI0ODVBQTMxMkZGQUEKKzEyN0ZBMjdGMTIzRkEyNkM2QzVCMDAwRjVDNkM2QzVCNkM2QzQ5MTNDMDI3MDFGRjgwRkQxM0ZFMzkwMDdGRkZGOTAxMUYxMworRTEwMTAxMTMwMTJGM0E3REI5MzU+STw5MDM4MDNGRjgwMDExRjEzRjAwMTdGMTNGQzM5MDFGRjgzRkUzQTAzRkUwMDdGODAKKzQ4NDgxMzNGNDg0ODE0QzAwMDFGRUMxRkUwNUIwMDNGRUMwRkYwQTI0ODVBMTZGODE1MDcxMkZGQTI5MEI2RkNBMzAxRTBDOAorRkNBNDEyN0ZBMzZDN0UxNjc4MTIxRjZDNkMxNEY4NkQxNEYwMDAwNzE0MDNEODAxRkZFQjBGRTA2QzkwMzhDMDdGQzA2REI1CisxMjAwMDEwRjEzRkMwMTAxMTNFMDI1MjU3REE0MkM+STxFQzFGRjA5MDM4MDFGRkZDMDEwNzEzRkY5MDM5MUZGODdGODA5MAorMzgzRkUwRkZEOUZGQzExM0MwQTI0ODEzODFBMjQ4MTMwMTZFMTM4MEEyRUQzRTAwOTJDN0ZDQThCNkZDQTQwMDAzOTBDOEZDCitCM0FCQjUxMkZFQTQyMjNBN0RCOTFEPkk8MTYxRkQ5MDdGRUVCRkZDMDkwMzg3RkZGRTM0OEI2RUFFRkUwMjYwN0ZFMDcxMworOEYyNjBGRjgwMTEzMUY0ODQ4NkMxMzhGMDAzRjE1Q0Y0OTkwMzg3RkM3QzBFRUMwMDAwMDdGODFBNjAwM0Y1REEyNkQxM0ZGCiswMDFGNUQ2QzZDNDg5MEM3RkMzOTA3RkUwN0ZFNDhCNTEyRjg2RDEzRTAyNjFFMDdGRUM4RkM5MENBRkNBMjEyM0UxMjNGN0YKKzZDN0U5MEI1MTJGOEVERkY4MDE2RTA2QzE1Rjg2QzgxNkM4MTVBMDAxRjgxMzkzRkMwMDAwRjQ4QzgxMzgwNDgxNTdGNUExNgorM0ZBMzZDMTU3RjZDMTYwMDZENUM2QzZDNDk1QUQ4MUZGMEVCMDdGQ0Q4MDdGRUVCM0ZGMDAwMDFCNjEyQzA2QzZDOTFDN0ZDCiswMTA3MTNGMDJCMzc3REE1MzA+STwxM0ZGQjVGQ0E0MTIwNzdFQUZFRDdGQzA5MTM4MDNGRkY4MDIwRjEzRkU5MTM4MUYwMworRkZEQTNDMDExMzgwMTQ3ODRBN0U0QTE0QzA1Q0EyNUNBMjkxQzdGQ0IzQTNCNUQ4RkMzRjEzRkZBNDMwM0E3REI5MzU+STwKK0VBMDFGMEVBMDdGQzQ4N0VBMjQ4N0VBNTZDNUFBMjZDNUFFQTAxRjBDOEZDQTkxM0ZGMTI3RkE0MTIwNzdFQjNBOUI1MTJGOAorQTQxNTNCN0RCQTFCPkk8MTNGRkI1RkNBNDEyMDc3RUIzQjNBQ0I1MTJGQ0E0MTYzQTdEQjkxQj4xMDgKK0Q8MDFGRUVCN0ZDMDAwRkY5MDM4MDNGRkY4MDIwRjEzRkU5MTM4MUYwM0ZGREEzQzAxMTM4MDAwMDcxMzc4MDAwMzQ5N0U2RAorNDgxNEMwNUNBMjVDQTI5MUM3RkNCM0EzQjVEOEZDM0YxM0ZGQTQzMDI1N0RBNDM1PjExMAorRDw5MDM4MDFGRkMwMDEwRjEzRjgwMTdGMTNGRkQ5RkY4MDdGM0EwM0ZFMDAzRkUwNDg0ODZEN0U0ODQ4NkQ3RTQ4NDg2RDdFCitBMjAwM0Y4MTQ5MTMwMzAwN0Y4MUEzMDBGRjE2ODBBOTAwN0YxNjAwQTMwMDNGNUQ2RDEzMDcwMDFGNURBMjZDNkM0OTVBNkMKKzZDNDk1QTZDNkM0OTVBNkM2QzZDQjQ1QTZDNkNCNUM3RkMwMTFGMTNGQzAxMDExM0MwMjkyNTdEQTQzMD5JPDkwMzlGRjAxCitGRjgwQjUwMDBGMTNGMDAyM0YxM0ZDOTEzOEZFMDdGRkRBRjAwMTEzODAwMDAzNDk2QzEzQzAwMjgwRUI3RkUwOTFDNzEzRjAKK0VFM0ZGOEEyRUUxRkZDQTNFRTBGRkVBQTE3RkMxNjFGQTIxN0Y4MTYzRjE3RjA2RTEzN0Y2RTE0RTA2RUVCRkZDMERBRjAwMworMTM4MDkxMzlGQzA3RkUwMDkxMzgzRkZGRjgwMjBGMTNFMDAyMDM5MEM3RkM5MUM5RkNBQ0I1MTJGQ0E0MkYzNTdFQTQzNT4KK0k8OTAzOEZFMDNGMDAwRkZFQjBGRkVFQzNGRkY5MTM4N0M3RjgwOTEzOEY4RkZDMDAwMDc1QjZDNkM1QTVDQTI5MTM4ODA3RgorODBFRDNGMDAxNTBDOTJDN0ZDOTFDOEZDQjNBMkI1MTJGRUE0MjIyNTdFQTQyNz4xMTQgRDw5MDM4M0ZGMDM4MzkwM0ZGRkUKK0Y4MDAwRjEzRkYzODFGQzAwRjM4M0YwMDAzMDA3RTEzMDEwMDdDMTMwMDEyRkMxNTc4N0U3RTZEMTMwMDEzRkNFQkZGRTA2QworMTNGQ0VDRkY4MDZDMTRDMDZDMTRGMDZDMTRGODEyMDNDNjE0RkMxMzFGOTAzODAwN0ZGRTE0MDcwMEYwMTMwMTE0MDA3RTE1Cis3RTdFMTU3QzZDMTRGQzZDMTRGOEVCODAwMTkwMzhGMDA3RjA5MEI1MTJDMDAwRjgxNDAwMzhFMDFGRjgxRjI1N0RBNDI2PgorSTwxMzBGQTU1QkE0NUJBMjVCNUJBMjVBMTIwNzAwMUZFQkZGRTBCNkZDQTMwMDAzOTBDN0ZDQjIxNTc4QTgxNUY4NkNFQjgwCitGMDE0ODE2Q0VCQzNFMDkwMzgzRkZGQzA2RDEzODA5MDM4MDNGRTAwMUQzNTdFQjQyNT5JPDAxRkZFQzNGQzBCNUVCM0ZGRgorQTQwMDA3MTQwMTZDODBCM0EzNURBMjVEQTI2QzVDNkU0ODEzRTA2Q0Q5QzAzRTEzRkY5MDM4N0ZGRkZDMDExRjEzRjAwMTAzCisxMzgwMzAyNTdEQTQzNT5JPEI1MzlGMDFGRkZGMEE0MDAwMzkwMzk4MDAzRjgwMDZDMDFDMDEzRTA2QzE0MDdEOTdGRTA1QgorNkQ2QzQ4NUE2RTQ4QzdGQzkwMzgxRkZDM0UwMTBGNUI5MDM4MDdGRUZDNkQ2QzVBNUQ2RDVCNkQ1QjZFN0U2RTdFODE0QTdFCitBMjRBN0U5MDM4MDFGM0ZGRDkwM0UzN0ZEOTA3QzE3RkVCMEZDMDQ5NDg2QzdFNEE2QzdFMDEzRTgwNDk2RDdFNDkxMzBGMDAKKzAxNkU3RUI1OTAzODNGRkZGOEE0MkQyNTdFQTQzMj4xMjAgRDxCNTM5RjAwMUZGRjhBNDAwMDM5MEM3RUExRjAwMTYxRTZFCisxMzNFNkMxNTNDNkUxMzdDNkMxNTc4NkUxM0Y4MDE3RjVDRUNGMDAxMDEzRjVDMTRGODAxMUY0OTVBQTJFQ0ZDMDcwMTBGNUMKK0VDRkUwRjAxMDc5MUM3RkM2RTVBNkQxMzFFMTVCRTZEMTNCQzE1RkM2RDVCQTM2RTVBQTI2RTVBQTI2RTVBQTI2RTVBQTI5MgorQzhGQ0EyNUMxNDFFMDAzRjEzM0UzODdGODAzQzM4RkZDMDdDMTQ3ODE0RjhFQkMxRjBFQkMzRTA2QzQ4NUEzODdEMUY4MEQ4CiszRkZGQzlGQ0VBMUZGQ0VBMDdGMDJEMzU3RUE0MzI+SSBFCislRW5kRFZJUFNCaXRtYXBGb250CislRFZJUFNCaXRtYXBGb250OiBGbyBlY3JtMDkwMCA5IDMwCisvRm8gMzAgMTIyIGRmPDE0QzAxMzAxRUIwMzgwRUIwRjAwMTMwRTVCMTMzQzVCNUJBMjQ4NUE0ODVBQTIxMjA3NUIxMjBGOTAKK0M3RkM1QUEyMTIxRTEyM0VBMzEyM0MxMjdDQTU1QUIwMTI3Q0E1MTIzQzEyM0VBMzEyMUUxMjFGQTI3RTdGMTIwNzdGMTIwMworQTI2QzdFNkM3RUEyMTM3ODdGMTMxQzdGMTMwRkVCMDM4MEVCMDFDMDEzMDAxMjRBNzlCNzFFPjQwCitEPDEyQzA3RTEyNzAxMjNDMTIxQzdFMTIwRjZDN0U2QzdFQTI2QzdFNkM3RUEyN0YxMzc4MTM3QzEzM0MxMzNFQTIxMzFFMTMKKzFGQTM3RjE0ODBBNUVCMDdDMEIwRUIwRjgwQTUxNDAwNUJBMzEzMUUxMzNFQTIxMzNDMTM3QzEzNzgxM0Y4NUJBMjQ4NUE0OAorNUFBMjQ4NUE0OEM3RkMxMjBFNUExMjNDMTI3MDVBNUExMjRBN0NCNzFFPkk8MTIzQzEyN0UxMkZGQTQxMjdFMTIzQzA4MDgKKzdBODcxNT40NiBEPEI1MTJGRUEzMDAwMTEzMDA2QzVBQjNCM0E3NDg3RUI1MTJGRUEzMTczMzdFQjIxQz43MworRDxCNTEyRkVBM0Q4MDNGRUM5RkM2QzVBQjNBOUVFMDE4MEE0MTYwMzE3MDBBNDVFQTI1RTVFNUU1RTE2RkUwMDAzMTQwN0I3CitGQ0EzMjkzMzdEQjIzMD43NiBEPEVDMDdGQzkxMzg3RkZGQzA5MDM5MDFGQzA3RjA5MDM5MDdFMDAwRkNEOTBGODAxMzNFMDEKKzNGQzc2QzdFMDE3RTZFN0U0OTZFN0U0ODQ4NkU3RTQ4NDg2RTdFQTI0ODQ4NkU3RTAwMEY4MjQ5MTU3RTAwMUYxNjdGQTI0OAorNDhFRDNGODBBMjAwN0YxN0MwQTI5MEM5MTIxRkEyNDgxN0UwQUI2QzE3QzA2RDE1M0ZBMzAwM0YxNzgwNkQxNTdGQTIwMDFGCisxNzAwNkQ1RDAwMEY1RTZDNkM0QTVBQTI2QzZDNEE1QTAwMDE1RTZDNkM0QTVBMDE3RTRBNUE2RDRBNUFEOTFGQzAwMTdGQzcKK0ZDRDkwN0UwMTNGQzkwMzkwMUZDMDdGMDkwMzkwMDdGRkZDMERBMDdGQ0M4RkMzMzM3N0NCNDNDPjc5CitEPDkwMzgxRkUwMDM5MDM4N0ZGQzA3NDhCNUZDMzkwN0YwMUZDRjM5MEY4MDAzRkY0OEM3RkMwMDNFODA4MTQ4ODBBMjAwNzgKKzgwMDBGODgwQTQ2QzgwQTI3RTkyQzdGQzEyN0YxM0MwRUEzRkYwMTNGRjZDMTNGMDZDMTNGRjZDMTRDMDZDMTRGMEM2ODAwMQorM0Y3RjAxMDM3RjkwMzgwMDNGRkYxNDAzMDIwMDEzODAxNTdGMTUzRkVEMUZDMDE1MEYxMkMwQTIxNTA3QTM3RUEyNkNFQzBGCis4MEEyNkMxNTAwNkM1QzZDMTQzRTZDMTQ3RTAxQzA1QjM5RjFGQzAzRjgwMEUwQjUxMkUwMDExRjEzODAyNkMwMDNGRUM3RkMKKzIyMzc3Q0I0MkI+ODMgRDwwMDdGQjcxMkZFQTM5MDM5ODAwN0YwMDFEODdDMDBFQzAwM0UwMDc4MTYxRTAwNzAxNjBFQTIwMAorNjAxNjA2MDBFMDE2MDdBMzQ4MTYwM0E2QzcxNTAwQjNBQjRBN0UwMTFGQjUxMkZDQTMzMDMzN0RCMjM3Pkk8QjVEOEYwMDcKK0I1Mzk4MDBGRkZGMEEzMDAwMzkwQzcyNzNGRjAwMDAxMTMwMEQ4MDFGQzZFNDhFQjAwN0MxQTM4NkQxNDBGMDAwMDE5MzA4MworNkQwMjA3MTU3MDZEMTg2MEEyNkU0OTZDMTRFMDAxM0Y2MEEyNkVEOTE5RkMxMzAxMDExRjYwQTI2RUQ5MzBGRTEzMDMwMTBGCis5NUM3RkNBMjZFRDk2MDdGNUIwMTA3MTcwNkEyNkU5MDM5QzAzRjgwMEUwMTAzMTcwQ0EyOTEzQkZDMDE4MDFGQzAxQzAxMDEKKzE3MThBMjkxM0JGRTAzMDAwRkUwMzgwMTAwMTczMEEyREFGRjA2RUIwN0YwMDI3RjVFQTIwMzhDRUIwM0Y4MDIzRjVFQTIwMworRDhFQjAxRkMwMjFGRURGRDgwQTIwM0YwRUIwMEZGMDIwRjkzQzhGQ0EyNEI4MDAyMDcxNTdFQTI0QjE0M0UwMjAzMTUzQ0EyCis0QjE0MUMwMjAxMTUxODRDMzU3RkIyNEY+ODcgRDxFQjdGODAzODAzRkZGMDM4MEY4MEZDMzgxQzAwM0UwMDNGMTMzRjZENkMKKzdFNkU3RUEyNkU3RUVBMUYwMEM3RkNBNEVCMDFGRjEzMUZFQkZGODczODAzRkMwN0VBMEZGMEVBMUZDMEVBM0Y4MDEyN0YxMworMDA0ODE1QzA1QUEzMTQwRkEyNkMxMzFGNkMxMzNCM0EzRjgwNzFGMTgwMzkxRkMxRTFGRjI2MDdGRkMwMTMwMDM5MDBGRTAwCiszQzIyMjM3REExMjY+OTcgRDxFQTAzRjAxMkZGQTMxMjA3MTIwM0FFRUMzRjgwRUNGRkUwOTAzOEYzQzBGODkwMzhGNzAwN0UKKzAxRkU3RjQ5RUIxRjgwNDlFQjBGQzA1QkVEMDdFMDE2RjBBMjE1MDMxNkY4QUExNkYwMTUwNzE2RTBBMkVEMEZDMDdGNkRFQgorMUY4MDAxRUNFQjNGMDAwMUNGMTM3QzkwMzg4MzgxRjg5MDM4MDFGRkUwQzc2Q0M3RkMyNTM1N0VCMzJCPkk8RUIwN0Y4RUIKKzNGRkY5MDM4RkMwN0MwMzkwMUYwMDBFMDM5MDNFMDAzRjAzODA3QzAwNzEyMEZFQTFGODAxMjNGOTAzODAwMDNFMDQ4OTBDNworRkNBMjEyN0UxMkZFQUExMjdGQTI2QzE0MTg3RjAwMUYxNDM4NkQxMzMwMDAwRjE0NzA2QzZDMTNFMDM5MDNGMDAxQzAzOTAwCitGQzBGODA5MDM4M0ZGRTAwRUIwN0YwMUQyMzdFQTEyMj5JPDE1M0ZFQzBGRkZBM0VDMDA3RjgxQUVFQjA3RjBFQjNGRkNFQgorRkMwRjM5MDFGMDAzQkYzOTA3RTAwMUZGNDg0ODdFNDg0ODdGODE0OEM3RkNBMjVBMTI3RTEyRkVBQTEyN0UxMjdGQTI3RTZDCis2QzVCQTI2QzZDNUI2QzZDNDgxMzgwM0EwM0YwMDdCRkZDMzkwMEY4MUUzRkVCM0ZGQ0Q5MEZFMDEzMDAyNjM1N0RCMzJCPgorSTxFQjBGRTBFQjdGRkNFQkY4M0YzOTAzRjAwRjgwRDgwN0UwMTNDMDM5MEZDMDA3RTAzODFGODAwMzE1RjBFQTNGMDAxNDAxCis0ODE0RjgxMjdFQTIxMkZFQTJCNkZDQTI0OEM4RkNBNTEyN0UxMjdGQTI2QzE0MThBMjZDNkMxMzM4MDAwRjE0MzA2RDEzNzAKKzZDNkMxM0UwMzkwMUYwMDNDMDM5MDBGQzBGMDBFQjNGRkVFQjA3RjAxRDIzN0VBMTIyPkk8RUIwMUZDRUIwN0ZGOTAzODFGCiswNzgwOTAzODNFMEZDMEVCN0MxRjEzRkNFQTAxRjhBMjAwMDNFQjA3MDA0OUM3RkNBQ0I1MTJGMEEzRDgwM0YwQzdGQ0IzQTcKKzQ4N0UzODdGRkZFMEEzMUEzNTdGQjQxNz5JPDE1MUY5MDM5MUZDMDdGODA5MDM5RkZGOEUzQzAzOTAxRjA3RkM3MzkwN0UwCiszRjAzM0EwRkMwMUY4MzgwOTAzOTgwMEY4MDAwMDAxRjgwRUIwMDA3NDg4MEE2NkM1Q0VCODAwRjAwMEY1Q0VCQzAxRjZDNkMKKzQ4QzdGQ0VCRjA3QzM4MEVGRkY4MzgwQzFGQzAwMDFDQzlGQ0EzMTIxRUEyMTIxRjM4MEZGRkZFRUNGRkMwNkMxNEYwNkMxNAorRkM0ODgwMzgxRjAwMDEwMDNFRUIwMDdGNDg4MEVEMUY4MDQ4MTQwRkE1NkMxNDFGMDA3QzE1MDA2QzE0M0U2QzVDMzkwRkMwCiswMUY4MzkwM0YwMDdFMEM2QjUxMjgwRDkxRkZDQzdGQzIyMzM3RUExMjY+STxFQTAzRjAxMkZGQTMxMjA3MTIwM0FFRUMxRgorQzBFQzdGRjA5MDM4RjFFMEZDOTAzOEYzODA3QzkwMzhGNzAwN0UxM0ZFNDk3RkEyNUJBMjVCQjM0ODZDRUI3RjgwQjUzOEM3CitGRkZDQTMyNjM0N0VCMzJCPkk8RUEwNzgwRUEwRkMwRUExRkUwQTRFQTBGQzBFQTA3ODBDN0ZDQUFFQTA3RTAxMkZGQTMxMgorMEYxMjA3QjNBNkVBMEZGMEI1RkNBMzEwMzM3RUIyMTU+STxFQjAzQzBFQjA3RTBFQjBGRjBBNEVCMDdFMEVCMDNDMDkwQzcKK0ZDQUFFQjAzRjAxM0ZGQTMxMzA3MTMwM0IzQjAxMjM4MTI3QzAwRkUxM0UwMTMwNzE0QzAxMzBGMDA3QzEzODAzODM4MUYwMAorRUExRkZDRUEwN0YwMTQ0Mzg0QjIxNz5JPEVBMDdFMDEyRkZBMzEyMEYxMjA3QjNCM0E3RUEwRkYwQjVGQ0EzMTAzNDdFQjMKKzE1PjEwOCBEPDI3MDNGMDFGRTAxM0ZGMDBGRjkwMjY3RkY4MDMxM0MwOTAzQkYxRTA3QzBGMDNFMDkwM0JGMzgwM0UxQzAxCitGMDI4MDdGNzAwM0YzODdGRDgwM0ZFMTQ3MDQ5NkQ0ODZDN0VBMjQ5NUNBMjQ5NUNCMzQ4NkM0OTZDNDg3RUI1M0JDN0ZGRkUKKzNGRkZGMEEzM0MyMTdFQTA0MT5JPDM5MDNGMDFGQzAwMEZGRUI3RkYwOTAzOEYxRTBGQzkwMzhGMzgwN0MzOTA3RjcwMDdFCitFQTAzRkU0OTdGQTI1QkEyNUJCMzQ4NkNFQjdGODBCNTM4QzdGRkZDQTMyNjIxN0VBMDJCPkk8RUIwN0YwRUIzRkZFOTAzOAorRkMxRjgwMzkwMUYwMDdDMDM5MDNDMDAxRTAwMDA3ODA0ODQ4NkM3RTQ4QzcxMjdDQTI0ODE0N0UwMDNFMTQzRTAwN0UxNDNGCitBMzAwRkUxNTgwQTgwMDdFMTUwMEEzNkMxNDdFQTI2QzE0N0M2RDEzRkM2QzZDNDg1QTAwMDc1QzM5MDNGMDA3RTAzOTAwRkMKKzFGODBEOTNGRkVDN0ZDRUIwN0YwMjEyMzdFQTEyNj5JPDM5MDNGMDNGODAwMEZGRUJGRkUwOTAzOEYzQzBGODkwMzhGNzAwCis3RUQ4MDdGRTdGNkM0OEVCMUY4MDQ5MTRDMDQ5MTMwRjE2RTBFRDA3RjBBM0VEMDNGOEE5MTUwNzE2RjBBMjE2RTAxNTBGMTYKK0MwNkQxMzFGNkRFQjNGODAxNjAwMDFGRjEzRkM5MDM4RjM4MUY4OTAzOEYxRkZFMEQ5RjA3RkM3RkM5MUM4RkNBQTQ4N0VCNQorMTJDMEEzMjUzMDdFQTAyQj5JPDM4MDNFMDdDMzhGRkUxRkY5MDM4RTM4RjgwOTAzOEU3MUZDMEVBMDdFRUVBMDNFQ0EyOTAKKzM4RkMwRjgwNDlDN0ZDQTM1QkIyNDg3RUI1MTJFMEEzMUEyMTdGQTAxRT4xMTQgRDxFQkZGMDYwMDA3MTNDRTM4MUYwMEZFCiswMDNDMTMzRTQ4MTMxRTE0MEU1QTE0MDZBMjdFQTIwMEZFOTBDN0ZDNkM3RUVBN0ZGQzM4M0ZGRkMwMTRGMDAwMEY3RjZDN0YKK0M2N0ZFQjBGRkYxMzAwRUMzRjgwMDBDMDEzMUYxNDBGNkMxMzA3QTM3RTE1MDA2QzVCNkMxMzBFNkM1QjM4Rjc4MDc4MzhFMQorRkZFMDM4QzA3RjgwMTkyMzdFQTExRT5JPDEzMzBBNTEzNzBBMzEzRjBBMjEyMDFBMjEyMDMxMjA3MzgxRkZGRkVCNUZDQTIKKzM4MDNGMDAwQUYxNDAzQTgxNDA3MzgwMUY4MDZBMjM4MDBGQzBFRUI3RTFDRUIxRkY4RUIwN0UwMTgyRjdGQUQxRT5JPEQ4CiswM0YwMTMzRjAwRkZFQjBGRkZBMzAwMDdFQjAwN0YwMDAzODBCMzVEQTM1RDEyMDE2RDQ4MTM4MDAwMDA5MDM4MDNCRkZDOTAKKzM4N0UwNzNGRUIxRkZFRDkwN0Y4MTMwMDI2MjI3RUEwMkI+STxCNTNBMUZGRjgxRkZGMEEzM0MwN0Y4MDFGQzAwM0Y4MDAxCitGMDQ5RUIxRTAwMDAwMzAxMDAxNDFDODE2QzZDMDE3QzEzMThBMjZEMDE3RTEzMzgwMDAwMDJGRTEzMzBBMjkwMjY3RTAxRkYKKzVCMTU5RjE2ODA5MDI2M0YwMzBGNUJBMjE2QzA5MDNBMUY4NjA3QzE4MEEyMDJDNjEzRTM5MDI2MEZDQzAzOTBDN0ZDQTJEOQorMDdGQzEzRjZFQ0Y4MDExNkZFNkQ0ODZDNUFBMzZENDgxMzc4QTM2RDQ4MTMzMDM0MjE3RjlGMzc+MTE5CitEPDNBN0ZGRjgwN0ZGOEEzM0EwN0Y4MDAxRkMwMDAwM0VDMEY4MDAwMDFFQzA3MDAxNTA2NkM2QzVCQTI2RDEzMUMwMTdFMTMKKzE4QTI2RDVCQTJFQzgwNzAwMTFGMTM2MEVDQzBFMDAxMEY1QkEyOTAzODA3RTE4MEEyMTRGMzAxMDM5MEM3RkMxNEZCRUIwMQorRkVBMjZENUFBMzE0NzhBMjE0MzBBMjVDQTIxNEUwNUNBMjQ5NUExMjc4RDhGQzAzQzhGQ0EyMTMwNjEzMEVFQTcwMUNFQTc4CiszOEVBMUZGMEVBMEZDMDI1MzA3RjlGMjk+MTIxIEQgRQorJUVuZERWSVBTQml0bWFwRm9udAorJURWSVBTQml0bWFwRm9udDogRnAgZWNieDA5MDAgOSA3CisvRnAgNyAxMTcgZGY8RUQxRjgwQTI0QjdFQTI0QjdFQTM0QjdFQTI0QTdGQTM0QTdGQTI0QTdGMTVDRkEyMDIwRjdGMTU4NworMDIxRjgwMTUwMzAyM0Y4MEVDM0UwMUEyMDI3RTgwRUM3QzAwMDJGQzgwNEExMzdGQTIwMTAxODE0QTEzM0YwMTAzODE0QTEzCisxRkEyNDlCNjdFQTI0OTgxQTI5MDI3MUY4MDAwMDc3RjkxQzc3RUEyNDk4MjAxM0U4MDAxN0U4MjAxN0M4MEEyMDFGQzgyNDkKKzE1N0ZCNTAwRjAwMTNGQjUxMkYwQTQzQzM0N0RCMzQzPjY1IEQ8RUI3RkZFMDAwM0I1MTJFMDQ4MTRGODM5MEZGMDBGRkMzOQorMUZGODAzRkY4MDZFMTM4MDE2QzAxNTdGNkM1QTZDNUFFQTAxODBDOEZDRUM3RkZGMDEwRkI1RkM5MEI2RkMwMDAzRUJGMDdGCiswMDBGMTMwMEVBMUZGODQ4NUE0ODVBNDg1QTVCQTMxNUZGN0YwMDdGNUI2RDQ4MTNFMDNBM0ZGODBGQkZGRjAwMEZCNTEyMUYKKzAwMDNFQkZDMEYzOTAwN0ZFMDA3MjgyMTdFQTAyQj45NyBEPEVBMDFGQzEyRkZBNDEyMEYxMjA3QURFQzBGRjhFQzdGRkYwMQorRkRCNTEyQzA5MDM5RkZGMDFGRjA5MTM4ODAwRkY4NEE2QzdFNDk2RDdFNDk2RDdFQTIxNzgwODFBMjE3QzBBOTE3ODBBMjVECisxNzAwQTI2RDQ5NUE2RDQ5NUE2RTQ4NUE5MDM5RjdFMDNGRjAwMUUxQjUxMkMwRDlDMDdGOTBDN0ZDOTAzODgwMUZGMDJBMzQKKzdEQjMzMT5JPDkwMzgwN0ZGODAwMTNGMTNGMDkwQjUxMkZDMzkwM0ZFMDFGRTQ4NDg0ODdFRUEwRkY4RUExRkYwRUEzRkUwCitBMjAwN0Y2RDVBNDk2QzVBMTUzMDAwRkY5MUM3RkNBOTEyN0Y3RkEyMDAzRkVDMDc4MDdGNkM2QzEzMEYwMDBGRUMxRjAwRDgKKzA3RkUxMzNFMzkwM0ZGODBGQ0M2RUJGRkY4MDEzRjEzRTAwMTA3OTBDN0ZDMjEyMTdEQTAyNz5JPDM5MDFGODFGODAwMEZGCitFQjdGRjBFQ0ZGRjg5MDM4RjlFM0ZDOTAzOEZCQzdGRTM4MEZGRjg3NkMxMzA3QTIxM0ZFRUMwM0ZDRUMwMUY4RUMwMDYwNDkKKzEzMDBCMUI1MTJGMEE0MUYyMTdFQTAyND4xMTQgRDw5MDM4RkZFMUMwMDAwNzEzRkY1QTM4M0Y4MDNGMzg3RTAwMEYxNDA3Cis1QTE0MDM3RUEyNkM2Q0M3RkMxM0ZDRUJGRkUwNkMxM0ZDODA2Q0VCRkY4MDAwMEYxNEMwNkMxNEUwQzZGQzAxMEYxM0YwRUIKKzAwN0YxNDBGMDBGMDEzMDcxNDAzN0VBMjZDMTRFMDZDMTMwNzZDRUIwRkMwOTAzOEMwMUY4MDkwQjUxMjAwMDBGOTEzRkMzOAorRTAzRkUwMUMyMTdEQTAyMz5JPDEzM0NBNTEzN0NBMzEzRkNBMjEyMDFBMjEyMDMxMjA3MDAxRkI1MTI4MEI2RkNBM0Q4MDcKK0ZDQzdGQ0IwRUMwM0MwQTc5MDM4RkUwNzgwMTIwMzM5MDFGRjBGMDA2QzEzRkVFQjNGRkNFQjBGRjAxQTJGN0VBRTIyPkkKK0UKKyVFbmREVklQU0JpdG1hcEZvbnQKKyVEVklQU0JpdG1hcEZvbnQ6IEZxIGVjc3MwOTAwIDkgMjYKKy9GcSAyNiAxMjIgZGY8MTJGRUE3MDcwNzc5ODYxNT40NiBEPDE1NzAxNUY4QTIxNDAxMTVGMEEyMTQwMzE1RTBBMjE0MDcxNQorQzBBMjE0MEYxNTgwQTIxNDFGMTUwMEEyNUMxNDNFQTIxNDdFMTQ3Q0EyMTRGQzVDQTIxMzAxNUNBMjEzMDM1Q0EyMTMwNzVDCitBMjEzMEY1QzEzMUY5MUM3RkNBMjVCMTMzRUEyMTM3RTEzN0NBMjEzRkM1QkEyMTIwMTVCQTIxMjAzNUJBMjEyMDc1QkEyMTIKKzBGNUJBMjEyMUY5MEM4RkNBMjVBMTIzRUEyMTI3RTEyN0NBMjEyRkM1QUEyMTI3MDFENEI3Q0I3MjY+STwxMzAzNUIxMzFGCisxMzdGRUEwN0ZGQjVGQ0EzMTNCRkVBRjgzRjEyMDBCM0IyMDA3RkI1MTI4MEE1MTkzMzdBQjIyNj40OQorRDxFQjNGRTBFQkZGRjgwMDAzMTNGRTQ4N0Y0ODE0ODAzOTFGQzA3RkMwOTAzODgwMUZFMDM5M0YwMDBGRjAwMDNFMTMwNzQ4CitFQjAzRjhBMjQ4MTMwMTE1RkMxMjc4MTIzMDE0MDAxMjEwQzhGQzE0MDFBMjE1RjhBMjE0MDMxNUYwMTQwNzE1RTBFQzBGQzAKKzE0MUYxNTgwRUMzRjAwMTQ3RTVDNDk1QTQ5NUE0OTVBRUIwRjgwNDlDN0ZDMTMzRTVCNUI0ODVBNDg1QTQ4NUE0ODVBNDhDOAorRkMxMjNFMDA3RkI1MTJGQ0E1MUUzMzdEQjIyNj5JPDEyRkVBNzEyMDBCMzEyRkVBNzA3MjE3OUEwMTU+NTgKK0Q8RUMwN0Y4RUM3RkZGNDlCNTEyQzAwMTA3ODA0OTgwOTAzOTFGRjgwRkY4OTAzOTdGQzAwM0ZDOTAzOEZGODAwMDQ4NDhDNworN0U0OTE0N0U0ODQ4RUI3RTdGM0EwN0YwMDFGRkJGMjYwRkUwMDcxM0ZGNDk0ODE0ODAwMDFGNUI5MDM4ODAzRkMzMDAzRjQ5CitDNkZDRDkwMDdFMTM3RjRBRUIzRkMwMTI3RTQ5NDgxMzFGQTIxMkZFNDg0ODQ4MTMwRkFBNkM2QzZDRUIxRjgwMTI3RUEyNkQKKzZDRUIzRjAwN0UwMjdFMTM3RUQ5ODA3RjEzRkUwMDFGOTAzODNGQzNGQzZENkNCNDVBMDAwRjZENUI2RDZDNUIyNjA3RjAwMQorMTM4MDI3MDNGODAwN0VDN0ZDNkM2QzkwQzhGQzdGNkM2QzZDRUIwRkMwNkQ2Q0VCM0Y4MDkwM0ExRkY4MDNGRjAwNkRCNTVBCis2RDE0RjgwMTAxNUM2RDZDMTM4MERBMDdGQ0M3RkMyQTM4N0NCNjMzPjY0IEQ8RUIzRkMwMzgwM0ZGRjAwMDBGMTNGQzQ4N0YKKzgwOTAzOEMwN0Y4MDM4MUUwMDFGMDAxODE0QzAwMDEwMTMwRkM3MTNFMDE0MDdBNkVCMDNGRjEzM0Y0OEI1RkMxMjA3MDAxRgorMTNDNzM4M0ZGMDA3RUE3RjgwRUE3RTAwNUFBMzE0MEY3RTAwN0YxMzNGRUJDMEZGOTBCNUZDN0U2QzEzRTc2QzEzODdEODAzCitGQ0M3RkMxQjI0N0RBMjI1Pjk3IEQ8RUIwRkY4RUIzRkZGOTBCNTEyRTA0ODE0RjA1QTM4MDdGODA3MzkwRkUwMDFFMDM5MUYKK0MwMDA2MDQ5MTMwMDQ4QzhGQ0EyMTI3RUEzNUFBOTEyN0VBMzZDMTQxMDZEMTMzMDAwMUYxNEYwMzgwRkUwMDFFQkY4MEY2QworQjVGQzZDMTRFMEM2MTQ4MDkwMzg3RkZFMDBFQjBGRjAxQzI0N0RBMjIyPjk5IEQ8MTVGQ0IzQTJFQjNGODBFQkZGRjAwMDAzCisxM0ZDNDgxM0ZFNDgxM0ZGRUJGODFGMzgxRkUwMDczODNGQzAwMTEzODA0OEM3RkMxMjdFQTM1QUE5MTI3RUEzMDA3RjEzMDEKK0VBM0Y4MDE0MDMzODFGRTAwNzM4MEZGODFGOTBCNUZDNkMxM0ZDNkMxM0Y4QzYxM0UwOTAzODNGODAwMDFFMzc3REI1Mjg+CitJPEVCMUZDMEVCN0ZGODQ4NDg3RTQ4N0Y0ODdGMzkwRkYwN0Y4MDM4MUZDMDFGOTAzODgwMDdDMEVBM0YwMEVDMDNFMDAwN0UKKzEzMDFBMjEyN0MwMEZDRUIwMEYwQjZGQ0E1MDBGOEM4RkNBMjdFQTIxMjdDMTI3RUEyN0U2RDEzMTA2QzZDMTM3MDM5MEZFMAorMDFGMEVCRjgwRjZDQjVGQzZDMTRFMEM2MTQ4MDkwMzg3RkZFMDBFQjBGRjAxQzI0N0RBMjIyPkk8RUIwMUZDRUIwN0ZGMTMKKzFGNUI1QkVCRkUwN0VCRkMwMTM4MDFGODAwNUJBMjEyMDNBQ0I1MTJGMEE1MzgwM0YwMDBCM0FBMTgzNzdGQjYxNz5JPDkwCiszOTFGQzAwRjgwOTAzODdGRjBGRjkwQjYxMkMwNUE1QTI2MDdGMDdGQzdGQzM5MEZDMDFGODBFQjgwMEZBMjQ4NDg2QzdFQTcKKzZDNkM0ODVBQTJFQkMwMUYyNjA3RjA3RkM3RkNFQkZGRkU0ODVCNUM0ODZDNUFFQjFGQzA5MEM5RkNBMzdGMzgwRkZGRkVFQworRkZFMDZDODA0ODE0RkM0ODgwNUEzOTdGODAwM0ZGMDA3RUM3N0UwMEZFRUMzRjgwNDgxNDFGQTQ2QzE0M0YwMDdGRUM3RjAwCis2RDVCMzkzRkYwMDdGRTZDQjU1QTZDNUMwMDAzMTRFMEM2MTQ4MEQ5MUZGQ0M3RkMyMjMzN0VBMTI2Pkk8MTJGQ0IzQTJFQgorMDdGMEVCM0ZGRTQ5N0U5MEI1MTI4MEI2RkM5MDM4RTA3RkMwRUI4MDFGOTAzODAwMEZFMEEyNDgxMzA3QTM1QUIzQTQxQjM2Cis3QUI1Mjg+STwxMkZFQTcxMjAwQUMxMjdFQjNBRjA3MzQ3QkIzMTM+STwxMkZDQjNBM0VDMEZGMEVDMUZFMEVDM0ZDMEVDN0YKKzgwRUNGRjAwNDk1QTQ5NUE0OTVBNDk1QTQ5NUE0OTVBNDk1QTQ5QzdGQzEyRkRCNTdFQTI4MEVCRTdFMDEzQzdFQjgzRjBFQgorMDFGODAwRkU3RkVBRkMwMDE0N0U4MDE1ODAxNDFGRUMwRkMwRUMwN0UwQTJFQzAzRjBFQzAxRjgxNUZDMUUzNjdBQjUyNj4KKzEwNyBEPDEyRkNCM0IzQjIwNjM2N0FCNTEzPkk8RDkwN0YwRUIzRjgwM0JGQzNGRkUwMUZGRjA0OTZDNDgxM0Y4OTBCNTAwCis4NzEzRkNCNjEyOUY5MDNBRTA3RkRGMDNGRTkwMzk4MDFGRkMwMDQ5NkM0ODEzN0ZBMjQ4NkQ0ODEzM0ZBMzQ4NUNCM0E0MzAKKzIyN0FBMTNEPkk8RUIwN0YwMzhGQzNGRkU0OTdFOTBCNTEyODBCNkZDOTAzOEUwN0ZDMEVCODAxRjkwMzgwMDBGRTBBMjQ4CisxMzA3QTM1QUIzQTQxQjIyN0FBMTI4Pkk8RUIwN0YwRUIzRkZFOTBCNTdFNDg4MDQ4ODAzOTA3RjgwRkYwMzkwRkUwMDNGOAorNDg0ODZDN0VFQjgwMDA0OEM3MTI3RUEyMDA3RTgwQTIwMDdDODAwMEZDMTU4MEE4NkMxNDNGMDA3RTE1MDBBMjAwN0Y1QzZDCisxNDdFNkQxM0ZFNkM2QzQ4NUE2QzZDNDg1QUVCRjgwRjZDQjU1QTAwMDExNEMwNkM1Q0Q5M0ZGRUM3RkNFQjA3RjAyMTI0N0UKK0EyMjY+STxFQjAzRjgzOEZDMUZGRUVCN0ZGRjAwRkRCNTEyODBCNjEyQzA5MDM4RTA3RkUwRUI4MDFGOTAzODAwMEZGMDQ4CisxMzA3NDhFQjAzRjhBMjE0MDExNUZDMTQwMEE4MTQwMTE1RjhBMjE0MDMxNUYwNkMxMzA3NkNFQjBGRTBFQjgwMUY5MDM4RTAKKzdGQzA5MEI1MTI4MDAwRkQxNDAwMDBGQzVCRUIzRkZDRUIwN0UwOTBDOEZDQUUxRTMxN0FBMTI4Pkk8RUIwM0MwRUFGODFGCisxMzNGMTNGRjEyRjkxMkZCRUJGQzAwRUFGRkYwMTNDMDVCOTBDN0ZDQTI1QUEzNUFCMzEyMjI3QUExMUE+MTE0CitEPEVCRkY4MDAwMDcxM0YwNDgxM0ZDNDg3RjVBRUE3RjAwMDA3RTEzMUM0ODEzMEM5MUM3RkNBNDdFRUE3RjgwMTNGODZDQjQKKzdFNkMxM0UwNkMxM0Y4MDAwMzdGQzY3RkVCMEZGRjEzMDBFQzNGODBBMjE0MUZBMzEyNDAwMDYwMTMzRjAwNzgxNDAwQjQxMworRkZFQkZGRkU1QzZDNUIwMDBGNUIwMDAxMTM4MDE5MjQ3RUEyMUQ+STxFQTAzRjBBQUI1MTJGRUE1MzgwM0YwMDBCM0EzN0YKKzE0MDIzODAxRkMxRTkwQjVGQ0EyN0VFQjdGRkNFQjNGQzAxODJDN0ZBQTFDPkk8MDBGQ0VCMDdFMEIzQTcxNDBGMTQxRjZDCisxMzNGNkMxM0ZGNkNCNUZDMTRGNzZDMTNFNzZDMTMwN0Q4MDdGOEM3RkMxQjIyN0FBMDI4Pkk8MDBGQ0Q5MDdGMEVCMUY4MAorN0UwMDdFMDEwRkVDM0YwMDgxMTU3ODZDMDExRjE0M0UxNzdFRUMxRTdDMjYxRjgwM0UxNDdDMDMzQzEzRkMxNTNFMDAwRjAxCiszQzVDRDlDMDdDMTMwMTE1MUUxNTFGMjYwN0UwNzg1QzAyRjgxMzAzRUQwRjgzMDAwMzVFRUJGMEYwMDFGMTE0ODcwMDAxOTEKKzM4MDdDN0MwMTRFMEEyMDFGQkVCMDNDRjAwMDA1RTAyQzAxM0VGMTUwMTAxN0I5MkM3RkNEOTdGODAxM0ZGQTIwMTNGNkQ1QQorOTFDN0ZDMzEyMTdGQTAzND4xMTkgRDwwMEZFMTQzRjAwN0UxNDdFQTI3RTE1RkM3RjAwMUZFQjAxRjgxM0MwMTIwRkVDMDMKK0YwRUEwN0UwMTVFMEVCRjAwNzEyMDMxNUMwMzgwMUY4MEYxNTgwMTIwMEVCRkMxRjE1MDAxMzdDRUI3RTNFMTMzRUEyRUIxRgorM0MxNDdDRUIwRjc4QTM2RDVBQTI2RDVBQTM1QzEzMDc1Q0EyMTMwRjkxQzdGQzVCMTMxRUVBMjAzRUVBMzg3Q0VBM0ZGQzVCCitBMjVCRUEwRkMwMjAzMTdGQTAyMz4xMjEgRCBFCislRW5kRFZJUFNCaXRtYXBGb250CislRFZJUFNCaXRtYXBGb250OiBGciBlY3JtMTAwMCAxMCA4MworL0ZyIDgzIDE4NCBkZjw0ODZDMTM2MDAwMDMxNEUwMzkwNzAwMDFDMDAwMEVFQjAzODA0OEVCMDcwMDAwMTgxMzA2MDAzODEzCiswRTAwMzAxMzBDMDA3MDEzMUMwMDYwMTMxOEEyMDBFMDEzMzg0ODEzMzBBNDAwQ0VFQjMzODAzOUZGODAzRkUwMDFDMDEzRjAKK0EzMDA3RjEzMUZBMjM5M0Y4MDBGRTAzOTBFMDAwMzgwMUMxOTgxQjkxQz4xNiBEPDAwMUMxMzA3MDA3RkVCMUZDMDM5RkY4MAorM0ZFMEEyMDFDMDEzRjBBMzAwN0YxMzFGMDAxQ0VCMDczMDAwMDAxMzAwQTQwMDAxMTQ3MDQ5MTM2MEEyMDAwMzE0RTA5MEM3CisxMkMwNDgxMzAxMDAwNjE0ODAwMDBFMTMwMzQ4RUIwNzAwNDgxMzBFNDg1QjAwNjAxMzE4MUMxOTgwQjkxQz5JPEJEMTJDMAorQTI1MjAyODA5NjUzPjIyIEQ8REEwRkY4MTNGQzkxMzk3RkZGMDdGRjkwM0IwMUY4MDdERjgzQzA5MDNBMDdFMDAxRkYwRjkwCiszQjFGODAwN0ZFMUZFMDkwMzkzRjAwMEZGQzEzN0UxNkY4NUI5MzM4RjAwNzgwNDg0ODAxMDc5MEM3RkMxNTAzQUNCODEyRjgKK0EzMjgwMUY4MDAwM0YwQzdGQ0IzQUI0ODZDNDk3RTI2N0ZGRkUwQjUxMkYwQTMzMzNCN0ZCQTMwPjI3CitEPEVDMEZGOEVDN0ZGRTkwMzkwMUY4MDc4MDkwMzkwN0UwMDFDMDkwMzkxRjgwMDBFMDkwMzgzRjAwMDcwMTdFNDk3RUEyNUIKK0EyNDg1QTZGNUFFRDAxODA5MkM4RkNBOUVEMDNGMEI3RkNBMzM5MDFGODAwMEYxNTAzQjNBQTQ4NkM0OTdFMjY3RkZGRTBCNQorMTJDMEEzMkEzQjdGQkEyRT5JPEVDMEZGQzkxMzg3RkZGNzA5MDM5MDFGODAzRjA5MDM4MDdFMDA3OTAzODFGODAwRkVCM0YKKzAwMTM3RUEyNUIxNTA3NDg0ODEzMDNBREI3RkNBMzM5MDFGODAwMDNCM0FCNDg2QzQ5N0UyNjdGRkZFMEI1MTJDMEEzMkEzQgorN0ZCQTJFPkk8REEwRkYwRUIxRkYwREE3RkZFRUJGRkZDOTAzQjAxRjgwRjgzRjAwRjkwM0MwN0UwMDFDRkMwMDM4MDkwM0MKKzFGODAwMEZGMDAwMUMwOTAyNzNGMDAwN0ZFMTMwRjAxN0U0OTQ4NDk3RUEyNDk1Q0EyNDg0ODVDMDMwNzZFNUEwMzAzMDIwMworQzdGQzk1QzhGQ0E5RjAwN0UwQkFGQ0EzM0MwMUY4MDAwM0YwMDAxRjE4MDdCM0FBNDg2QzQ5NkM0OTdFMjY3RkZGRTBCNTAwCitDMUI1MTI4MEEzNDEzQjdGQkE0NT5JPDEyMUMxMjdGRUFGRjgwQThFQTdGMDBBQjEyM0VBQjEyMUNBQkM3RkNBODEyMUMxMgorN0ZFQUZGODBBNUVBN0YwMDEyMUMwOTNDNzlCQjE3PjMzIEQ8MDA3QzEzN0MwMEZFMTNGRUVBRkYwMUEzRUFGRTAwQTcwMDdFCisxM0ZDMDA3QzEzN0NBODAwM0MxMzc4MDAzODEzMzhBNzAwMTgxMzMwMTcxRTc3QkEyQT5JPDEyMUMxMjdGRUFGRjgwQTIxMworQzBBMzEyN0YxMjFDMTIwMEE0MTIwMTEzODBBMjEyMDMxMzAwNUExMjA2MTIwRTVBNUE1QTEyNjAwQTE5NzlCOTE3PjM5CitEPDE0NjAxNEUwRUIwMUMwRUIwMzgwRUIwNzAwMTMwRTEzMUU1QjVCQTI1QjQ4NUFBMjQ4NUFBMjEyMDc1QjEyMEY5MEM3RkMKK0EyNUExMjFFQTIxMjNFQTM1QUE2NUFCMjEyN0NBNjdFQTMxMjFFQTIxMjFGN0VBMjdGMTIwNzdGMTIwM0EyNkM3RUEyNkM3RQorMTM3OEEyN0Y3RjEzMEU3RkVCMDM4MEVCMDFDMEVCMDBFMDE0NjAxMzUyNzhCRDIwPkk8MTJDMDdFMTI3MDdFN0U3RTEyMEYKKzZDN0U2QzdFQTI2QzdFNkM3RUEyMTM3OEEyMTM3QzEzM0MxMzNFMTMxRUEyMTMxRjdGQTIxNDgwQTNFQjA3QzBBNkVCMDNFMAorQjJFQjA3QzBBNkVCMEY4MEEzMTQwMEEyNUIxMzFFQTIxMzNFMTMzQzEzN0MxMzc4QTI1QkEyNDg1QTQ4NUFBMjQ4NUE0OEM3CitGQzEyMEU1QTVBNUE1QTVBMTM1MjdDQkQyMD5JPDEyMUMxMjdGRUFGRjgwQTIxM0MwQTMxMjdGMTIxQzEyMDBBNDEyMDExMworODBBMjEyMDMxMzAwNUExMjA2MTIwRTVBNUE1QTEyNjAwQTE5Nzk4ODE3PjQ0IEQ8QjUxMkZDQTUxNjA1N0Y5NDFDPkk8MTIKKzFDMTI3RkVBRkY4MEE1RUE3RjAwMTIxQzA5MDk3OTg4MTc+STwxNTA2QTIxNTBFMTUwQ0EyMTUxQzE1MTgxNTM4MTUzMEEyCisxNTcwMTU2MEEyMTVFMDE1QzBBMjE0MDExNTgwQTIxNDAzMTUwMDVDMTQwNkEyMTQwRTE0MENBMjE0MUMxNDE4QTIxNDM4MTQKKzMwQTIxNDcwMTQ2MDE0RTA1Q0EyMTMwMTVDQTIxMzAzOTFDN0ZDQTI1QjEzMDZBMjEzMEUxMzBDMTMxQzEzMThBMjEzMzgxMworMzBBMjEzNzAxMzYwQTIxM0UwNUJBMjEyMDE1QjEyMDM5MEM4RkNBMjVBMTIwNkEyMTIwRTEyMENBMjEyMUMxMjE4QTIxMjM4CisxMjMwMTI3MDEyNjBBMjEyRTA1QUEyMUY1MzdCQkQyQT5JPEVCMDNGOEVCMUZGRjkwMzg3RTBGQzA5MDM4RjgwM0UwMzkwMQorRTAwMEYwNDg0ODEzNzgwMDA3MTQ3QzQ4NDg3RkEyNDhDNzdFQTI0ODE1ODBBMzAwN0VFQzBGQzBBNTAwRkUxNUUwQjMwMDdFCisxNUMwQTQwMDdGMTQxRjZDMTU4MEEzNkMxNTAwQTI2QzZDMTMzRUEyNkM2QzVCNkM2QzVCRUJGMDAxMzkwMEY4MDNFMDkwMzgKKzdFMEZDMEQ5MUZGRkM3RkNFQjAzRjgyMzM5N0RCNjJBPkk8RUIwMUMwMTMwMzEzMDcxMzFGMTNGRkI1RkNBMjEzMUYxMjAwCitCM0IzQTc0OTdFMDA3RkI1MTJGMEEzMUMzNzc5QjYyQT5JPEVCMEZGMEVCN0ZGRTQ4QjU3RTM5MDNFMDNGRTAzOTBGMDAwRgorRjAwMDFFNkQ3RTAwMUM2RDdFNDg2RDdFNUE2RTdFMTI2MDEyRkU2Q0VDN0Y4MDdGQTU2Q0M3RkMxMjFDQzhGQ0VERkYwMEEyCis1RDE0MDE1RDE0MDM1RDRBNUE0QTVBNUQ0QTVBNEFDN0ZDMTQ3RTVDNDk1QTE0RTA0OTVBNDk1QTQ5QzhGQzAxMUVFQjAxODAKKzVCNUI0OTEzMDM0ODQ4MTQwMDQ4NUE0ODVBOTBDNzVBNDhCNkZDNUE1QTQ4NUNCNkZDQTMyMTM3N0NCNjJBPkk8RUIwN0Y4CitFQjNGRkY5MEI1MTJDMDM5MDFGODBGRjAzOTAzQzAwN0Y4NDg0ODZDN0UzOTBFMDAwMUZFRUEwRjgwMzkxRkUwMDBGRjdGQTUKKzZDNUE2QzVBQzc0ODVBQTI1RDE0MDM1RDRBNUE1REVDMEY4MDAyN0ZDN0ZDRUIxRkZDRUNGRjgwOTAzODAwMEZFMDZFN0VFQworMDFGQzgxNkU3RUVEN0Y4MEEyMTZDMEEyMTUzRjE2RTBBMjEyMUVFQTdGODBBMjQ4N0VBMzE2QzAxNTdGNDkxNDgwMDA3RUM3CitGQzAwNzBFQ0ZGMDA2QzQ5NUExMjFFMzkwRjgwMDNGODM5MDdGMDBGRjAwMDAxQjUxMkMwNkM2QzkwQzdGQ0VCMEZGODIzMzkKKzdEQjYyQT5JPDE1MzhBMjE1NzgxNUY4QTIxNDAxMTQwMzE0MDdBMjE0MEYxNDFGMTQxQjE0MzMxNDczMTQ2MzE0QzMxMzAxCisxNDgzRUIwMzAzMTMwNzEzMDYxMzBDMTMxQzEzMTgxMzMwMTM3MDEzNjAxM0MwMTIwMUVBMDM4MDEzMDA1QTEyMEUxMjBDNUEKKzEyMzgxMjMwNUExMkUwQjcxMkY4QTNDNzM4MDNGODAwQUE0QTdFMDEwM0I1MTJGOEEzMjUzODdFQjcyQT5JPDAwMDYxNDBDCitEODA3ODAxMzNDOTAzOEYwMDNGODkwQjVGQzVENUQxNTgwOTJDN0ZDMTRGQzM4MDY3RkUwOTBDOUZDQUFFQjA3RjhFQjFGRkUKKzkwMzg3ODBGODA5MDM4RTAwN0UwMzkwN0MwMDNGMDQ5NkM3RTEzMDAwMDA2NkQ3RTgxQzhGQzgxODFBMjE2ODBBNDEyMUMxMgorN0Y1QTdGQTM5MEM3MTMwMDVEMTJGQzAwNjA1QzEyNzA0QTVBNkM1QzZDMTMwMzAwMUU0OTVBNkM2QzQ4NUEzOTA3RTAzRjgwCiswMDAxQjVDN0ZDMzgwMDdGRkNFQjFGRTAyMTM5N0NCNjJBPkk8RUMzRkMwOTAzODAxRkZGMDAxMDcxM0ZDOTAzODBGRTAzRQorOTAzODNGODAwNzkwMzg3RTAwMUY0OUVCM0Y4MDQ4NDgxMzdGNDg1QTEyMDc1QjAwMEZFQzNGMDA0OTEzMUUwMDFGOTFDN0ZDCis1QjEyM0ZBMzEyN0Y5MEM5RkNFQjAxRkM5MDM4MDdGRjgwMzlGRjFFMDdFMDkwMzgzODAxRjA0OTZDN0UwMTYwN0YwMUUwMTMKKzdFNDk3RjE2ODA1QkVEMUZDMEEzOTBDNzEzRTBBNTdFQTQ3RjEyM0YxNkMwQTIwMDFGRUMzRjgwN0YwMDBGMTUwMDZENUIwMAorMDcxNEZFNkM2QzVCNkM2QzQ4NUEzOTAwRkUwN0YwOTAzODdGRkZDMDAxMUY5MEM3RkNFQjAzRkMyMzM5N0RCNjJBPkk8MTIKKzMwMTIzODEyM0UwMDNGQjYxMkUwQTMxNkMwNUExNjgwMTYwMDAwNzBDNzEyMDYwMDYwMTQwRTVENUQwMEUwMTQzMDQ4MTQ3MAorNUQ1REM3MTIwMTRBNUE0QUM3RkMxNDA2MTQwRTVDQTI1QzE0NzgxNDcwMTRGMDVDMTMwMUEyMTMwMzVDMTMwN0EyMTMwRkEzCisxMzFGNUNBMjEzM0ZBNTEzN0ZBOTZEQzhGQzEzMUUyMzNBN0JCNzJBPkk8RUIwM0Y4RUIxRkZGMDE3RjEzQzA5MDM4RkMwNworRjAzOTAxRTAwMUY4MzkwM0MwMDA3QzQ4NDgxMzNDOTBDNzEyM0U0ODE0MUUwMDBFMTQxRjAwMUU4MEEzMTIxRkEyNkQ1QjZECisxMzFFN0ZEODBGRjg1QjZEMTM3QzAxRkYxMzc4NkM2RDVBNkNFQkUzRTBFQ0Y3ODBDNjAxRkZDN0ZDNkQ1QTZENkM3RTAxMEYKKzEzRTAwMTNGN0YwMUY5N0YzOTAxRTA3RkZFNDg0ODZDN0UzODBGODAwRjQ4NDg2QzEzODAwMDFFMDEwMTEzQzA0ODdGMDA3QworMTQzRjAwNzhFQzFGRTAxNTBGMDBGODE0MDc0ODE0MDNBMjE1MDFBMzZDMTVDMEEyMDA3ODE0MDMwMDdDMTU4MDZDMTQwNzZDCitFQzBGMDA2QzZDMTMxRUQ4MDdFMDEzN0MzOTAzRjgwM0YwQzZCNTVBMDEzRjEzODBEOTA3RkNDN0ZDMjMzOTdEQjYyQT5JPAorRUIwM0Y4RUIxRkZGMDE3RjEzQzAzOTAxRkMwN0UwNDg0ODZDN0UzOTA3RTAwMUY4MDAwRjZEN0U0ODQ4MTM3RTVCMDAzRjgwCitBMjQ4QzcxMzgwQTI1QUVEMUZDMEE1MTZFMEE1NkMxNDNGQTM2QzdFMTU3RjEyMUY2QzZDMTNGRjZDNkMxM0RGMDAwMzEzMDEKKzM5MDFGMDAzOUYzOTAwRkMwRjFGRDkzRkZDMTNDMEVCMDdGMDkwQzdGQ0EyMTUzRjE2ODBBMjE2MDA1RDEyMEY0ODZDMTM3RQorNDg2QzVCQTI0QTVBNEE1QTQ5NDg1QTM4MUYwMDBGMDAxQ0VCMUY4MDI2MEY4MDdGQzdGQzM4MDdGRkZFMDAwMTEzRjgzODAwCiszRkMwMjMzOTdEQjYyQT5JPDEyMUMxMjdGRUFGRjgwQTVFQTdGMDAxMjFDQzdGQ0IyMTIxQzEyN0ZFQUZGODBBNUVBN0YwMAorMTIxQzA5MjQ3OUEzMTc+STwxMjFDMTI3RkVBRkY4MEE1RUE3RjAwMTIxQ0M3RkNCMjEyMUMxMjdGRUFGRjgwQTIxM0MwQTMKKzEyN0YxMjFDMTIwMEE0MTIwMTEzODBBMjEyMDMxMzAwNUExMjA2MTIwRTVBNUE1QTEyNjAwQTM0NzlBMzE3Pkk8RUIzRkUwCiszODAxRkZGRTM5MDdDMDNGODAzOTBFMDAwRkMwMDAzQ0VCMDdGMDAwMzAxMzAzMDA3MDE0RjgwMDdDMTMwMTAwRkUxNEZDN0UKK0E0MTI3RTAwM0NFQjAzRjhDN0ZDRUMwN0YwQTJFQzBGRTBFQzFGODBFQzNGMDAxNDdFMTQ3QzVDNDk1QTVDNDk1QTVDQTI0OQorQzdGQ0EzMTMwNkFBOTBDOEZDQTgxMzBFRUIzRjgwNDk3RUE1NkQ1QTAxMEVDN0ZDMUUzQjdDQkEyNz42MworRDxFQzAzRkYwMjFGMTNFMDkxMzhGQzAwRkNEOTAxRTAxMzFFRDkwNzgwRUIwNzgwMDExRUM3RUEwMUUwMDEzOEVDMDA3MDQ5Cis4MTQ5ODE0ODQ4ODE0ODQ4ODE5MEM5N0U0OEQ5MDFGQzE0ODAwMDBFRDkwN0ZGRUIwMUMwMDAwQzkwMzkxRjAzQzAwMDAwMUMKKzkwMjY3RTAwRTAxM0UwMDAxODQ5MDE3MDEzNjAyNjM4MDFGODZEMTM3MDAwMzA0OTZEMTMzMDAxMDNFQzBGRTAyNjcwMDdFMAorMDEwNzEzMzgwMDYwMTcxODQ5NUFBMjAwRTAxNzFDNDg0ODQ4MTUwQ0FBNkM2QzdFMTI2MEEyNkQ2QzE1MUMwMDcwMTcxODI2CiszMDAzRjAxMzBGMDEwMTE0MUYwMDM4NkQwMTNGMTMzODI2MTgwMEZDMDE3NzEzMzAwMDFDMDE3RTkwMzhFM0YwNzAwMDBDOTAKKzI2MUYwM0MxMTNFMDAwMEU5MDNBMDdGRjAwRkZDMDZDRDkwMUZDRUIzRjAwNkM5MENBRkM3RjZDN0U2QzdFMTM3MDZEMTY3QworMDExRUVEMDNGQ0Q5MDc4MEVDMUZGMEQ5MDFFMEVDRkY4MEQ5MDBGQzkwMzgzRkZDMDAwMjFGQjUxMjgwMDIwMzAxRTBDN0ZDCiszNjNDN0JCQTQxPkk8MTUzOEEzMTU3Q0EzMTVGRUEzNEE3RUEzNEE2QzdFQTIwMjA3N0ZFQzA2M0ZBMjAyMEU3RkVDMEMxRgorQTIwMjFDN0ZFQzE4MEZBMjAyMzg3RkVDMzAwN0EyMDI3MDdGRUM2MDAzQTIwMkMwN0YxNTAxQTJEOTAxODA3RjgxQTI0OUM3Cis3RjE2N0ZBMjAxMDY4MTAxMDdCNkZDQTI0OTgxMDEwQ0M3MTIxRkEyNDk2RTdFQTM0OTZFN0VBMzQ5NkU3RUEyMTNFMDcwN0UKKzEyMDE0ODZDODFEODBGRkMwMjA3MTM4MEI1NkM5MEI1MTJGRUEzMzczQzdEQkIzRT5JPEI3MTJFMDE2RkMxNkZGMDAwMTkwCiszOTgwMDA3RkMwNkM5MEM3RUExRkUwNzA3RTcwN0U3MDdFQTI3MDdFQTI4M0E3NUYxNjAzNUY0QzVBNEM1QTRDNUE0QzVBRUUKK0ZGODA5MUI1MDBGQ0M3RkNBMjkxQzdFQTdGODBFRTFGRTBFRTA3RjA3MDdFNzA3RTgzNzA3RUEyMTg4MDE3N0YxOEMwQTcxOAorODAxN0ZGQTI0QzEzMDA1RjE2MDM0QzVBRUUxRkY4NDg2REVCN0ZGMEI4MTJDMDk0QzdGQzE2RjgzMjM5N0RCODNCPkk8OTEKKzNBMDFGRjgwMDE4MDAyMEZFQkUwMDMwMjdGMTNGODkwM0EwMUZGODA3RTA3OTAzQTAzRkMwMDBGMEZEOTBGRjBFQjAzOUY0OQorNDhFQjAxREZEOTNGODBFQjAwRkY0OUM4MTI3RjAxRkUxNTNGMTIwMTQ4NDgxNTFGNDg0ODE1MEZBMjQ4NDgxNTA3QTI0ODVBCisxNzAzMTIzRjVCMDA3RjE2MDFBMzVCMDBGRjkzQzdGQ0FEMTI3RjZERUQwMTgwQTMxMjNGN0YwMDFGMTYwMzE4MDA2QzdFNUYKKzZDN0UxNzA2NkM2QzE1MEU2QzZDNUQwMDAwMTYxODAxN0YxNTM4NkQ2QzVDRDkxRkUwNUM2RDZDRUIwM0MwRDkwM0ZDRUIwRgorODA5MDI3MDFGRjgwM0ZDN0ZDOTAzOTAwN0ZGRkZDMDIwRjEzRjAwMjAxMTM4MDMxM0Q3QkJBM0M+STxCNzEyQzAxNkY4MTYKK0ZFMDAwMTkwMzk4MDAxRkY4MDZDOTBDN0VBM0ZFMEVFMEZGMEVFMDNGODcwN0U3MDdFMTc3RkEyRUYzRjgwMThDMDE3MUYxOAorRTAxNzBGMThGMEEzRUYwN0Y4QTQxOEZDQUMxOEY4QTRFRjBGRjBBMjE4RTBBMjE3MUYxOEMwRUYzRjgwQTJFRjdGMDAxN0ZFCis0QzVBNEM1QUVFMEZGMEVFM0ZFMDQ4NkRFQkZGODBCOEM3RkMxNkY4MTZDMDM2Mzk3REI4M0Y+STxCODEyRkVBMzAwMDE5MAorMzg4MDAwMDc2QzkwQzhGQzE3M0Y4MzgzODNBMzgzQTMxODgwMTcwMTE2QzBBMzk0QzdGQ0EzMTUwMUEyMTUwMzE1MEY5MUI1CitGQ0EzRUMwMDBGMTUwMzE1MDFBMjE1MDBBMjE4NjBBMzE4RTA5M0M3MTJDMEE0MTcwMUEzRUYwMzgwQTIxNzA3QTIxNzBGMTcKKzNGMTc3RjQ4NkQ5MDM4MDdGRjAwQjlGQ0EzMzMzOTdFQjgzOD5JPEI4MTJGOEEzMDAwMTkwMzg4MDAwMUY2QzkwQzcxMjAxCitFRTAwRkMxNzdDMTczQzE3MUNBMjE3MENBNDE3MEUxNzA2QTJFRDAxODBBMjE3MDBBNDE1MDNBMjE1MDcxNTFGOTFCNUZDQTMKK0VDMDAxRjE1MDcxNTAzQTIxNTAxQTY5MkM4RkNBRDQ4MTNDMEI2MTJDMEEzMkYzOTdEQjgzNj5JPERCRkY4MDEzQzAwMjBGCitFQkYwMDEwMjNGMTNGQzkxMzlGRjgwM0YwMzkwM0EwM0ZDMDAwNzg3RDkwRkYwRUIwM0NGNDk0OEVCMDBFRjQ5NDgxNDdGNDkKKzQ4MTQzRjQ5QzgxMjFGNDg1QTQ4NDgxNTBGNDg0ODE1MDdBMjQ4NDgxNTAzQTI0ODVBMTcwMTEyM0Y1QjAwN0YxNjAwQTQ0OAorNDgxNjAwQUI5M0I2RkNBMjZDN0U5MzM4MDA3RkUwRUYzRkMwQTIxMjNGN0YxMjFGQTI2QzdFQTI2QzdFQTI2QzdFNkM3RTZDCis2QzE1N0Y2RDdFNkQ2QzE0RkY2RDZDMTRFRkQ5MEZGOEVCMDNDN0Q5MDNGRUVCMDc4MzkwM0EwMEZGQzAzRjAxOTEzOTNGRkYKK0ZDMDAwMjBGMDFGMDEzMDAwMjAwMTM4MDM4M0Q3Q0JBNDE+STxCNjQ4QjUxMkZFQTMwMDAxOTAyNjgwMDAwMzEzMDA2QzkwCitDNzZDNUFCM0E0OTFCNkZDQTM5MUM3MTIwMUIzQTY0ODZENDk3RUI2NDhCNTEyRkVBMzM3Mzk3REI4M0U+STxCNjEyQzBBMworQzZFQkMwMDA2RDVBQjNCM0FENDk3RUI2MTJDMEEzMUEzOTdFQjgxRT5JPEI2NDlCNUZDQTMwMDAxMDE4MDkwMzgwMDdGRjAKKzZDOTBDOEVBM0Y4MDA1M0VDN0ZDMTczQzE3Mzg1RjVGNEM1QTRDNUE0Q0M4RkMxNjBFNUU1RTVFNUU0QjVBRUQwNzgwMDMwRQorQzlGQzVEMTUzRTE1N0UxNUZGNUM0QTdGNEE2QzdFMTQwRTRBNkM3RTRBNkM3RTE0NzA0QTZDN0U0QTZDN0UxNDgwNEE2QzdFCis2RjdFQTI2RjdGNzA3RUEyNzA3RTcwN0VBMjcwN0VBMjcwN0U3MDdFQTI3MDdFNzA3Rjg0ODQ0ODZENDk3RkI2MDExRkVCRkYKKzgwQTMzOTM5N0RCODQxPjc1IEQ8QjYxMkUwQTMwMDAxMDFDMEM4RkM2QzkwQzlGQ0IzQUQxNzE4QTUxNzM4MTczMEEzMTc3MAorQTMxN0YwQTIxNjAxMTYwMzE2MEZFRTFGRTA0ODZEMTNGRkI4RkNBMzJEMzk3REI4MzQ+STxCNTkzMzgwN0ZGRjg2RTVEQTIKKzAwMDFGMEZDMDAyNjAwREZDMEVEMUJGOEEyRDlDRkUwMTUzM0EzRDlDN0YwMTU2M0EzRDlDM0Y4MTVDM0EyRDlDMUZDRUMwMQorODNBM0Q5QzBGRUVDMDMwM0EyMDI3RjE0MDZBMzZFNkMxMzBDQTM2RTZDMTMxOEEyNkU2QzEzMzBBMzZFNkMxMzYwQTI2RTZDCisxM0MwQTM5MTM5MDFGQzAxODBBMzkxMzkwMEZFMDMwMEEyRUQ3RjA2QTNFRDNGOENBMkVEMUZEOEEzRUQwRkYwQTM0ODZDNkQKKzVBNDg3RUQ4MEZGQzZENDg0OTdFQjUwMEMwMDIwM0I1MTJGOEEyRUQwMTgwNDUzOTdEQjg0Qz5JPEI1OTEzODA3RkZGRTgwCis4MEM2OTIzODAwN0ZFMDZFRUMxRjgwRDlERkYwRUMwRjAwMTcwNkVCQ0ZGOEVCQzdGQ0EyRUJDM0ZFRUJDMUZGQTIwMUMwN0YKKzZFN0VBMjZFN0U2RTdFODExNDBGNkU3RTgxMTQwMzZFN0UxNjgwODBFRDdGQzAxNkUwMTUzRkVEMUZGMEVEMEZGOEEyRUQwNworRkNFRDAzRkVBMkVEMDFGRjZGMTM4NkEyRUU3RkM2RUUzRkU2QTJFRTFGRjZFRTBGRkVBMjE2MDcxNjAzQTIxNjAxMTYwMEEyCisxNzdFNDg2QzE1M0U0ODdFRDgwRkZDMTUxRUI1MDBDMDE0MEVBMjE3MDYzNzM5N0RCODNFPkk8RUMwM0ZGMDIxRjEzRTA5MQorMzhGRTAxRkM5MDM5MDFGODAwN0VEOTA3RTBFQjFGODA0OTQ4NkQ3RUQ5M0Y4MEVCMDdGMDQ5Qzc2QzdFMDFGRTZFN0U0ODQ4Cis2RTdFNDkxNTdFMDAwMzE2N0Y0ODQ4RUQzRjgwQTI0ODQ4RUQxRkMwQTIwMDFGMTdFMDQ5MTUwRjAwM0YxN0YwQTMwMDdGMTcKK0Y4NDkxNTA3QTMwMEZGMTdGQ0FDMDA3RjE3Rjg2RDE1MEZBMzAwM0YxN0YwQTI2QzZDRUQxRkUwQTM2QzZDRUQzRkMwMDAwNworMTc4MDZEMTU3RjAwMDMxNzAwNkM2QzE1RkVBMjZDNkM0QTVBMDE3RjRBNUE2RDZDNDk1QTZENkM0OTVBRDkwN0UwRUIxRjgwCitEOTAzRjgwMTdGQzdGQzkwMzkwMEZFMDFGQzkxMzgxRkZGRTAwMjAzOTBDOEZDMzYzRDdCQkE0MT5JPEI3MTJDMDE2RkMxNgorRkYwMDAxRDk4MDAwMTNDMDZDOTBDN0VBMUZFMDcwN0VFRTAzRjg4MzcwN0VBMjcwN0VBMjE4ODBBNzE4MDBBMjRDNUFBMjRDCis1QTVGRUUwRkYwNEM1QUVFRkY4MDkxQjU0OEM3RkMxNkYwOTFDQUZDQjNBNTQ4N0ZCNkZDQTMzMTM5N0VCODM4Pkk8RUMwMworRkYwMjFGMTNFMDkxMzhGRTAxRkM5MDM5MDFGODAwN0VEOTA3RTBFQjFGODA0OTQ4NkQ3RUQ5M0Y4MEVCMDdGMDQ5Qzc2QzdFCiswMUZFNkU3RTQ4NDg2RTdFQTI0ODQ4MTU3RjAwMDcxNzgwNDkxNTNGMDAwRjE3QzA0OTE1MUYwMDFGMTdFMEEyNDg0OEVEMEYKK0YwQTMwMDdGMTdGOEEyNDkxNTA3QTIwMEZGMTdGQ0FDMDA3RjE3RjhBMjZEMTUwRkEyMDAzRjE3RjBBMjZDNkNFRDFGRTBBMworNkM2Q0VEM0ZDMDAwMDcwMjdDMTQ4MDRBQjRGQzNDMDNGODAzODM4MDdGMDAzQjAxRkMwNzAxQzBGRUVDMEUwMDI2MDBGRTBDCitFQkUxRkMwMTdGRUM2M0Y4RDkzRjhDRUI3N0YwRDkxRkNDRUIzRkUwRDkwN0VFMTQ4MDZEQjQ0OUM3RkMwMTAwRDk4MUZDMTMKKzBDRUMxRkZGMDIwMzEzMUM5MUM3MDAxRTEzMUMxNjFGMTgzQ0VGODA3Q0VGQzBGOEVFMEZGRkEzMThGMDgyMThFMDcwMTNDMAorNzAxMzgwOTMzODAwN0UwMDM2NEI3QkJBNDE+STxCNjEyRkVFREZGRTAxNkY4MDAwMTkwMzg4MDA3RkU2QzkwQzc2QzdFRUUKKzNGQzA3MDdFNzA3RTcwN0VBMjcwN0VBMjgzQTY1RkEyNEM1QUEyNEM1QTRDNUFFRTNGODAwNEZGQzhGQ0VEMDdGQzkxQjUxMgorRTA1RTkxMzgwMDBGRjBFRDAzRjhFRDAwRkU4MjcwN0U3MDdFQTIxNjFGODNBNTgzQTZGMDAxODBBMjE3RjgxNjBGMTgwMzQ4Cis2RDAxMDcxNDAwQjY2RDZDNUEwNDAxMTMwNjkzMzgwMEZFMEVDQUVBM0ZGQ0VGMDdGMDM5M0I3REI4M0Q+STxEOTBGRjgxMworQzA5MDM4M0ZGRTAxOTBCNTEyODEzOTAzRjgwN0UzMzkwN0UwMDBGNzQ4NDgxMzdGNDg0ODEzM0Y0OEM3MTIxRjAwM0UxNDBGCiswMDdFMTQwN0EyMDA3QzE0MDMxMkZDMTUwMUEzNkMxNDAwQTM3RTZEMTQwMDZDN0U3RjEzRjg2Q0I0N0U2QzEzRjhFQ0ZGODAKKzZDMTRFMDZDMTRGODZDMTRGRUM2ODAwMTNGMTQ4MDAxMDcxNEMwRUIwMDdGMDIwNzEzRTBFQzAwN0ZFRDNGRjAxNTFGMTUwRgorRUQwN0Y4QTIwMEMwMTQwM0EyMTUwMUEzN0VBMjE2RjA3RTE1MDM2QzE1RTA2QzE0MDc2QzE1QzA2QzE0MEY2REVCMUY4MEQ4CitGQkYwRUIzRjAwRDhGMEZFMTNGRTM5RTAzRkZGRjgwMTBGMTNFMEQ4QzAwMTkwQzdGQzI1M0Q3Q0JBMkU+STwwMDNGQjgxMgorRTBBM0Q5QzAwM0VCMDAxRjI3M0UwMDAxRkUxMzAzNDhFRTAxRjAwMDc4MTYwMDAwNzAxNzcwQTMwMDYwMTczMEE0MDBFMDE3CiszODQ4MTcxOEE0QzcxNjAwQjNCMDkxMzgwN0ZGODAwMTFGQjYxMkUwQTMzNTM5N0RCODNDPkk8QjY5MDM4MDdGRkZFQTMwMAorMDEwMTgwOTAzODAwN0ZFMDZDOTBDOEVBMUY4MEVGMEYwMDE3MDZCM0IyMTcwRTZEMTUwQzgwMTcxQzEzM0YxNzE4NkQ2QzE0CiszODVGNkQ2QzE0RjA2RDZDNUM2RDZDNDk1QTZENkNFQjA3ODA2RDZDNDlDN0ZDOTEzODdGODA3RTkxMzgxRkZGRjgwMjA3MTMKK0UwOTEzODAwN0Y4MDM3M0I3REI4M0U+STxCNTAwRkM5MTM4N0ZGRjgwQTMwMDAzMDE4MDkxMzgwRkZDMDA2QzkwQzhFQTA3CitFMDcxNUE2QzcwNUE2RTE0MDMwMTdGOTNDN0ZDQTI4MDAxM0YxNTA2QTI2RTE0MEUwMTFGMTUwQzgwMDEwRjVEQTI4MDAxMDcKKzVEQTI2RTE0NzAwMTAzMTU2MEEyNkQ2QzVDQTI4MDZENEE1QUEyRUQ4MDAzMDI3RjkxQzhGQ0EyOTEzODNGQzAwNkEyMTVFMAorMDIxRjVCQTJFREYwMUMwMjBGMTMxOEEyNkU2QzVBQTIxNUZDMDIwMzVCQTJFREZFRTAwMjAxNUJBMjZFNkM1QUEzNkZDOUZDCitBMzE1M0VBMjE1MUNBMzM5M0I3RUI4M0U+STxCNUQ4RkMwN0I1RDhGMDAxQjVGQ0EzMDAwNzkwMjc4MDAwMUZGRUM3RUExRgorRjg2QzQ4QzdEODBGRjhFQzA3RTAwMDAxMDMwN0VEMDNDMDFCODA3RjZDNkY2QzE1MDBBMjZFNUYwMTdGNkU2QzE0MDZBMjgwCiswMTNGNEE2QzVDQTI4MDAxMUY0QTZENUJFRTA2N0ZBMjZENkMwMTBFNkQ1QkVFMEMzRkEyNkQ2QzAxMUM2RDVCRUUxODFGQTIKKzZENkM2RjVCRUUzMDBGQTI2RDZDNkY0ODVBRUU2MDA3QTI2RDZDNENDN0ZDOTMzOEMwMDNGQ0EyMDM4MDVEOTEzQjdGODE4MAorMDFGRTA2QTIwM0MxMTUwRURBM0ZDM0M3RUFGRjBDQTIwM0UzMTUxQ0RBMUZFNkVDN0Y5OEEyMTVGNkRBMEZGQ0VDM0ZGMEEzCiswMjA3NUU0QjE0MUZBMjAyMDM1RTRCMTQwRkEyMDIwMTVFNEIxNDA3QTIwMjAwOTNDOEZDNEI4MDUwM0I3RUI4NTU+STwwMAorN0ZCNTkwMzgzRkZGRkNBM0M2MDFGODAxMDcxMzgwRDk3RkUwRDkwM0ZDQzdGQzAxM0ZFQzAxRjA2RDZDNUM1RjZENkM1QzZECis2QzEzMDM0Q0M4RkM2RDZDMTMwNjE2MEU2RDZDNUI2REVCODAxODE2Mzg5MTM4N0ZDMDMwNkU2QzVBMTZFMDZFNkM1QTkxMzgKKzBGRjE4MDE1RkI2RUI0QzlGQzVEMTQwMzZFN0VBMjZFN0Y2RjdFQTI0QjdFMTVERjkxMzgwMTlGRjA5MTM4MDM4RkY4MTUwRgorOTEzODA2MDdGQzkxMzgwRTAzRkUxNDBDNEE2QzdFRUMzODAwMDIzMDgwNEE2RDdFMTRFMDRBNkQ3RTQ5NDg2RDdFMTMwMzkxCitDNzZDN0UwMTA2NkU3RTEzMEUwMTBDNkU3RTAxMUMxNDAxMDEzQzgxMDFGRTgyMjYwN0ZGODAwMTA3MTNFMEI1MDBFMDAxM0YKK0VCRkY4MEEzMzkzOTdFQjgzRT5JPEI1MDBGRTkxMzgzRkZGRTBBMzAwMDMwMUUwOTEzODA3RkUwMEM2NDlFQzAzRjAwMTdGCis2RjVBNjA2RDZDNUQ2RDZDMTQwMzk1QzdGQzZENkMxNDA2QTI2RDZDNUM2RDZDMTQxQzE3MTg2RDZDMTQzODE3MzA2RDZENUIKKzZFNkMxM0UwNUY5MTM4M0ZFMDAxNUY5MTM4MUZGMDAzREEwRkY4OTBDOEZDMTYwNjkxMzgwN0ZDMEUxNjBDOTEzODAzRkUxQworOTEzODAxRkYxODVFNkUxM0IwMTZFMDE1N0Y2RjVBQjNBMjRCN0UwMjNGQjUxMkMwQTMzQjM5N0ZCODNFPkk8MDA3RkI4MTIKKzgwQjkxMkMwQTI2QzE3ODAzMjA0Nzk3MDQxPjk1IEQ8RUEwMTgwMTIwM0VBMDcwMDEyMEU1QTEyMTgxMjM4MTIzMDEyNzAxMgorNjBBMjEyRTA1QUE0MTJDRUVBRkY4MDEzQzBBMzEyN0ZBMkVBM0Y4MEVBMEUwMDBBMTk3QUI5MTc+STxFQjFGRTBFQkZGRkMKKzM4MDNFMDNGMzkwNzAwMEY4MDM5MEY4MDA3RTA0ODZDNkM3RTEzRTA2RTdFQTI2RTdFNkM1QTZDNUFDOEZDQTQxNDdGRUIwNworRkZFQjNGRTBFQkZFMDBFQTAzRjhFQTBGRjBFQTFGQzAxMjNGNDg1QTkwQzdGQzE2MEMxMkZFQTMxNDAxQTI2QzEzMDM2Q0VCCiswNzdDOTAzOTgwMDYzRTE4MzgzRkMwMUUzQTBGRTA3ODFGRjAzQTAzRkZGMDBGRTAzQTAwN0Y4MDA3QzAyNjI3N0RBNTJBPgorSTxFQTAzRjAxMkZGQTMxMjBGMTIwM0IwRUMxRkUwRUM3RkY4OTAzOEYxRTAzRTkwMzlGMzgwMUY4MDkwMzlGNzAwMEZDMDAxCitGRUVCMDdFMDQ5RUIwM0YwNDlFQjAxRjg1QkVEMDBGQ0EyMTZGRUEyMTY3RTE2N0ZBQTE2N0UxNkZFQTIxNkZDMTUwMTZEMTQKK0Y4RUQwM0YwN0YwMUVFRUIwN0UwMDFDNkVCMEZDMDkwMzlDNzgwMUYwMDkwMzg4MUUwN0U5MDM4MDBGRkY4QzdFQTFGQzAyOAorM0I3RUI5MkU+STxFQjAzRkM5MDM4MUZGRjgwOTAzODdFMDNFMDM5MDFGODAwNzA0ODQ4MTNGODM5MDdFMDAxRkMzODBGQzAKKzAzQTJFQTFGODAxMjNGOTAzODAwMDFGODQ4RUIwMEYwMTUwMEEyMTI3RTEyRkVBQTEyN0UxMjdGQTI2QzE0MDY3RjAwMUYxNAorMEU2RDEzMEMwMDBGMTQxQzZDNkMxMzM4NkM2QzEzNzA2QzZDMTNFMDM5MDA3QzA3QzA5MDM4MUZGRjAwRUIwN0Y4MUYyNzdECitBNTI1Pkk8RUQwRkMwRUMwM0ZGQTNFQzAwM0YxNTBGQjBFQjAzRjhFQjFGRkY5MDM4N0UwNzhGOTAzOEY4MDFFRjM5MDNGMAorMDA3RjQ4NDgxMzNGNDg0ODEzMUZBMjQ4NDgxMzBGMTIzRjkwQzdGQzVBQTIxMjdFMTJGRUFBMTI3RTEyN0ZBMjdFQTI2QzZDCisxMzFGQTI2QzZDMTMzRjZDNkMxMzdGNkM2Q0VCRUZGMDNBMDFGODAxQ0ZGRjM5MDA3QzA3OEY5MDM4MUZGRTBGRDkwN0Y4MTMKK0MwMjgzQjdEQjkyRT5JPEVCMDdGOEVCMUZGRjkwMzg3QzBGQzAzOTAxRjgwM0UwMzkwM0YwMDFGMEQ4MDdFMDEzRjgzODBGCitDMDAwNDg0ODEzN0NBMjQ4QzcxMjdFMTUzRTVBMTUzRjEyN0UxMkZFQTNCN0ZDQTI0OEM4RkNBNTEyN0VBMjEyN0ZBMjZDMTQKKzAzN0YwMDFGMTQwNzZDNkMxMzA2MDAwNzE0MEU2RDEzMUNEODAxRjAxMzM4NkM2QzEzNzA5MDM4N0UwM0UwOTAzODFGRkY4MAorOTAzODAzRkMwMDIwMjc3RUE1MjU+STwxNDdFOTAzODAzRkY4MDkwMzgwRkMxRTBFQjFGODc5MDM4M0YwRkYwMTM3RUEyMTMKK0ZDQTIzOTAxRjgwM0MwOTFDN0ZDQURCNTEyRkNBM0Q4MDFGOEM3RkNCM0FCNDg3RTM4N0ZGRkY4QTMxQzNCN0ZCQTE5Pkk8CitFRDAzRjA5MDM5MEZGMDBGRjg5MDM5M0ZGQzNDM0M5MDM5RjgxRjcwN0MzOTAxRjAwRkUwMzkwM0UwMDdDMDNBMDdDMDAzRTAKKzEwMDAwRkVDRjAwMEEyNDg0ODZDN0VBODZDNkM0ODVBQTIwMDA3NUM2QzZDNDg1QTZENDg1QTZENDhDN0ZDMzgwNzNGRkMzOAorMDYwRkYwMDAwRUM5RkNBNDEyMEZBMjEzQzA2Q0I1MTJDMDE1Rjg2QzE0RkU2Q0VDRkY4MDQ4MTVDMDNBMEY4MDAwN0ZFMDQ4CitDN0VBMEZGMDAwM0UxNDAzNDgxNDAxMTZGODQ4MTQwMEE1NkMxNDAxMDA3QzE1RjA2Q0VDMDNFMDAwM0YxNDA3RDgwRjgwRUIKKzBGODBEODA3RTBFQjNGMDAzOTAxRkMwMUZDMzkwMDdGRkZGMDAxMDc5MEM3RkMyNjM4N0VBNTJBPkk8RUEwM0YwMTJGRkEzCisxMjBGMTIwM0IwRUMwRkYwRUMzRkZDRUNGMDNGOTAzOUYxQzAxRjgwOTAzOUYzODAwRkMwRUJGNzAwMTNGRTQ5NkQ3RUEyNUIKK0EzNUJCM0EzNDg2QzQ5N0VCNTAwQzFCNTEyODBBMzI5M0E3RUI5MkU+STxFQTAzODBFQTBGRTA0ODdFQTU2QzVBRUEwMzgwCitDOEZDQUFFQTAzRjAxMkZGQTMxMjA3MTIwM0IzQUE0ODdFQjUxMkMwQTMxMjM4N0VCNzE3Pkk8RUIwMUMwRUIwN0YwRUIwRgorRjhBNUVCMDdGMEVCMDFDMDkwQzdGQ0FBRUIwMUY4MTNGRkEzMTMwNzEzMDFCM0IzQTIxMjNDMTI3RTAwRkYxM0YwMTMwM0EyCisxNEUwMzhGRTA3QzAxMjdDMzgzQzBGMDBFQTBGRkVFQTAzRjgxNTQ5ODRCNzE5Pkk8RUEwM0YwMTJGRkEzMTIwRjEyMDNCMQorOTEzODAxRkZGQ0EzOTEzODAwN0ZDMDE2MDAxNTdDMTU3MDVENEE1QTRBNUE0QUM3RkMxNDFFMTQzODE0NzgxNEZDMTNGMUVCCitGM0ZFRUJGNzNGMDFGRTdGRUJGODFGNDk2QzdFODExNDA3NkU3RTZFN0U4MTE0MDAxNTdFMTU3RjgxMTY4MEVEMUZDMDQ4NkMKK0VCM0ZGMEI1MDBDMEI1RkNBMzI4M0E3RUI5MkM+STxFQTAzRjAxMkZGQTMxMjBGMTIwM0IzQjNBRDQ4N0VCNTEyQzBBMzEyCiszQTdFQjkxNz5JPDI3MDNGMDBGRjBFQjFGRTAwMEZGRDkzRkZDRUI3RkY4OTEzQUYwM0YwMUUwN0U5MDNCRjFDMDFGODM4MAorM0YzRDBGRjM4MDBGQzcwMDFGODAyNjAzRjcwMDEzQ0UwMUZFMTREQzQ5RDkwN0Y4RUIwRkMwQTI0OTVDQTM0OTVDQjNBMzQ4Cis2QzQ5NkNFQjFGRTBCNTAwQzFCNTAwODNCNUZDQTM0MDI1N0VBNDQ1Pkk8MzkwM0YwMEZGMDAwRkZFQjNGRkNFQ0YwM0Y5MAorMzlGMUMwMUY4MDNBMEZGMzgwMEZDMDM4MDNGNzAwMTNGRTQ5NkQ3RUEyNUJBMzVCQjNBMzQ4NkM0OTdFQjUwMEMxQjUxMjgwCitBMzI5MjU3RUE0MkU+STxFQjAzRkU5MDM4MEZGRjgwOTAzODNFMDNFMDkwMzhGODAwRjg0ODQ4MTM3QzQ4NDg3RjQ4NDg3RgorNDg0OEVCMEY4MDAwMUYxNUMwOTBDNzEyMDc0ODE1RTBBMjAwN0VFQzAzRjBBNDAwRkUxNUY4QTkwMDdFMTVGMEEyMDA3RjE0CiswNzZDMTVFMEEyNkM2Q0VCMEZDMDAwMEYxNTgwNkQxMzFGNkM2Q0VCM0YwMDZDNkMxMzdFQzY2QzEzRjg5MDM4N0UwM0YwOTAKKzM4MUZGRkMwRDkwM0ZFQzdGQzI1Mjc3RUE1MkE+STwzOTAzRjAxRkUwMDBGRkVCN0ZGODkwMzhGMUUwN0U5MDM5RjM4MDFGCis4MDNBMDdGNzAwMEZDMEQ4MDNGRUVCMDdFMDQ5RUIwM0YwNDkxNEY4NDkxMzAxMTZGQzE1MDAxNkZFQTMxNjdGQUExNkZFQTMKK0VEMDFGQ0EyNkRFQjAzRjgxNkYwNkQxMzA3NkRFQjBGRTAwMUY2MTRDMDkwMzlGNzgwM0YwMDkwMzhGMUUwN0U5MDM4RjBGRgorRjhFQzFGQzA5MUM4RkNBQjQ4N0VCNTEyQzBBMzI4MzU3RUE0MkU+STxEOTAzRjgxM0MwOTAzODFGRkUwMTkwMzg3RTA3ODEKKzkwMzhGQzAxQzMzOTAzRjAwMEUzMDAwNzE0Nzc0ODQ4MTMzNzQ5MTMzRjAwMUYxNDFGNDg1QTE1MEY0OEM3RkNBMzEyRkVBQQorMTI3RkEzN0U2RDEzMUYxMjFGNkQxMzNGMTIwRjZDNkMxMzdGNkM2QzEzRUYzOTAxRjgwMUNGMzkwMDdFMDc4RjkwMzgxRkZFCiswRkVCMDdGODkwQzdGQ0FCRUQxRkUwMDIwM0I1RkNBMzI4MzU3REE0MkM+STwzODA3RTAxRjAwRkZFQjdGQzA5MDM4RTFFMworRTA5MDM4RTM4N0YwMzgwRkU3MDdFQTAzRTYxM0VFOTAzOEVDMDNFMDkwMzhGQzAwODA0OTEzMDBBNDVCQjNBMjQ4N0VCNTEyCitGMEEzMUMyNTdFQTQyMT5JPEVCRkYwMzAwMDMxM0U3MzgwRjgwRkYzODFFMDAzRjQ4N0Y0ODdGMDA3MDdGMTJGMEEyODA3RQorQTI3RUI0OTBDN0ZDRUE3RkUwMTNGRjZDMTNFMDZDMTNGODZDN0YwMDAzN0ZDNjdGMDEwNzEzODBFQjAwN0YxNDFGMDBDMEVCCiswRkMwMTQwN0EyNkMxMzAzQTM3RTE1ODA2QzEzMDc3RUVDMEYwMEI0MTMxRTM4RjNDMDdDMzhFMUZGRjAzOEMwM0Y4MDFBMjcKKzdEQTUyMT5JPDEzMThBNTEzMzhBMzEzNzhBMzEzRjgxMjAxMTIwMzEyMDcwMDFGQjVGQ0I2RkNBMkQ4MDFGOEM3RkNCMjE1CitDMEE5MzgwMEZDMDExNTgwRUI3QzAzMDE3RTEzMDA2RDVBRUIwRkZFRUIwMUY4MUEzNDdGQjIyMD5JPEQ4MDNGMEVCMDdFMAorMDBGRkVCMDFGRkEzMDAwRkVCMDAxRjAwMDMxNDA3QjNBNDE1MEZBMzE1MUYxMjAxNkQxMzNGMDAwMEVDNzdGODZEOTAzOEU3CitGRjgwOTAzODNGMDNDNzkwMzgxRkZGODc5MDNBMDNGQzA3RTAwMDI5MjY3RUE0MkU+STxCNTM4ODAzRkZFQTMzQTBGRjgwMAorMEZGMDZDNDhFQjA3RTAwMDAzRUMwM0MwNkQxNDgwMDAwMTE1MDBBMjZDNkMxMzA2QTI2RDEzMEUwMTdFMTMwQ0EyNkQ1QkEyCitFQzgwMzgwMTFGMTMzMEEyNkQ2QzVBQTIxNEUwMDEwNzVCQTI5MDM4MDNGMTgwQTNEOTAxRkJDN0ZDQTIxNEZGNkQ1QUEyMTQKKzdDQTMxNDM4QTIyNzI1N0VBMzJDPkk8QjUzQTFGRkZFMDNGRkVBMzI2MEZGODAwOTAzODAwMEZGODZDNDgwMTdFRUIwM0UwCisxOEMwMDAwMzAyM0VFQjAxODBBMjZDNkMwMTNGRUIwMzAwQTM2QzZDRUM4MDA2MTU2RkEyMDE3RTkwMzhFRkMwMEMxNUM3MTcKKzFDRDkzRjAxRUJFMDE4MTU4MzAyODFFQkYwMzhEOTFGODMxNDMwMTUwMTAyQzNFQkY4NzA5MDI2MEZDNjAwMTM2MEEyRDkwNworRTY2RDVBMDJFQzEzN0NBMkQ5MDNGQ0VCN0Y4MDRBMTMzRkEyMDEwMTkyQzdGQzRBN0ZBMjAxMDAxNDFFNEExMzBFMDI2MDEzCiswQzM3MjU3RUEzM0M+STxCNTM4ODA3RkZGQTMzQTAzRkUwMDNGRjAwMDAxRUMxRjgwMDAwMDkyQzdGQzAxN0UxMzFDNkQxMworMTg2RDZDNUFFQ0MwNzAwMTBGNUI2RDZDNUFFQ0YxODBFQjAzRkI2REI0QzhGQzZENUFBMjE0N0Y4MDRBN0U4MTE0Q0Y5MDM4CiswMUM3RTA5MDM4MDM4M0YwOTAzODA3MDNGOEVCMDYwMTQ5NkM3RTAxMUMxMzdFNDkxMzdGMDE3ODdGNDk2RDdFNDg2QzgwMDAKKzBGRUMzRkYwRDhGRkZFOTBCNTEyODBBMzI5MjQ3RkEzMkM+STxCNTM4ODAzRkZFQTMzQTBGRjgwMDBGRjA2QzQ4RUIwN0MwCiswMDAzRUMwMzgwNkM3RTE2MDA3RjAwMDAxNDA2QTIwMTdFNUJBMjEzN0Y2RDVCQTI2RDZDNUFBMkVDQzA3MDAxMEYxMzYwQTIKKzZENkM1QUEyMTRGMTAxMDM1QkEyRDkwMUZCQzdGQ0EyMTRGRjZENUFBMjE0N0NBMzE0MzhBMjE0MzBBMjE0NzAxNDYwQTI1QworQTJFQTdDMDEwMEZFNUIxMzAzOTFDOEZDMTMwNkVBRkMwRUVBNzAxQzZDNUFFQTFGRjBFQTBGQzAyNzM1N0VBMzJDPkk8MDAKKzNGQjUxMkZDQTJFQjgwMDNEODNFMDAxM0Y4MDAzQ0VCMDdGMDAwMzhFQjBGRTAxMjMwMDA3MEVCMUZDMEVDM0Y4MDAwNjAxMworN0YxNTAwMTRGRTQ5NUFBMkM2NDg1QTQ5NUFBMjQ5NUE0OTVBNDk1QUEyOTAzODdGMDAwNjEzRkVBMjQ4NUE0ODVBMDAwNzE0CiswRTVCNDg0ODEzMEM0ODQ4MTMxQ0EyNDg0ODEzM0M0OEM3MTI3QzQ4RUIwM0ZDOTBCNUZDQTIxRjI0N0VBMzI1Pkk8MTQzRQorRUNGRjgwOTAzODAxODBDMDkwMzgwMzAwNjAwMTA2N0ZBNTZENUI2RDZDNUE2REI0NUEwMjNFQzhGQzkxQzlGQ0E1RDgwM0YwCitFQjA3RTAwMEZGRUIwMUZGQTMwMDBGRUIwMDFGMDAwMzE0MDdCM0E0MTUwRkEzMTUxRjEyMDE2RDEzM0YwMDAwRUM3N0Y4NkQKKzkwMzhFN0ZGODA5MDM4M0YwM0M3OTAzODFGRkY4NzkwM0EwM0ZDMDdFMDAwMjkzODdFQjYyRT4xODMKK0QgRQorJUVuZERWSVBTQml0bWFwRm9udAorJURWSVBTQml0bWFwRm9udDogRnMgZWNzczE0NDAgMTQuNCAzMgorL0ZzIDMyIDI0NyBkZjxDMTEyODBBNjcxMDY4MEEyNzI+MjIgRDwxNDA2MTQwRTE0M0UxNDdFRUIwMUZFMTMwNzEzM0ZFQTA3CitGRkI1RkNBMzEzRjkxM0MxRUFGODAxMTIwMEIzQjNCM0E2MDA3RkI2MTJGOEE2MjU1MDc2Q0YzOT40OQorRDxFQzdGRTA5MDM4MDdGRkZDMDExRjEzRkY0OTE0QzA0OTE0RjA5MEI2N0U0ODgxNDgwMTAwN0ZEODA3RjhFQjFGRkY0ODQ4CisxMzA3MDFDMDAxMDExMzgwMDAxRjZFMTNDMDQ5MTQ3RjQ4QzhFQTNGRTBBMjAwN0VFRDFGRjAxNjBGMTI3QzEyRkM0OEVEMDcKK0Y4MTI3OEEyMTIzMEEyMTIxMEM5RkNBNDE3RjAxNjBGQTNFRTFGRTBBMjE3QzAxNjNGMTc4MDE2N0ZFRUZGMDA1RTE1MDE0QgorNUE0QjVBNUU0QjVBNEI1QTRCNUExNTdGNEJDN0ZDNEE1QTRBNUFFQzA3RjA0QTVBNEE1QTRBNUE0QUM4RkMxNEZFNDk1QTQ5Cis1QTQ5NUE0OTVBNDk1QTQ5NUE5MUM5RkMxMzdFNUI0ODVBNDg1QTQ4NUE0ODVBNDg1QTQ4Q0FGQzQ4QjcxMkY4QTcyRDUwN0IKK0NGMzk+STxFQzNGRjA5MDM4MDFGRkZFMDEwRjZEN0UwMTNGMTRFMDQ5ODA5MEI2N0UwMDAzODE0ODkwMzhDMDFGRkUzQTBGCitGRTAwMDdGRjAxRjgwMTAxMTM4MDQ4NDg3RkQ4M0ZDMEVDN0ZDMDQ5MTQzRjQ4QzhGQzAwM0UxNkUwMTYxRjEyMUMxMjE4MTIKKzA4QzlGQ0EzMTYzRjE3QzBBMjE2N0YxNzgwMTZGRjE3MDA1RDRCNUE0QjVBNEI1QUVEN0ZGMDkxMzgwRkZGRTAwMTAzQjU1QQorNUU0QkM3RkNBMkVERkZDMDE2RjA5MEM3RUEzRkY4RUQwN0ZDRUQwMUZFNkY3RUVFN0Y4MEVFM0ZDMDE3RTAxNjFGMTdGMDE2CiswRjE3RjhBMjE2MDcxN0ZDQTgxMjQwMDA2MEVEMEZGOEEyMTI3MDAwRjhFRDFGRjBBMjZDMTUzRjAwN0YxNkUwNkQxNDdGNkMKKzZDRUNGRkMwRDgxRkYwNDkxMzgwRDgwRkZFMDEwNzEzMDAzQTA3RkZDMDNGRkU2QzkwQjVGQzZDMTVGODZDNUQwMTNGNUMwMQorMEYxNDgwMDEwMzQ5QzdGQzkwMzgwMDNGRjAyRTUyN0JDRjM5Pkk8RUQwN0ZDMTUwRkEyMTUxRkEyMTUzRDE1N0RBMjE1RjkKK0EyRUMwMUYxMTQwM0EyRUMwN0UxQTJFQzBGQzFBMkVDMUY4MTE0M0YxNTAxMTQ3RjE0N0UxNEZFRUIwMUZDQTJFQjAzRjhBMgorRUIwN0YwQTJFQjBGRTAxMzFGMTRDMEVCM0Y4MEEyRUI3RjAwNUI1QjEyMDE1QjEyMDM1QjQ4NUExMjBGNUIxMjFGNUI0ODVBCisxMjdGOTBDN0ZDNUE5MEI4MTJDMEE2QzhEODAxRkNDN0ZDQjNBNDMyNEU3RENEMzk+STxCNzdFMTZGODE2RkYxN0MwMTdGMAorMTdGQzkwMjY4MDAwMDM3RjkyMzgwMDNGRkYwNDA3MTNDMDE2MDE3MDdGRUYzRkYwNzE3RTE3MEY3MTdFQTIxNzAzODQxNzAxCitBNjRENUFBMjE3MDc2MDE3MEY0RDVBNEQ1QUVGRkZDMDRDNUIwNDA3OTBDN0ZDRUUxRkZFOTIzODAxRkZGODkwQjc1QTE3QzAKKzRDQzhGQ0EyRUVGRkMwMTdGODkwMjY4MDAwMEYxM0ZFOTIzODAwM0ZGRjA0MDcxM0MwMDQwMTdGNzA2QzdFRUYxRkY4NzE3RQorNzE3RTE3MDM3MTdFQTI3MTEzODAxODdGQTIxOUMwQTIxODNGQTQxODdGQTIxOTgwMThGRkEyNEQxMzAwNUY0RDVBNEQ1QTE3CiszRjRENUE0QzQ4NUEwNDBGNUI5M0I1NUE5MEI4QzdGQzVGMTdGODE3RTA5NEM4RkMxNkYwM0E1Mjc1RDE0Qz42NgorRDw5MjM4MDNGRkYwMDMxRkVCRkY4MDkyQjYxMkYwMDIwMzE1RkUwMjBGRURGRjgwMTQzRjVDOTEyN0ZGRkUwMDFGMTMwMDQ5CiswMUYwMTMwMTQ5MDFDMEVCMDAzRjQ5OTBDODEyMEY0OTQ4MTUwM0Q5MUZGODkyQzdGQzQ5NUE0OTVBNDk1QUEyNDg1QjQ4OTAKK0NCRkM1QjEyMDc1QjEyMEY1QjEyMUY1QkEyMTIzRjVCQTM0ODVBQTU0ODVBQUU2QzdFQTU2QzdFQTM3RjEyMUZBMjdGMTIwRgorN0YxMjA3N0YxMjAzN0Y2QzdGNkM3RkEyNkQ3RTZENkMxNjgwNkQ2QzE1MDNEOTBGRkUxNTA3NkQ2QzE1MUY2RDAxQzBFQzNGCitDMDZEMDFGMEVCMDFGRjZEMDFGRTEzMUY2RUI3MTI4MDZFRURGRTAwMDIwRjVEMDIwMzE1RjAwMjAwMTVDMDAzMUY5MUM3RkMKKzAzMDMxM0YwM0E1Njc4RDM0OT5JPEVBRkY4MEIzQjNCM0IzQUEwOTUyNzVEMTIwPjczIEQ8QjQ3RUIzQjNCM0IzQTM5MEI3CisxMkY4QTcyRDUyNzVEMTNFPjc2IEQ8RDhGRkUwRjBGRkUwQTM2RDVGQTI2RDVGQTIwMEZFMTlFRjZEMTcwN0EyMDE3RUVGMEYKK0NGQTM2REVGMUY4RkEzNkQ2Q0VFM0YwRkEyNkUxNjdGMDEwRjE3N0VBMjZFMTZGRTAxMDcxN0ZDQTI2RTE1MDEwMTAzMTdGOAorNkUxNTAzQTIwMTAxMTdGMDZFMTUwN0EyMDEwMDE3RTA2RTE1MEYwMjdFMTZDMDAyN0YxNTFGQTI2RTE2ODA2RjE0M0ZBMjAyCisxRjE2MDA2RjVDQTI2RTZDMTRGRUEyMDIwNzVENkYxMzAxQTIwMjAzNUQ2RjEzMDNBMjZFNkM0OTVBQTIwMjAwNUQ2RjEzMEYKK0EyMDM3RTVDMDM3RjEzMUZBMjZGNUNFRTgwM0YwMzFGOTFDN0ZDQTI3MDVBMDMwRjEzN0VFRUUwRkVBMjAzMDc1QjE2RjEwMworMDM1QkEzOTIzODAxRkJGMEEyNkZCNDVBQTM3MDVBQTM3MDVBOTNDOUZDQTI0QjUyNzREMTY0Pkk8OTIzODAzRkY4MDAzM0YKKzEzRjg5MkI1MTJGRTAyMDM2RTdFMDIwRjE1RTAwMjNGMTVGODRBNDhDNjdGREFGRkYwRUIxRkZFMDEwMzAxQzA5MDM4MDdGRgorODA0OTkwQzcwMDAxN0ZEOTBGRkM2RTZDN0U0OTQ4NkY3RTRBMTUxRjQ5NDg2RjdFNDk0ODZGN0U0OTQ4NkY3RTkxQzkxMjAxCis0ODg0NDg0ODcwMTM4MDQ5MTc3RjAwMDcxOUMwNDkxNzNGMDAwRjE5RTA0OTE3MUYwMDFGMTlGMEEyNDkxNzBGMDAzRjE5RjgKK0EyNDkxNzA3QTIwMDdGMTlGQ0EzNDkxNzAzQTIwMEZGMTlGRUFENkQxNzA3MDA3RjE5RkNBNTZEMTcwRjAwM0YxOUY4QTI2RAorMTcxRjAwMUYxOUYwQTI2RDE3M0YwMDBGMTlFMDZEMTc3RjAwMDcxOUMwNkQxN0ZGMDAwMzE5ODA2RDVFNkMxOTAwNkU1RDZDCis2RDRCNUE2RDZDNEI1QTZENkM0QjVBNkUxNTNGNkQ2QzRCNUE2RDZDNEI1QTZENkM0QTVCNkQwMUMwMDEwNzVCNkQwMUYwMDEKKzFGOTBDN0ZDOTAyNjAwN0ZGRUVCRkZGQzZFQjY1QTAyMEYxNUUwNkU1RDAyMDA0QUM4RkMwMzNGMTNGODAzMDMxMzgwNDc1NgorN0FEMzU0Pjc5IEQ8QjcxMkMwMTZGQzE2RkYxN0MwMTdGMDgzOTAyNjgwMDAwMTEzRkU5MjM4MDAxRkZGMDQwNzEzODAwNDAxCisxM0MwNzAxM0UwMTczRkVGMUZGMEEyRUYwRkY4MTcwNzE4RkMxNzAzQTIxOEZFQTIxNzAxQTUxNzAzQTIxOEZDQTIxNzA3MTgKK0Y4MTcwRkVGMUZGMEEyRUYzRkUwMTdGRjRDMTNDMDA0MDcxMzgwMDQxRjEzMDA0QkI0NUE5MEI3MTJGODVGMTdDMDk0QzdGQworMTZGQzE2QzAwMTgwQ0FGQ0IzQjEzNzUyNzVEMTQ5Pkk8OTEzODA3RkY4MDAyN0YxM0Y4NDlCNkZDMDEwNzE1QzAwMTFGMTUKK0YwNDkxNUZDNDk4MTkwMzhGRkY4MDA0ODAxQzAxMzBGNDg5MEM3RUEwM0ZDNDg0ODE0MDBEODBGRjgxNTNDMTcxQzQ4NDgxNQorMEM0OTkyQzdGQzQ4NUFBMzQ4NUFBNzdGQTIxMjNGN0Y3RjZDN0U3RjZDN0U3RjZDMTNDMDZDMTNGQzZDRUJGRjgwMTVGODZDCis2Q0VCRkY4MDZEMTRGMDZEMTRGQzAxMDcxNEZGNkQ4MUQ5MDA3RjgwMDIwRjgwMDIwMDgwMDMwRjdGMDMwMTdGOTIzODAwM0YKK0ZFMTYwRjcwN0U3MDEzODA4MjgyRUY3RkMwQTIxNzNGMThFMEEyMTcxRkE4RUYzRkMwQTMwMDYwRUU3RjgwMDA3MDE2RkYwMAorNzgxNzAwMDA3RTVERDg3RjgwNEE1QTQ4NkM0QTVBMDFGODE0MUYwMUZGRUM3RkY4NkM5MDM5RjAwM0ZGRjAwMDFGOTBCNjVBCiswMDA3NUU2QzkzQzdGQ0M2NkM1QzAxMUYxNEY4MDEwMTE0RTA5MDI2MDAxRkZFQzhGQzMzNTY3QkQzM0Y+ODMKK0Q8OTAzODAzRkY4MDAxMUYxM0UwOTBCNTEyRjgwMDAzODAwMDBGMTRGRjQ4MTU4MEQ5RkMwMDEzQzAwMUUwMTM3RjAxODBFQgorM0ZFMDAwMUVDN0VBMUZGMDAwMTgxNDBGMTIxMEM4RUEwN0Y4QTNFRDAzRkNBQUVDMDNGRjkxQjVGQzEzMDcxMzNGOTBCNkZDCis0ODE0ODMwMDA3RUJFMDAzMzgwRkZFMDBFQTFGRjhFQTNGRTA1QjQ4NUE5MEM3RkMxMkZFQTUxNTA3NkMxNDBGNkM3RTZEMTMKKzNGNkQxMzdGMzkzRkZDMDNGRjkwQjZGQzZDMTRGQjZDMTRFMzZDMTQ4MzZDRUJGQzAzQzYwMUMwQzdGQzI2Mzc3QUI1Mzc+Cis5NyBEPEVDMUZGQzkxQjUxMkMwMDEwMzE0RjAwMTBGMTRGQzQ5MTRGRjQ5MTU4MDkwMzg3RkYwMDM5MDM5RkY4MDAwN0Y0OAorNDhDN0VBMUYwMDQ4NDgxNDA3NDg0ODgwNDk5MUM3RkM0ODVBMTIxRjVCMTIzRjVCQTI0OENBRkNBNDEyRkVBQjdFN0VBMzdGCisxMjNGQTI2QzdFN0YwMDBGMTY0MDZEMTVDMDZDNkMxNDAzNkM2QzE0MDc2RDE0MUY2QzZDNkMxM0ZGNkNFQkUwMDc2REI2MTIKKzgwMDExRkVDRkUwMDZENUMwMTAzMTRGMDAxMDAxNDgwREExRkY4QzdGQzJBMzc3QkI1MzM+OTkKK0Q8RUUxRkUwQjNBRUVDN0Y4MDkwMzgwM0ZGRjAwMTBGMTNGQzQ5MTNGRjAxN0YxNDlGOTBCNjEyREY0ODkwMzhGMDBGRkY0OAorRUI4MDAzNEE3RUQ4MDdGQzdGNDg0ODE0N0Y0OTE0M0Y0ODQ4MTQxRkEyNDg1QTVCQTIxMjdGOTBDOEZDQTMxMkZFQUMxMjdGCitBNDZDN0VBMjdGMDAxRjE1M0Y3RjZDNkMxNDdGNkQxNEZGNkM2QzVCNkQ1QjZDNkM2QzVBNkM5MDM4RTAzRkRGNkM5MEI1MTIKKzlGNkQxNDFGNkQxM0ZFMDEwRjEzRjg2RDEzRTAwMTAwOTBDOEZDMkI1NjdCRDQzQj5JPEVDN0ZDMDkwMzgwMUZGRjgwMTA3CisxM0ZFMDExRjdGNDk4MDQ5ODA5MDM5RkZDMDdGRTA0ODkwMzgwMDBGRjBEODAzRkM2RDdFNDg0ODEzMDM0OTZEN0U0ODQ4MTMKKzAwMDAxRjE1N0U1QjQ5MTQzRTAwM0YxNTNGOTBDODdFNUFBMjEyN0VFRTBGODBBMkI4RkNBNjAwRkNDQUZDQTM3RUEyMTI3RQorQTMxMjdGN0U3RkEyNkM3RUEyNkM3RTZEMTU4MDZDNkMxNDAzNkM2QzE0MDc2RDE0MUY2QzZDNkMxM0ZGNkNFQkYwMEY2REI2CisxMjAwNkQxNEZDMDEwRjVDMDEwMzE0RTAwMTAwOTFDN0ZDRUMxRkYwMjkzNzdCQjUzMz5JPDkxMzgwMUZGQzAwMjBGMTNGOAorNUMxNDdGOTFCNUZDNUI0OTEzMDBEOTA3RkMxMzA4MDJGMDEzMDA0OTVBNDk1QUEyNDk1QUE0MTM3RkIyQjYxMkZDQTYyNjAwCis3RjgwQzdGQ0IzQjNBQTI1NTY3RUQ1MjM+STxEQTNGQzBFQjFGQzA5MTM5RkZGMDAxRkYwMTAzRUJGQzBGMDEwRkQ5RkY3RgorMTNFMDQ5OTFCNUZDNUI5MDI2N0ZFMDdGRUJGMDAwOTEyNjAwMEZGOEM3RkMwMUZFNkQ1QTQ4NDg2RDdFNDkxMzAxMDAwMzgxCis0OTEzMDBBMjAwMDc4MTQ5MTQ3RUE4NkQxNEZFMDAwMzVEQTI2RDEzMDEwMDAxNUQ2RDEzMDM2QzZDNDk1QTAxN0Y0OTVBOTAKKzM4RkZFMDdGNDg5MEI1NUE1RTQ4OTJDOEZDMDFFMzEzRkMwMUUwMTNGMDAwMDdFQjNGQzA5MUNBRkNBNTdGMTIwMzEzRkM5MAorQjYxMkMwNkMxNUZFNkM2RjdFMTdFMDQ4MTZGODAwMDc4MjQ4ODJEODFGRjhDNzEyN0YwMUUwRUMwN0ZGNDg0ODAyMDExMzgwCis0ODQ4RUMwMDdGOTBDOTEyM0YxOEMwMDBGRTE2MUZBNjAwN0ZFRTNGODA2RDE1N0Y2RDE1RkY2QzZDNEExMzAwRDgxRkY4RUMKKzA3RkVEODBGRkVFQzFGRkMzQjA3RkZFMDAxRkZGODZDOTBCNjVBQzYxNkMwNkQ1RDAxMUY0QUM3RkMwMTAzMTRGMDkwMjYwMAorMUZGRUM4RkMzMzRFN0RCNDM5Pkk8QjRGQ0IzQUVFQzBGRjhFQzdGRkY0OUI1MTJDMDAxMDcxNEUwNDkxNEYwNDkxNEY4OTAKKzM4M0Y4MDdGOTAzOTdFMDAxRkZDNDkxMzA3NDlFQjAzRkU1QjQ5MTMwMTE2RkY0OTdGQTI1QkE0OTBDOEZDQjNCMDI4NTU3NworRDQzQj5JPEVBRkY4MEE5QzdGQ0IyRUE3RjgwQjNCM0IwMDk0Rjc4Q0UxQj5JPEVDM0ZFMEE5OTFDN0ZDQjJFQzFGRTBCM0IzCitCM0FBRUMzRkMwQTIwMDQwMTM3RjAwNzBFQkZGODBFQTc4MDFEOEZGOEYxMzAwRUJGRkZFQTI2QzVCMDAxRjVCMDAwNzEzRTAKKzM4MDA3RjgwMUI2Nzg3Q0UxRT5JPDEyRkZCM0IzQjNCM0FEMDg1NTc3RDQxQj4xMDggRDxFQzBGRjhCNEVCN0ZGRjQ5QjUxMgorQzAwMTA3MTRFMDQ5MTRGMDQ5MTRGODkwMzgzRjgwN0Y5MDM5N0UwMDFGRkM0OTEzMDc0OUVCMDNGRTVCNDkxMzAxMTZGRjQ5Cis3RkEyNUJBNDkwQzhGQ0IzQjAyODM1NzdCNDNCPjExMCBEPEVDMEZGMDkxQjVGQzAxMDMxNEMwMDEwRjE0RjA0OTgwNDk4MAorOTAzOTdGRjAwRkZFOTAzOUZGODAwMUZGNDg5MEM3MTM4MEQ4MDNGQ0VDM0ZDMDQ4NDhFQzFGRTA0OTE0MEY0ODQ4RUMwN0YwCitBMjQ4NDhFQzAzRjg0OTE0MDEwMDNGMTZGQ0EyNDhDOTEyRkVBMzAwN0UxNjdFMDBGRTE2N0ZBQjZDMTZGRjZDMTZGRUEzNkQKKzE0MDEwMDNGMTZGQzZEMTQwMzAwMUYxNkY4NkQxNDA3NkM2Q0VDMEZGMEEyNkM2Q0VDMUZFMDZDNkNFQzNGQzAwMUZGMTRGRgorNkNEOUMwMDMxMzgwNkNEOUYwMEYxMzAwNkRCNTVBMDExRjE0Rjg2RDVDMDEwMzE0QzAwMTAwOTFDN0ZDRUMxRkY4MzAzNzdDCitCNTM5Pkk8RUMxRkYwQjRFQkZGRkMwMTAzMTNGRjAxMEY4MDQ5ODAwMTdGODA0OUM2N0YwMUZDRUIzRkY4MDFGMEVCMEZGQworNDkxMzA3NDk2RDdFNDk2RDdFODE5MEM4RkNFRTdGODBBMkVFM0ZDMEEyMTYxRkEzMTdFMDE2MEZBQTE2MUYxN0MwQTMxNjNGCisxNzgwMTY3RkEyRUVGRjAwNkQ1QjVFNkQxMzAzNkRFQjBGRkM2RDQ5NUE2REVCN0ZGMDkwMzlGRTAxRkZFMDAxN0ZCNTVBNkQKKzVDNkQ5MUM3RkMwMTA3NUIwMTAxMTNGODkwMzgwMDNGQzA5MUM5RkNCM0E0MkI0Qzc2QjQzQj5JPEVDMDNFMDAwRkUxMzFGCisxNDdGRUIwMUZGNUIxMzBGNUI5MDM4M0ZGQzAwMTRFMEVCN0Y4MDQ5QzdGQzZDNUE1QjVCNUI1QkEyNUJBMjVCQTQ5MEM4RkMKK0IzQUMxQjM1NzdCNDI3PjExNCBEPDkwMzgwN0ZGODAwMTNGMTNGODkwQjZGQzQ4MTVDMDAwMDcxNUUwNUFFQkZDMDBEODFGCitFMEVCMEZDMDQ4NDgxMzAzNDkxMzAwMTYwMDQ4QzlGQ0E2N0ZBMjZDN0UxM0YwRUExRkZDRUJGRkMwNkMxM0ZFNkNFQkZGQzAKKzZDMTRGMDZDMTRGQzZDNkM3RjZEN0YwMTA3MTQ4MEQ5MDA3RjEzQzAwMjAzMTNFMEVDMDA3RkVEMUZGMDE1MEZFRDA3RjhBMgorMTUwM0E2MDA0MEVDMDdGMDEyNzAwMDc4MTQwRjAwN0UxNUUwRDhGRkMwMTMzRjkwMzlGQzAxRkZDMDkwQjYxMjgwNkMxNTAwCiswMDFGNUMwMDAzNUNDNjZDMTNGMDAxMDc5MEM3RkMyNTM3N0RCNTJDPkk8RUI3RjgwQUZCNzEyODBBNjI2MDA3RjgwQzdGQworQjNCMzZFMTM0MEVEMDFDMDkwMzgzRkUwMDM5MTM4RjAxRkUwOTFCNUZDN0Y2RDE0ODBFREZFMDAwMTAzMTNGMDZEOTBDN0ZDCisyMzQ0N0VDMjI5Pkk8QjQxNUZGQjNCM0EyNURBMjVEQTI1RDZENUIwMDdGNUM2RDEzN0Y5MDM4RjgwM0ZFNkNCNTVBNUQ2QworMTRFMDZDMTQ4MDAwMDM0OTVBQzYwMUUwMTMwMDI4MzU3N0IzM0I+STwwMEZFMTZGRTdFNkNFRDAxRkNBMjdGMDAzRkVEMDMKK0Y4N0YwMDFGMTUwNzE3RjA2QzdFRUUwRkUwN0YxMjA3NkRFQzFGQzAxMjAzRUUzRjgwN0YxMjAxNkRFQzdGMDAxMjAwMTZGRQorMTM3RkEyNkU0ODVBMTMzRjVFOTAzODFGQzAwM0EyMDEwRjVDRUNFMDA3NUVFQjA3RjAxNTBGMDEwMzVDMTRGODRCNUExMzAxCisxNEZDMDEwMDQ5QzdGQ0EyMTQ3RTE1N0VBMkVDM0U3QzE0M0YxNDFGNUQxNDBGNURBMjE0MDc1REEyNUQxNDBGQTI1RDE0MUYKKzkyQzhGQzVDQTIxNDNFMTQ3RTE0N0MxNEZDQTI0OTVBQTIzODMwMDNGMEVBM0UwNzM4M0ZGRkUwNUNBMjVDOTFDOUZDRUEwNworRkMyRjRDN0VCMzM0PjEyMSBEPDkwMzk3RkMwMDNGRUE5OTBDQUZDQUNFQzBGRjA5MUI1RkMwMTAzMTRDMDAxMEYxNEYwNDkKKzgwNDk4MDkwMzk3RkYwMEZGRTkwMzlGRjgwMDFGRjQ4OTBDNzEzODBEODAzRkNFQzNGQzA0ODQ4RUMxRkUwNDkxNDBGNDg0OAorRUMwN0YwQTI0ODQ4RUMwM0Y4NDkxNDAxMDAzRjE2RkNBMjQ4QzkxMkZFQTMwMDdFMTY3RTAwRkUxNjdGQUI2QzE2RkY2QzE2CitGRUEzNkQxNDAxMDAzRjE2RkM2RDE0MDMwMDFGMTZGODZEMTQwNzZDNkNFQzBGRjBBMjZDNkNFQzFGRTA2QzZDRUMzRkMwMDEKK0ZGMTRGRjZDRDlDMDAzMTM4MDZDRDlGMDBGMTMwMDZEQjU1QTAxMUYxNEY4NkQ1QzAxMDMxNEMwMDEwMDkxQzdGQ0VDMUZGOAorMzA0QzdDQ0EzOT4yNDYgRCBFCislRW5kRFZJUFNCaXRtYXBGb250CislRFZJUFNCaXRtYXBGb250OiBGdCBlY3NpMTIwMCAxMiA4CisvRnQgOCAxMTYgZGY8RUEzRkMwRUE3RjgwQTVFQUZGMDBBMjBBMDg3Nzg3MUI+NDYgRDxFRDdGODA5MTM4MDNGRkYwMDIwRgorMTNGQzAyM0Y3RjRBN0Y5MUI2MTI4MDAxMDMxMzgxOTAzQTA3RkMwMDdGQzA0QTEzM0ZEOTBGRTBFQjFGRTA0OTQ4MTMwRjQ5Cis1QUEyNDlDN0VBMDdGMDEzN0UxM0ZFNUIxMjAxNUIxMjAzQTI0ODVBQTM0ODVBMTdFMEEyNDkxNDBGMTIxRkE0NDg0OEVDMUYKK0MwQTQ0OEM4RUEzRjgwQTVFRTdGMDAxMkZFQTIxNkZFQTM0QjVBQTM0QjVBQTI0QjVBQTI0QjVBQTI2QzRBNUE2QzRBNUExNQorN0Y2RDQ5QzdGQzZDNkM0ODVBOTAzOEUwMDdGQzkwMzhGODFGRjg2Q0I1NUE2QzVDNkM1QzZDOTFDOEZDQzYxM0ZDRUIxRkUwCisyQzQ1NzdDMjMxPjQ4IEQ8RUQwM0ZFOTIzODFGRkZDMDAzN0YxM0YwNEFCNTEyRTAxNDA3NUM5MTM4M0ZGQzAzOTEzOTdGRTAKKzAwNjBEQUZGODAxMzAwNDk5MEM4RkNFQjAzRkM0OTVBNDk1QTVDMTMxRjQ5NUE0OTVBOTFDOUZDNUI1QjEyMDE0OTEzMDgwMAorMDM5MDM4MDNGRjgwRDlGODFGMTNFMDAwMDcwMTdGN0Y0OUI1N0VFQTBGRjMwMUY3ODA5MDM4RUZFMDBGM0ExRkZGODAwM0ZFCitFQzAwMDE0OTgwNDg0ODdGNUI1QjVCMDA3RkVEN0Y4MDVCQTI0OTE1MDA1RUEzNDhDOEZDQTM0QjVBQTM1RTE1MDNBMjRCNUEKK0EyNEI1QTdFNEI1QTZENDk1QTRCNUEwMDNGMTRGRjZENDg5MEM3RkM2QzZDNDg1QTkwMzhGODFGRkM2Q0I1MTJGMDZDNUM2QworNUM2QzkxQzhGQzZDMTNGQ0VCMUZFMDJDNDU3N0MyMzE+NTQgRDw0OUI2MTJGMDQ5MTVGRUVGRkZDMDE4RjA4NDQ5ODIwMkY4CitDNzZDN0VFRjBGRkYwNTAzMTM4MDE3MDA0OTQ4RUQ3RkMwQTJGMDNGRTBBMzQ5NDgxNTFGQTMxODNGMTlDMDQ5NUExODdGMTkKKzgwMThGRjQ5NDg0QTEzMDA0RDVBMTcwNzRENUFFRjNGRjg0OUM4QjQ1QTA0MEYxM0MwOTFCNzVBNERDN0ZDMTdGODQ4MTZFMAorOTRDOEZDMTZGQzkwMzhGRTAwMDE0ODQ4ODBBMjE1MDA4MjgyNDg0ODgxQTIxNjNGODNBMjQ4NDgxNDFGODNBMjcwN0VBMjQ4Cis1QTcwN0VBMjE2MDM0ODQ4ODFBMjE2MDE4M0EyNDg0ODZFN0VBMzcxN0VBMjQ4QzlGQzcxN0UzQjQ1NzdDNDNGPjgyCitEPEVDMEZGQzkxQjUxMjgwMDEwMzE0QzAwMTFGMTRGMDQ5MTRGOEEyOTAzOTdGRTAwRkZDOTEzODAwMDNGRTEzNzgwMTYwMTMKKzAxOTBDN0ZDMTZGRjgxQTNFRDAxRkVBNUVEMDNGQ0VDMEZGRjQ5QjVGQzEzMEYxMzNGOTBCNjEyRjgwMDAzRUJGQzA3NDgxMworODAzODBGRkMwMEVBMUZGMEQ4M0ZDMEVCMEZGMDVCNDhDN0ZDQTIwMEZFRUMxRkUwQTIxNTNGN0UxNUZGRDk4MDAzMTNDMDM4Cis3RkYwMUY5MEI2RkNBMjZDMTQzRjZDOTAzOEZDN0Y4MDZDMTNFMEQ4MDNGRUM4RkMyODJGN0FBRDJGPjk3CitEPEVDMDdGOEVDM0ZGRTkxQjUxMjgwMDEwMzE0QzA0OTE0RTA0OTE0RjA5MDM4M0ZGODFGOTAzOTdGQzAwN0Y4OTAzOEZGODAKKzAzOTAzOEZFMDAwMTQ4NUE0ODQ4RUIwMEZDNDg1QUEyNDg1QTQ5MTQ3QzEyMUY1QjQ4QjYxMkZDMTZGOEEyNUFBMzAwN0VDOQorRkMxMkZFQTgxMjdGQTM2RDE0NDA2QzZDRUIwMUMwNkQxMzA3NkM2Q0VCM0Y4MDM5MEZGQzAxRkY5MEI2RkM2QzE1MDA2QzE0CitGQ0M2MTRGMDAxM0YxMzgwRDkwRkZDQzdGQzI2MkY3OUFEMkI+MTAxIEQ8RUIwMUZFQTVFQjAzRkNBNEVCMDdGOEE1RUIwRgorRjBBNUVCMUZFMEE1RUIzRkMwQTRFQjdGODBBNUVCRkYwMEE1NDg1QUE0NDg1QUE1NDg1QUE1NDg1QUE1NDg1QUE0NDg1QUE1Cis0ODVBQTU0OEM3RkNBMjE3NDk3OUM4MTc+MTA4IEQ8RUMxRkY4OTFCNUZDMDEwMzE0QzAwMTBGMTRGMDQ5MTRGODQ5MTRGMAorOTAzODdGQzAxRjkwMzhGRjAwMDM0OUVCMDBFMDQ4NDgxNDYwMTYwMDQ4NUFBNDdGQTI3RkVCRkZFMDZDMTNGRUVDRkZDMDZDCisxNEYwNkQ3RjZEN0Y2RDdGMDEwNzdGMTMwMDAyMDcxMzgwMTQwMUVDMDA3RkEyMTUzRkEzRUQ3RjAwQTIxMjIwMDAzMDE0RkUKKzAwN0MxMzAxMDA3RjQ5NUE5MDM4RTAxRkY4QjY1QTVENkM1QzAwMUY1QzAwMDc0OUM3RkMzODAwN0ZFMDI1MkY3Q0FEMjU+CisxMTUgRCBFCislRW5kRFZJUFNCaXRtYXBGb250CislRFZJUFNCaXRtYXBGb250OiBGdSBlY3NzMjQ4OCAyNC44OCAxNQorL0Z1IDE1IDEyMiBkZls8RUFGRkUwQjNCM0IzQjNCM0IzQjNBNDkwQkIxMjgwQUE+NzMgMTQwCisxMDggMjY3IDEwMiA3NiBEWzxEOEZGRkU5QTM4MUZGRkMwNkQ2NUEzNkU2NEEzNkU5OUI1RkNBMjZFNjNBMjAxREY2NTZFMUIKKzAzMDFDRjY1QTI2RTFCMDdBMkQ5QzdGQzUxNUFBM0Q5QzNGRTUxNUFBM0Q5QzFGRjUxNUFBMzAxQzA2RDUwNUFBMjZGMUFGRgorMDI3RjY0QTI2RjYxMDIzRjY0QTI2RjYxMDIxRjYzNkYxOTA3MDIwRjYzQTI2RjE5MEYwMjA3NjNBMjZGMTkxRjAyMDM2MzZGCisxOTNGQTI2RTYzNzAxODdGQTI2RTYzNzAxOEZGMDM3RjYyQTI3MDVGMDMzRjk3QzdGQzcwNUZBMjAzMUY2MTcwMTcwN0EyMDMKKzBGNjE3MDE3MEZBMjZGNkM0RDVBQTIwMzAzNjE3MDE3M0ZBMjZGNjE3MTE2N0ZBMjZGNjE3MTE2RkYwNDdGNjA3MTVEQTIwNAorM0Y5NUM4RkM3MTVEQTIwNDFGNUY3MTE1MDdBMjA0MEY1RjcxMTUwRjA0MDc1RjcxMTUxRkEyMDQwMzVGNzExNTNGQTI3MDVGCis3MjE0N0ZBMjcwNUY3MjE0RkYwNTdGNUU3MjVCQTIwNTNGOTNDOUZDNzI1QkEyMDUxRjVENzIxMzA3MDUwRjVEQTI3MjEzMEYKKzA1MDc1REEyNzIxMzFGMDUwMzVENzIxMzNGNzE1REEyRjE4MDdGNzE1REEyRjFDMEZGMDY3RjVDQTIxOUUxMDYzRjkxQ0FGQworQTI5NTM4MUZGM0ZFQTMwNjBGNUIxOUZGQTI3MjVCQTI3MjVCQTM3MjVCQTM3MjVCOTZDQ0ZDQTM+MTIyCisxNDAgMTA3IDI2NyAxNjUgSVs8OTUzODBGRkZDMDREQjUxMkZFMDUwRkVDRkZDMDA1N0YxNUY4NENCNzEyRkUwNDA3NzA3RQorMDQxRjE3RTAwNDdGMTdGODRCQjkxMkZFNEI5MTI2RjgwMDdGN0Y0QjAyODAwMTA3ODAwMzFGMDFGQ0M4MTRFMDRCMDFFMDAzCisxRjdGNEIwMTgwMDMwNzdGNEI0OEM5MDAwMTdGNEE0OTcwN0Y0QTAxRjBFRjNGRkY0QTQ5NzE3RjRBNDk3MTdGNEE5MENCMDAKKzAzN0Y0QTQ4NzI3RjRBNDg3MjdGNEE0ODczN0U0QjE5M0Y0OTQ5NzM3RTQ5ODg0Qjg1NDk0OTczN0Y0OTkwQ0Q2QzdGQTI0OQorNDg3NDdGNDk0ODc0N0ZBMjQ5NDg3NTdFQTI0OTQ4NzU3RTRBMUIxRjQ4OEFBMjRBMUIwRjQ4OEE0QTg3NDgxRjgwOTFDRjdFCitBMjQ4MUZDMDQ5ODhBMjAwMUYxRkUwQTI0OTg4QTIwMDNGMUZGMEEyNDkxRDdGQTMwMDdGMUZGOEE0NDkxRDNGQTMwMEZGMUYKK0ZDQjA2RDFEN0ZBMzAwN0YxRkY4QTU2RDFERkZBMjAwM0YxRkYwQTM2RDY0MDAxRjFGRTBBMjZENjRBMjZDMUZDMEEyNkU2MworNkMxRjgwNkU2M0EyNkMxRjAwNkU2M0EyNkM2RDUxNUFBMjZDNkQ1MTVBQTI2RDZDNTE1QUEyNkQ2QzUwNUJBMjZENkM1MDVCCis2RDZENEY1QkEyNkQ2RDRGNUI2RjYxNkQ2RDRGOTBDN0ZDNkQ2RDRGNUE2RDY0NkYxOUZGNkU2QzRFNUI2RTZDNEU1QjZFNkQKKzRENUI2RTAxRTAwNTFGNUI2RTZENEQ1QjZFNkQ0RDkwQzhGQzZFMDFGRTRDNDg1QTZFNkQ0QzVCNkYwMUMwMDMwRjVCNkYwMQorRjAwMzNGNUI2RjAxRkM5MkI1NUEwMzA3RDlGRjgwMDEwNzE0ODA2RjAyRjgwMTdGOTFDOUZDNkY5MUI3NUE2RjZDMTdGODA0CisxRjE3RTAwNDA3MTc4MDA0MDE0Q0NBRkM3MDZDMTVGODA1MEYxNUMwMDUwMTRBQ0JGQ0REMDAwRjEzQzA+MTE4CisxNDYgMTE4IDI3MCAxMzkgNzkgRFs8QjkxMkUwMThGRjE5RTAxOUZDMTlGRjFBQzAxQUYwMUFGQzg2MDFFMEM5NkU3RTA2MDcKKzgwMDYwMDgwMDczRjdGMDcwRjdGMDcwMzdGMDcwMDdGNzQ3RTg2MDgwRjEzODA3NDEzQzA3NDEzRTBBMjc0MTNGMDg2MUNGOAorMUI3RkYzM0ZGQ0EyMUIxRjFDRkVBMjFCMEZBMzFDRkZBMjg3QTc2M0EyMUNGRUEzMUIxRkEyMUNGQzFCM0ZBMkYzN0ZGODFCCitGRjFDRjA2MjUwMTNFMEEyNTAxM0MwNTAxMzgwMDgzRjEzMDA2MjUwNUEwNzAzNUIwNzBGNUIwNzNGNUI5NkI1NUEwNjA3NUMKKzk1QjY1QTkwQkE0OEM3RkM2MjFBRjAxQUMwOTdDOEZDMTlGQzE5RTA5NkM5RkMxOEUwMDFFMENFRkNCM0IzQjNBNz44OAorMTQwIDEwNyAyNjcgMTIwIElbPDkzMzgwN0ZGRjg5M0I2MTJFMDAzMDcxNUZFMDMzRkVERkZDMDkyQjgxMkYwMDIwMzE3RkMKKzAyMEYxN0ZGNEExOEMwMDI3RjE4RjA5MUJBMTJGQzQ5OTEyNkZDMDAwNzgwNDkwMkMwRUIwMDNGNDk0OUM4MTIwMzQ5MDFGMAorMDMwMDVCNDk0OTE2MUY0OTAxODAxNjA3NDk0OENBMTIwMzRBMTcwMDQ5NDgxODNDNDg0OTE4MTg0QTk1QzdGQzQ4NUJBMjQ4Cis1QjkxQ0VGQzVBNUJBMjQ4NUFBNDQ4NUFBOTdGQTIxMjFGQTI3RkEyNkM3RUEyODA2QzdGQTI2QzdGODA2QzdGMTRGRTZDN0YKKzZEN0Y2RDEzRTAxNUY4NkQxM0ZFNkRFQkZGRTA2RDE0RkM2REVDRkZDMDZEMTVGQzZENkNFQ0ZGODA2RTE1Rjg2RUVERkY4MAorMDIwNzE2RjAwMjAxMTZGQzZFNkMxNUZGMDMxRjE2QzAwMzAzODJEQjAwN0YxNUY4MDQwNzgxREMwMDdGODAwNTA3NkU3RTA1CiswMDgxMDYwRjgwMDYwMTgwRjAwMDNGMDcwRjdGNzM3RjA3MDE3RjczN0Y4NjA4MUYxMzgwQTI3NDEzQzA4Njc0MTNFMDg2MUMKK0YwODZBMkYzN0ZGOEEzMUIzRkEyMUNGQzFCMUZBQkYzM0ZGOEE0RjM3RkYwQTIxQkZGMUNFMDYyQTIwMDMwNEYxM0MwMTI3OAorMDA3QzRGMTM4MDAwN0Y2MTAxQzA0RTEzMDA2RDRFNUEwMUY4MTg3RkQ4RkZGRTRFNUE2RDZDMDQwMzVCMDJGMDRDNUI2QzAxCitGRTA0MUY1QjAwMUZEOUZGQzAwMzdGNUI2QzAyRkMwMjAzQjU1QTAwMDNEQUZGRjAwMTNGOTFDN0ZDQzY5MkI3NUE2RDYwMDEKKzFGMThGMDAxMDM2MDAxMDAxODgwMDIzRjRDQzhGQzAyMDcxNkY4REEwMDdGMTVFMDAzMDc0QUM5RkNEQjAwMUYxM0UwPjg2CisxNDYgMTIwIDI3MCAxMDUgODMgRDxFRDdGRkUwMjFGQjUxMkUwOTFCNjEyRjgwMTA3MTVGRTAxM0Y4MTkwQjgxMkMwMDAwMworODMwMDBGODM0ODgzREIwMDAzN0YwMkUwOTAzODAwN0ZGRTkxQzg2QzdFRDgwRkY4MDMwRjEzODAwMUUwODEwMTgwNkYxM0MwCiswMDBFQzlGQzAwMDg3MDEzRTBDQkZDMTlGMDE4N0ZBMkYwM0ZGOEE0RjAxRkZDQUZFRjNGRkYwNDNGQjVGQzAzMEZCNkZDMTUKKzdGMDIwN0I3RkMxNDFGOTFCOEZDMTMwMzAxMEY5MTM4RkMwMDFGNDk5MUM3RkM0OTEzRjA5MEI1MTI4MDQ4MDFGQ0M4RkM0OAorMTNGMDQ4MTNDMDQ4OTBDOUZDNUI0ODVBNDg1QTVCNDg1QTVCQTIxMkZGNUJBNDE4M0ZBMzZEMTY3RjE4RkY2QzdFNUY2RDVECis2RDE1MEZEODNGRkU1RDZENkMxNDdGNkMwMUUwMDEwM0I1RkMwMkZFMDEzRjEzREY2QzkwQjcxMjlGNkNFRUZFMUYxN0ZDNkMKKzE2RjA2QzE2QzA2Q0VERkUwMDAxM0YxNEYwNkQ5MUM3RkMwMTAzMDFDMDkxQzdGQzNFNUE3NUQ4NUI+OTcKK0Q8OTIzODAzRkY4MDAzM0YxM0Y4OTJCNTEyRkUwMjAzNkU3RTAyMEYxNUUwMDIzRjE1Rjg0QTgxOTFCNzdFNDk4MjQ5NDlDNgorODA0OTAxRTAwMTFGN0Y0OTAxODAwMTAzN0Y0OTkwQzc3RUQ5M0ZGQzZFNkM3RTQ5NDg2RjdFNEExNTFGNDk0ODZGN0U0ODQ5CisxNTA3NEE2RjdFNDg5MEM5RkM0OTE2MDEwMDA3NzE3RTVCMDAwRjg0NDkxODgwMTIxRjQ5MTczRkEyNDg0ODE4QzAxOTFGQTIKKzVCMTI3RkEyNDlFRjBGRTBBMjkwQkFGQ0JCRkNBNzkwQ0RGQ0E1N0ZBMzEyN0ZBMzdGQTMxMjNGN0ZBMjZDN0VBMzZDN0U3RgorMTIwNzdGMTIwMzdGNkM2RDE3MjA2RTE3NjA2QzZERUUwMUUwNkQ2QzE2MDM2RTE2MEY2RDZDRUUxRkYwNkQ2QzE2N0Y2RDZDCis2Q0VDMDFGRjZEMDFFMDE0MEYwM0Y4MDI3RjEzRTAwMTAxOTAyNkZGODAwRkI1MTJDMDZEOTFCNzEyMDA2RTVFNkUxNkY4MDIKKzBGMTZFMDZFNUUwMjAxNEJDN0ZDNkU2QzE0RjgwMzBGMTQ4MDAzMDAwMUYwQzhGQzQ0NUE3N0Q4NTQ+MTAxCitEWzxFQUZGRTBCM0IzQjNBNEVFRkZGMDAzMEYxM0ZGMDM3RjE0RTA0QUI2MTJGODRBODEwMjBGMTVGRjRBMTY4MDRBMTZDMAorOTFCODEyRTAwMUUxRUJGMDAzMDFFMzkwMjY4MDAwM0YxM0YwNEFDNzAwMDcxM0Y4RDlFN0Y4ODBEOUVGRjAxNDAwRDlGRkUwCitFRDdGRkM1QzRBRUQzRkZFMTgxRjkxQzlGQzQ5MTYwRkEyNDkxN0ZGQTI4NDVCQTM1QkE0NUJCM0IzQjNBMz42NAorMTQ2IDExMiAyNzMgOTcgMTA0IERbPEVBRkZFMEIzQjNCM0IzQjNCM0IzQjNBMj4xMSAxNDYKKzExMiAyNzMgNDQgMTA4IEQ8RUVGRkYwRDhGRkUwMDEwRjEzRkYwMzdGMTRFMDRBQjYxMkY4NEE4MTAyMEYxNUZGNEExNjgwCis0QTE2QzA5MUI4MTJFMDAxRTFFQkYwMDMwMUUzOTAyNjgwMDAzRjEzRjA0QUM3MDAwNzEzRjhEOUU3Rjg4MEQ5RUZGMDE0MDAKK0Q5RkZFMEVEN0ZGQzVDNEFFRDNGRkUxODFGOTFDOUZDNDkxNjBGQTI0OTE3RkZBMjg0NUJBMzVCQTQ1QkIzQjNCM0EzNDA1OAorNzBENzYxPjExMCBEPEVFN0ZGMDAzMDdCNUZDMDMzRjE0RTA5MkI2MTJGODAyMDMxNUZFMDIwRjZGN0U0QTgyMDI3RjE2RjAKKzkxQjg3RTQ5REE4MDBGN0Y0OTkwMjZGQzAwMDE3RjQ5MDFFMDkwMzgwMDNGRkY0OTAxODAwMjBGN0Y0OTQ4QzgwMDAzN0Y0OQorNDg2RjdGNEE4MTQ5NDg3MDdFNDk0ODcwN0U0QTE2MUY0ODQ5NzA3RTQ4OTBDQTZDN0U0OTE3MDMwMDA3ODU0OTgzMDAwRjFBCis4MDQ5ODNBMjQ4NDhGMDdGQzBBMjQ4NDhGMDNGRTBBMzQ5MTgxRjAwN0YxQUYwQTQ0OTE4MEYwMEZGMUFGOEFENkQxODFGQTIKKzAwN0YxQUYwQTM2RDE4M0ZBMjAwM0YxQUUwQTI2RDE4N0ZBMjZDNkNGMEZGQzBBMjZDNkM0RDEzODBBMjZENUYwMDA3MUEwMAorNkQ1RjZDNkQ0QzVBNkM2MTZFMTYxRjZDNkQ0QzVBNkQ2QzRDNUE2RTE2RkY2RDZDNEI1QjZEQjQwMzA3NUI2RDAxQzAwMjFGCis1QjZENkQ0QTkwQzdGQzZEMDFGQzQ5QjQ1QTZEOTAyNkZGODAwRjVCNkQ5MUI2NUE2RTVFNkU1RTAyMEYxNjgwMDIwMzRCQzgKK0ZDMDIwMDE1RjgwMzNGMTRFMDAzMDc5MUM5RkM5MjM4MDA3RkYwNEQ1QTc4RDg1RT5JPEVFM0ZGOEQ4RkZFMDAxMDdCNUZDCiswMzNGMTRDMDkyQjYxMkYwMDIwMzgxMDIwRjgxMDIzRjE1RkY0QTgyOTFCODdFMDFFM0VCRjAwMzAxRTc5MDI2ODAwMDdGN0YKK0Q5RUZGRUM3MDAwRjdGRDlGRkY4NkU3RjAyRTAwMjAxN0Y0QTgwNEE2RjdFOTFDOTEyMUY0OTgzNDk4MjQ5NzAxMzgwODQ0OQorMThDMDg0NDk3MDEzRTBBMjE5N0YxQUYwMTkzRkEzRjExRkY4QTMxOTBGQTMxQUZDQTIxOTA3QUQxOTBGMUFGOEE0MTkxRkEyCisxQUYwMTkzRkEyMTk3RjFBRTAxOUZGMUFDMDZENUVBMjZENEMxMzgwNjA2RDRDMTMwMEEyNkQ0QzVBNkQxNjNGNkU0QjVBNkUKKzRBNDg1QTZFNEE1QjZFMTQwRkQ5RUZGQzAyM0Y1QkQ5RTdGRjkxQjU1QTAxRTNEOUUwMEY1QzAxRTE5MEI3QzdGQzAxRTA1RQorMDIzRjVENkU1RDAyMDcxNUUwNkUxNTgwMDIwMDkyQzhGQzAzMUYxM0Y4MDMwMTEzQzA5MkNCRkNCM0IzQTM0NjgwNzBENzYxCis+STxFQzdGRjBCM0E3QkFGQ0E5QzdEODdGRjBDOUZDQjNCM0IzQTY4MUEzMDIzRjE2ODA2RjE0MDFGMDA3QzA2RjE0MUYxOAorN0Y5MTNBMUZGRjgwMDFGRkRDQzAxRjEzRTA2RTkwQjZGQ0EyNkUxNjgwRjBGRTAwNkUxNUY4NkUxNUUwNkU5MkM3RkMwMzNGCisxM0YwREIwRkZFQzhGQzNCNzE3REVGNDQ+MTE2IEQ8RDhGRkUwRUUwN0ZGQjNCM0IzQTg2MEEzNjBBMjYwQTI2MDZEOTNCNQorRkM1RjAwN0Y1RTZENUQ1RjZERUQzRkY3NkNCNEVERkZFNzAyQzAwMTAzMTNDNzZDMDFGODAxM0YxMzg3OTFCNzEyMDc2QzE2CitGRTZDMTZGODE3RTA2QzE2ODBDNkVERkUwMDZEMTRGMDAxMUYxNDgwMDEwMTAxRjBDOUZDNDA1ODcwRDY2MT5JPEQ4RkZDMAorRjAwM0ZGN0YwMDdGRjEwN0ZFN0YwMDNGMTkwRjZEMTlGQ0EyMDAxRkYxMUZGODdGMDAwRjE5M0Y2RDE5RjAxMjA3NkRGMDdGCitFMEEyNkMxOUZGNkUxOEMwN0U2RTRDMTM4MDdFNkU1RTFCMDAxMzdGNkU0QzVBMTMzRjZFMTYwRjAxMUY2MDgwNEY1QTEzMEYKKzZFMTYzRjAxMDc2MDgwNkQ0RDVBODFBMjZENEQ1QTgxNkQ0QzVCODExNDdGNEU5MEM3RkM4MTAyM0Y1RDZGNUQxNDFGNkY0QQorNUExNDBGQTI2RjRBNUExNDA3NkY0QTVBODBBMjZFNkQ0OTVBQTI3MDVDNkUxNUZGQTI2RjZDNDg1QkEyREIzRkYwOTFDOEZDCis1RjE1MUYwNEY4NUIxNzA3REIwRkZDNUJBMjAzMDcxMzBGMDRGRTVCMTUwMzRENUExNkZGODE0RDVBNkYxM0JGNjBFRTdGRkYKK0EyNjA4Mjk1QzlGQzgyQTI3MDVBQTI1RjE2MDdBMjRDNUFBMjVGMTYxRkEyNEM1QUEyNUYxNjdGQTI0QzVBQTI5NENBRkM1RAorQTI0QjVBQTI1RTE1MDdBMjRCNUFBMjRCNUFBMjRCNUFBMjRCNUFBMjRCNUEwMDFDNUIyNjFGRTAwNzkwQ0JGQzkwQjZGQzVECis1RDVEN0UxNUUwNUQwMDAzNUMyNjAwMEZGQ0NDRkM1MDgwN0RENjU3PjEyMSBEIEUKKyVFbmREVklQU0JpdG1hcEZvbnQKK2VuZAorJSVFbmRQcm9sb2cKKyUlQmVnaW5TZXR1cAorJSVGZWF0dXJlOiAqUmVzb2x1dGlvbiA2MDBkcGkKK1RlWERpY3QgYmVnaW4KKyUlUGFwZXJTaXplOiBBNAorIGVuZAorJSVFbmRTZXR1cAorJSVQYWdlOiAxIDEKK1RlWERpY3QgYmVnaW4gMSAwIGJvcCAwIDgzIDM5MDEgOSB2IDE4OTAgMzUxIGEgRnUoUHl0aG9uKTY0CitiKE9wKTUgYihlblNTTCk2NCBiKE1hbnVhbCkzNDQzIDUyMCB5IEZ0KFJlbGVhc2UpMzMgYigwLjYpMzE4OQorODc0IHkgRnMoTWEpbShydGluKWsoU2pcMzY2Z3JlbikzMjg2IDEyMjkgeSBGcigxNHRoKTI4CitiKE1hcmMpbihoKWUoMjAwNSkzMzAxIDEzNzUgeSBGcShtYSluKHJ0aW5Ac3RyYWt0LmNvbSkxNzgxCisxNTk3IHkgRnAoQWJzdHJhY3QpMjA4IDE3NDEgeSBGbyhUaGlzKTMyIGIobW8pcihkdWxlKWYoaXMpaChhKWcocmF0aGVyKQorZyh0aGluKWYod3JhcHApcihlciloKGFyb3VuZClnKFwoYSlnKHN1YnNldClmKG9mKTYgYihcKSkzMgorYih0aGUpZyhPcClyKGVuU1NMKWUobGlicmFyeSktNiBiKC4pNTIgYihXaXRoKTMyIGIodGhpbilmKHdyYXBwKXIoZXIpCisyMDggMTgzMyB5KEkpZChtZWFuKWgodGhhdClmKGEpaShsb3QpZihvZiloKHRoZSlmKG9iKXQoamVjdCloKG1ldGhvKXIKKyhkcyllKGRvKWgobm90aGluZylnKG1vcmUpZyh0aGFuKWcoY2FsbGluZyloKGEpZyhjb3JyZXNwKXIob25kaW5nKWcKKyhmdW5jdGlvbilmKGluKWcodGhlKTIwOCAxOTI0IHkoT3ApcihlblNTTCkyNCBiKGxpYnJhcnkpLTYKK2IoLikwIDIxOTggeSBGcyhDb250ZW50cykwIDIzODEgeSBGbigxKTc3IGIoSW4pbSh0cm8pcyhkdWN0aW9uKTMyMDEKK2IoMikwIDI1NjQgeSgyKTc3IGIoQnVpbGRpbmcpMzAgYihhbmQpaShJbnN0YWxsaW5nKTI3NjUKK2IoMikxMjUgMjY2MyB5IEZyKDIuMSk4MyBiKEJ1aWxkaW5nKTI4IGIodGhlKWcoTW8pcihkdWxlKWcob24pZihhKWcKKyhVbml4KWgoU3lzdGVtKTg3IGIoLik0MSBiKC4paCguKWYoLiloKC4pZiguKWgoLilnKC4pZiguKWgoLilmKC4paCguKWYKKyguKWgoLilnKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilnKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pCisxMzQgYigyKTEyNSAyNzYzIHkoMi4yKTgzIGIoQnVpbGRpbmcpMjggYih0aGUpZyhNbylyKGR1bGUpZyhvbilmKGEpZworKFdpbmRvKW4od3MpZyhTeXN0ZW0pNTkgYiguKTQxIGIoLiloKC4pZiguKWgoLilnKC4pZiguKWgoLilmKC4paCguKWYoLikKK2goLilnKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilnKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pMTM0CitiKDMpMCAyOTQ2IHkgRm4oMyk3NyBiIEZtKE9wZW5TU0wpMjggYiBGbihcMDI2KTMzIGIoUHl0aG9uKWYoaW4pbQorKHRlcmZhY2UpaCh0byllKE9wKXMoZW5TU0wpMjAzMCBiKDMpMTI1IDMwNDUgeSBGcigzLjEpODMKK2IgRm0oY3J5cHRvKTI2IGIgRnIoXDAyNiloKEdlbmVyaWMpZyhjcnlwdG9ncmFwaGljKWYobW8pcihkdWxlKTc5CitiKC4pNDIgYiguKWYoLiloKC4pZiguKWgoLilnKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZyguKWYoLiloKC4pZiguKQoraCguKWYoLiloKC4pZiguKWgoLilnKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pMTM0IGIoMykzMTUKKzMxNDUgeShYNTA5KTI3IGIob2IpNSBiKGplY3RzKTczIGIoLik0MiBiKC4pZiguKWgoLilmKC4paCguKWcoLilmKC4paAorKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZyguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWcoLilmKC4paCguKWYoLikKK2goLilmKC4paCguKWcoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWcoLilmKC4paCguKWYoLiloKC4pZgorKC4paCguKTEzNCBiKDUpMzE1IDMyNDQgeShYNTA5TmFtZSkyNyBiKG9iKTUgYihqZWN0cyk1NworYiguKTQxIGIoLiloKC4pZyguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZyguKWYoLiloKC4pZiguKWgoLikKK2YoLiloKC4pZyguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWcoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilmKC4paAorKC4pZyguKWYoLiloKC4pZiguKWgoLilmKC4paCguKTEzNCBiKDYpMzE1IDMzNDQgeShYNTA5UmVxKTI3CitiKG9iKTUgYihqZWN0cyk2MCBiKC4pNDIgYiguKWYoLiloKC4pZyguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWYoLiloCisoLilnKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZyguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWcoLilmKC4paCguKQorZiguKWgoLilmKC4paCguKWYoLiloKC4pZyguKWYoLiloKC4pZiguKWgoLilmKC4paCguKTEzNAorYig2KTMxNSAzNDQ0IHkoWDUwOVN0b3JlKTI2IGIob2IpNSBiKGplY3RzKTc4IGIoLik0MQorYiguKWgoLilnKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilnKC4pZiguKWgoLilmKC4paCguKWYoLiloCisoLilnKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZyguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZyguKQorZiguKWgoLilmKC4paCguKWYoLiloKC4pMTM0IGIoNikzMTUgMzU0MyB5KFBLZXkpMjggYihvYik1CitiKGplY3RzKTU4IGIoLik0MiBiKC4pZiguKWgoLilmKC4paCguKWcoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilmKC4paAorKC4pZyguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWcoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilnKC4pZiguKWgoLikKK2YoLiloKC4pZiguKWgoLilmKC4paCguKWcoLilmKC4paCguKWYoLiloKC4pZiguKWgoLikxMzQKK2IoNykzMTUgMzY0MyB5KFBLKW4oQ1M3KTI3IGIob2IpNSBiKGplY3RzKTU5IGIoLik0MSBiKC4paCguKWYoLiloKC4pZworKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilnKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZyguKWYoLikKK2goLilmKC4paCguKWYoLiloKC4pZyguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZyguKWYoLiloKC4pZgorKC4paCguKWYoLiloKC4pMTM0IGIoNykzMTUgMzc0MyB5KFBLKW4oQ1MxMikyNyBiKG9iKTUKK2IoamVjdHMpODEgYiguKTQyIGIoLilmKC4paCguKWcoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWcoLilmCisoLiloKC4pZiguKWgoLilmKC4paCguKWcoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilnKC4pZiguKWgoLilmKC4paCguKQorZiguKWgoLilmKC4paCguKWcoLilmKC4paCguKWYoLiloKC4pZiguKWgoLikxMzQgYig3KTMxNQorMzg0MiB5KFg1MDlFeHRlbnNpb24pMjcgYihvYik1IGIoamVjdHMpMTAyIGIoLik0MSBiKC4paCguKWYoLiloKC4pZiguKWgKKyguKWYoLiloKC4pZyguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWcoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilnKC4pCitmKC4paCguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWcoLilmKC4paCguKWYoLiloKC4pZiguKWgoLikxMzQKK2IoNykzMTUgMzk0MiB5KE5ldHNjYXApcihlU1BLSSkyOCBiKG9iKTUgYihqZWN0cyk1OCBiKC4pNDIKK2IoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWcoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilnKC4pZgorKC4paCguKWYoLiloKC4pZiguKWgoLilnKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilnKC4pZiguKWgoLikKK2YoLiloKC4pZiguKWgoLikxMzQgYig3KTEyNSA0MDQxIHkoMy4yKTgzIGIgRm0ocmFuZCkyNgorYiBGcihcMDI2KWkoQW4pZyhpbiluKHRlcmZhY2UpZih0bylnKHRoZSloKE9wKXIoZW5TU0wpZyhwc2V1ZG8pZgorKHJhbmRvbSlnKG4pbih1bSluKGIpcihlcilnKGdlbmVyYXRvcik1MCBiKC4pNDEgYiguKWgoLilmKC4paCguKWcoLilmCisoLiloKC4pZiguKWgoLilmKC4paCguKTEzNCBiKDgpMTI1IDQxNDEgeSgzLjMpODMgYiBGbShTU0wpMjcKK2IgRnIoXDAyNilnKEFuKWkoaW4pbih0ZXJmYWNlKWQodG8paSh0aGUpZyhTU0wtc3ApcihlY2lcMDM0YylmKHBhcnRzKWcKKyhvZiloKE9wKXIoZW5TU0wpNjQgYiguKTQyIGIoLilmKC4paCguKWcoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilmKC4pCitoKC4pZyguKWYoLiloKC4pZiguKWgoLilmKC4paCguKTEzNCBiKDgpMzE1IDQyNDEgeShDb24pbih0ZXh0KTI4CitiKG9iKTUgYihqZWN0cyk5OCBiKC4pNDIgYiguKWYoLiloKC4pZyguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWYoLiloCisoLilnKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZyguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWcoLilmKC4paCguKQorZiguKWgoLilmKC4paCguKWYoLiloKC4pZyguKWYoLiloKC4pZiguKWgoLilmKC4paCguKTkzCitiKDEwKTMxNSA0MzQwIHkoQ29ubmVjdGlvbikyNyBiKG9iKTUgYihqZWN0cykxMDggYiguKTQyCitiKC4pZyguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZyguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWcKKyguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWcoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWcoLilmKC4pCitoKC4pZiguKWgoLilmKC4paCguKTkzIGIoMTEpMCA0NTIzIHkgRm4oNCk3NyBiKEluKW0odGVybmFscykzMzEwCitiKDEzKTEyNSA0NjIzIHkgRnIoNC4xKTgzIGIoRXhjZXB0aW9ucylpKC4pNDEgYiguKWgoLilmKC4paCguKWYoLiloKC4pZworKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilnKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZyguKWYoLikKK2goLilmKC4paCguKWYoLiloKC4pZyguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZyguKWYoLiloKC4pZgorKC4paCguKWYoLiloKC4pOTMgYigxMykxMjUgNDcyMiB5KDQuMik4MyBiKENhbGxiYWMpbihrcyk2OAorYiguKTQyIGIoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilnKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZiguKWgoLikKK2coLilmKC4paCguKWYoLiloKC4pZiguKWgoLilnKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZyguKWYoLiloKC4pZgorKC4paCguKWYoLiloKC4pZiguKWgoLilnKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pOTMKK2IoMTMpMTI1IDQ4MjIgeSg0LjMpODMgYihBKW4oY2Vzc2luZykyNyBiKFNvKXIoYyluKGspbihldClnKE1ldGhvKXIoZHMpCis4MiBiKC4pNDIgYiguKWYoLiloKC4pZiguKWgoLilmKC4paCguKWcoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilnKC4pZgorKC4paCguKWYoLiloKC4pZiguKWgoLilnKC4pZiguKWgoLilmKC4paCguKWYoLiloKC4pZiguKWgoLilnKC4pZiguKWgoLikKK2YoLiloKC4pZiguKWgoLik5MyBiKDE0KXAgMCA0OTY5IFYgZW9wIGVuZAorJSVQYWdlOiAyIDIKK1RlWERpY3QgYmVnaW4gMiAxIGJvcCAwIDg1IGEgRnMoMSkxMTQgYihJbnRybylzKGR1Y3Rpb24pMAorMzE0IHkgRnIoVGhlKTQxIGIocmVhc29uKWYodGhpcylpKG1vKXIoZHVsZSlnKGV4aXN0cylmKGF0KWcoYWxsKWcoaXMpZworKHRoYXQpaCh0aGUpZyhTU0wpZihzdXBwKXIob3J0KWcoaW4paCh0aGUpZyhzbylyKGMpbihrKW4oZXQpZShtbylyCisoZHVsZSlpKGluKWYodGhlKWgoUHl0aG9uKWcoMi4xKTAgNDE0IHkoZGlzdHJpYnV0aW9uKTI4CitiKFwod2hpYyluKGgpZihpcyloKHdoYXQpZih3KW4oZSloKHVzZWQsKWYob2YpaChjb3Vyc2UpZShJKWkoY2Fubm90KWYKKyhzcClyKGVhaylnKGZvcilnKGxhdGVyKWcodiluKGVyc2lvbnNcKSlmKGlzKWgoc2V2KW4oZXJlbHkpZihsaW1pdGVkLikwCis1NjEgeShXaGVuKWcoYXNraW5nKWUoYWIpcihvdXQpaShTU0wpZihvbilnKHRoZSloKGNvbXAubGFuZy5wKW4oeXRob24pZQorKG5ld3Nncm91cClnKFwob3IpaChvbilnKHApbih5dGhvbi1saXN0QHApbih5dGhvbi5vcmdcKSllKHApcihlb3BsZSlqCisodXN1YWxseSkwIDY2MCB5KHApcihvaW4pbih0ZWQpMzcgYih5KW4ob3UpZih0bylnKHRoZSloKE0yQ3J5cHRvKWYocGFjKQorbihrKS01IGIoYWdlLik2MiBiKFRoZSkzNyBiKE0yQ3J5cHRvLlNTTCllKG1vKXIoZHVsZSlpKGRvKXIoZXMpZworKGltcGxlbWVuKW4odClnKGEpZihsb3QpaChvZilmKE9wKXIoZW5TU0wncykwIDc2MCB5KGZ1bmN0aW9uYWxpdCluKHkpYworKGJ1dClnKHVuZm9ydHVuYXRlbHkpZihpdHMpaChlcnJvcilkKGhhbmRsaW5nKWooc3lzdGVtKWYoZG8pcihlcylnKG5vdCkKK2goc2VlbSlmKHRvKWgoYilyKGUpZyhcMDM0bmlzaGVkLCloKGVzcClyKGVjaWFsbHkpZShmb3IpZyhub24tKTAKKzg2MCB5KGJsbylyKGMpbihraW5nKWYoSS9PLilnKEkpZyh0aGluaylpKHRoYXQpZihtKW4odWMpbihoKWYob2YpaCh0aGUpCitnKHJlYXNvbillKGZvciloKHRoaXMpaChpcylnKHRoYXQpZyhNMkNyeXB0bykyNjU5IDgzMAoreSBGbCgxKTI3MjUgODYwIHkgRnIoaXMpZyhkZXYpbihlbG9wKXIoZWQpZih1c2luZyloKFNXSUcpMzY0NworODMwIHkgRmwoMikzNjg0IDg2MCB5IEZyKC4pZyhUaGlzKTAgOTU5IHkobWFrKW4oZXMpMjIKK2IoaXQpaShhKW4od2t3KW4oYXJkKWQodG8paihjcmVhdGUpZShmdW5jdGlvbnMpaSh0aGF0KWYoZS5nLikzNQorYihjYW4pMjMgYihyZXR1cm4pZyhiKXIob3RoKWgoYW4pZihpbiluKHRlZ2VyKWcoYW5kKWcoTlVMTClnKHNpbmNlKWgKKyhcKGFzKWYoZmFyKWYoYXMpaChJKWgoa25vKW4od1wpKTAgMTA1OSB5KHkpbihvdSkzMCBiKGJhc2ljYWxseSlnCisod3JpdGUpZyhDKWgoZnVuY3Rpb25zKWcoYW5kKWcoU1dJRylnKG1hayluKGVzKWYod3JhcHApcihlcilmCisoZnVuY3Rpb25zKWkodGhhdCloKHBhcnNlcylkKHRoZSlpKFB5dGhvbilnKGFyZ3VtZW4pbih0KWYobGlzdCkwCisxMTU5IHkoYW5kKWQoY2FsbHMpZyh5KW4ob3VyKWcoQylnKGZ1bmN0aW9uLCloKGFuZClnKFwwMzRuYWxseSlmCisodHJhbnNmb3JtcylmKHkpbihvdXIpZyhyZXR1cm4paSh2KS01IGIoYWx1ZSkyNyBiKHRvKWcoYSloKFB5dGhvbilnKG9iKQorNSBiKGplY3QuKTAgMTQ4MCB5IEZzKDIpMTE0IGIoQnVpbGRpbmcpMzggYihhbmQpZihJbnN0YWxsaW5nKTAKKzE3MDkgeSBGcihUaGVzZSkyNyBiKGluc3RydWN0aW9ucylnKGNhbilnKGFsc28pZyhiKXIoZSloKGZvdW5kKWcoaW4pZworKHRoZSlnKFwwMzRsZSlmIEZtKElOU1RBTEwpcCBGciguKTAgMTg1NiB5KEkpaihoYSluKHYpbihlKWYodGVzdGVkKWgKKyh0aGlzKWgob24pZihEZWJpYW4pZyhMaW4pbih1eClnKHN5c3RlbXMpZihcKHcpbihvKXIobylyKGR5KWgoYW5kKWcKKyhzaWRcKSwpaChTb2xhcmlzKWUoMi42KWcoYW5kKWgoMi43Lik0MyBiKE90aGVycykzMCBiKGhhKW4odiluKGUpZgorKHN1Y2Nlc3NmdWxseSkwIDE5NTYgeShjb21waWxlZCllKGl0KWgob24pZyhXaW5kbyluKHdzKWYoYW5kKWcoTlQuKTAKKzIyMzUgeSBGaygyLjEpOTcgYihCdWlsZGluZykzMiBiKHRoZSloKE1vKXMoZHVsZSlmKG9uKWcoYSloKFVuaXgpZgorKFN5c3RlbSkwIDI0MzYgeSBGcihwKW4oeU9wKXIoZW5TU0wpMjcgYih1c2VzKWgoZGlzdHV0aWxzLClnKHNvKWYKKyh0aGVyZSlnKHJlYWxseSlmKHNob3VsZG4ndClpKGIpcihlKWcoYW4pbih5KWYocHJvYmxlbXMuKTM2CitiKFQpLTcgYihvKTI3IGIoYnVpbGQpaCh0aGUpZyhsaWJyYXJ5OikyMzYgMjY3NCB5IEZqKHB5dGhvbik0MQorYihzZXR1cC5weSlnKGJ1aWxkKTAgMjk2MiB5IEZyKElmKTMwIGIoeSluKG91cilmKE9wKXIoZW5TU0wpaChoZWFkZXIpZgorKFwwMzRsZXMpaChhcmVuJ3QpZihpbiloIEZtKC91c3IvaW5jbHVkZSlwIEZyKCwpYyh5KW4ob3UpaihtYSluKHkpZworKG5lZWQpaCh0bylnKHN1cHBseSlnKHRoZSlnIEZtKC1JKWYgRnIoXDAzNWFnKWgodG8pZihsZXQpaSh0aGUpZihzZXR1cCkKKzAgMzA2MSB5KHNjcmlwdCkyNSBiKGtubyluKHcpZyh3aGVyZSlmKHRvKWkobG8pcihvay4pMzUKK2IoVGhlKTI1IGIoc2FtZSlnKGdvKXIoZXMpZyhmb3IpZih0aGUpaShsaWJyYXJpZXMpZShvZiloKGNvdXJzZSwpZyh1c2UpCitnKHRoZSloIEZtKC1MKWYgRnIoXDAzNWFnLikzNSBiKE5vdGUpMjUgYih0aGF0KWggRm0oYnVpbGQpZAorRnIodyluKG9uJ3QpMCAzMTYxIHkoYWNjZXB0KWsodGhlc2UpaChcMDM1YWdzLCllKHNvKWgoeSluKG91KWcoaGEpbih2KW4KKyhlKWYodG8paShydW4pZihcMDM0cnN0KWggRm0oYnVpbGRfZXh0KTIzIGIgRnIoYW5kKTI4CitiKHRoZW4pZyBGbShidWlsZClwIEZyKCEpMzUgYihFeGFtcGxlOikyMzYgMzM5OSB5IEZqKHB5dGhvbik0MQorYihzZXR1cC5weSlnKGJ1aWxkX2V4dClnKC1JL3Vzci9sb2NhbC9zc2wvaW5jbHVkZSlqCisoLUwvdXNyL2xvY2FsL3NzbC9saWIpMjM2IDM0OTAgeShweXRob24pZChzZXR1cC5weSlnKGJ1aWxkKTAKKzM3NzcgeSBGcihObyluKHcpMjcgYih5KW4ob3UpZihzaG91bGQpaChoYSluKHYpbihlKWYoYSloKGRpcmVjdG9yeSlmCisoY2FsbGVkKWggRm0oT3BlblNTTClkIEZyKHRoYXQpayhjb24pbih0YWlucyllKGUuZy4pMzYKK2IgRm0oU1NMLnNvKTI1IGIgRnIoYW5kKWkgRm0oX19pbml0X18ucHkpYyBGcihzb21ld2hlcmUpaihpbikwCiszODc3IHkodGhlKWkoYnVpbGQpZyhkaWNyZWN0b3J5KS03IGIoLCkyNiBiKHNvKWgoanVzdDopMjM2Cis0MTE1IHkgRmoocHl0aG9uKTQxIGIoc2V0dXAucHkpZyhpbnN0YWxsKTAgNDQwMiB5IEZyKElmKTMyCitiKHkpbihvdSwpZihmb3IpZyhzb21lKWYoYXJjYW5lKWcocmVhc29uLClnKGRvbid0KWkodyluKGFuKW4odCllKHRoZSlpCisobW8pcihkdWxlKWYodG8pZyhhcHApcihlYXIpZihpbilpKHRoZSlmIEZtKHNpdGUtcGFja2FnZXMpMjYKK2IgRnIoZGlyZWN0b3J5KS03IGIoLCkzMSBiKHVzZSlnKHRoZSkwIDQ1MDIgeSBGbSgtLXByZWZpeCkyNAorYiBGcihvcHRpb24uKTAgNDY0OSB5KFkpLTcgYihvdSkyOCBiKGNhbiwpZihvZilnKGNvdXJzZSwpZyhkbykyMzYKKzQ4ODcgeSBGaihweXRob24pNDEgYihzZXR1cC5weSlnKC0taGVscCkwIDUxNzQgeSBGcih0bykyNworYihcMDM0bmQpaChvdXQpZyhtb3JlKWYoYWIpcihvdXQpZyhobyluKHcpZyh0byloKHVzZSlmKHRoZSloKHNjcmlwdC4pcAorMCA1MjQzIDE1NjAgNCB2IDkyIDUyOTcgYSBGaSgxKTEyNyA1MzIxIHkgRmgoU2VlKWMgRnEoaHR0cDovL3d3dy5wKXIKKyhvc3QxLmNvbS9ob21lL25ncHMvbTIvKTkyIDUzNzcgeSBGaSgyKTEyNyA1NDAwIHkgRmgoU2VlKWcKK0ZxKGh0dHA6Ly9zd2lnLnNvdXJjZWZvKW4ocmdlLm5ldC8pcCAwIDU1NDkgMzkwMSA0IHYKKzAgNTY0OSBhIEZnKDIpMjkyOCBiKDIpODMgYihCdWlsZGluZykyNyBiKGFuZClnKEluc3RhbGxpbmcpcAorZW9wIGVuZAorJSVQYWdlOiAzIDMKK1RlWERpY3QgYmVnaW4gMyAyIGJvcCAwIDgzIGEgRmsoMi4yKTk3IGIoQnVpbGRpbmcpMzIKK2IodGhlKWgoTW8pcyhkdWxlKWYob24pZyhhKWgoV2luZG8pbSh3cylmKFN5c3RlbSkwIDI4MworeSBGcihCaWcpMjYgYih0aGFua3MpZyh0byloKEl0YW1hcillKFNoKW4odHVsbC1UKS03IGIocmF1cmluZykyNQorYihhbmQpaShPbGVnKWUoT3JsbyluKHYpZyhmb3IpaCh0aGVpcilnKGhlbHApaCh3aXRoKWcoV2luZG8pbih3cylmCisoYnVpbGQpaChpbnN0cnVjdGlvbnMuKTM2IGIoU2FtZSkwIDM4MyB5KGFzKTI3IGIoZm9yKWcoVW5peCloKHN5c3RlbXMsKQorZih3KW4oZSlnKGhhKW4odiluKGUpZih0bylpKHNlcGFyYXRlKWUodGhlKWkgRm0oYnVpbGRfZXh0KWMKK0ZyKGFuZClqKHRoZSloIEZtKGJ1aWxkKXAgRnIoLikwIDUzMCB5KEJ1aWxkaW5nKWYodGhlKWgobGlicmFyeTopMjM2Cis3NjggeSBGaihzZXR1cC5weSk0MSBiKGJ1aWxkX2V4dClnKC1JKWYoLi4uXFxvcGVuc3NsXFxpbmMzMilqKC1MKWQKKyguLi5cXG9wZW5zc2xcXG91dDMyZGxsKTIzNiA4NjAgeShzZXR1cC5weSloKGJ1aWxkKTAKKzExNDcgeSBGcihXaGVyZSkyNyBiIEZtKC4uLlxcb3BlbnNzbCljIEZyKGlzKTI4IGIob2YpZihjb3Vyc2UpZyh0aGUpaAorKGxvKXIoY2F0aW9uKWUob2YpaSh5KW4ob3VyKWUoT3ApcihlblNTTClpKGluc3RhbGxhdGlvbi4pMAorMTI5NCB5KEluc3RhbGxhdGlvbilmKGlzKWcodGhlKWgoc2FtZSlmKGFzKWcoZm9yKWcoVW5peCloKHN5c3RlbXM6KTIzNgorMTUzMiB5IEZqKHNldHVwLnB5KTQxIGIoaW5zdGFsbCkwIDE4MTkgeSBGcihBbmQpMjggYihzaW1pbGFyaWx5KS03CitiKCwpMjcgYih5KW4ob3UpZyhjYW4pZyhkbykyMzYgMjA1NyB5IEZqKHNldHVwLnB5KTQxCitiKC0taGVscCkwIDIzNDQgeSBGcih0bykyNyBiKGdldCloKG1vcmUpZihpbmZvcm1hdGlvbi4pMAorMjY2NiB5IEZzKDMpMTE0IGIgRmYoT3BlblNTTCkzNiBiIEZzKFwwMjYpaChQeXRob24paChpbnRlcmZhY2UpZih0byloCisoT3ApcyhlblNTTCkwIDI4OTUgeSBGcihUaGlzKTI1IGIocGFjKW4oayktNSBiKGFnZSkyNAorYihwcm8pbih2aWRlcylnKGEpaChoaWdoLWxldiluKGVsKWcoaW4pbih0ZXJmYWNlKWYodG8paSh0aGUpZworKGZ1bmN0aW9ucylmKGluKWgodGhlKWcoT3ApcihlblNTTClmKGxpYnJhcnkpLTcgYiguKTM1CitiKFRoZSkyNiBiKGZvbGxvKW4od2luZyllKG1vKXIoZHVsZXMpMCAyOTk1IHkoYXJlKWooZGVcMDM0bmVkOikwCiszMTQyIHkgRm0oY3J5cHRvKTIwOCAzMjQxIHkgRnIoR2VuZXJpYylnKGNyeXB0b2dyYXBoaWMpZShtbylyKGR1bGUuKTM3CitiKE5vdGUpMjggYih0aGF0KWcoaWYpZyhhbiluKHl0aGluZylmKGlzKWcoaW5jb21wbGV0ZSwpaCh0aGlzKWcobW8pcgorKGR1bGUpZihpcyEpMCAzMzg4IHkgRm0ocmFuZCkyMDggMzQ4OCB5IEZyKEFuKWgoaW4pbih0ZXJmYWNlKWUodG8paQorKHRoZSlnKE9wKXIoZW5TU0wpZyhwc2V1ZG8pZihyYW5kb20pZihuKW4odW0pbihiKXIoZXIpaShnZW5lcmF0b3IuKTAKKzM2MzUgeSBGbShTU0wpMjA4IDM3MzQgeSBGcihBbilnKGluKW4odGVyZmFjZSllKHRvKWkodGhlKWcoU1NMLXNwKXIKKyhlY2lcMDM0YylmKHBhcnRzKWcob2YpaChPcClyKGVuU1NMLikwIDQwMTQgeSBGaygzLjEpOTcKK2IgRmUoY3J5cHRvKTM0IGIgRmsoXDAyNillKEdlbmVyaWMpaShjcnlwdG9ncmFwaGljKWUobW8pcyhkdWxlKTAKKzQyMTQgeSBGbShYNTA5VHlwZSkyMDggNDMxNCB5IEZyKEEpMjcgYihQeXRob24paCh0KW4oeXApcihlKWcob2IpNQorYihqZWN0KTI4IGIocmVwcmVzZW4pbih0aW5nKWQodGhlKWooWDUwOSlmKG9iKTUgYihqZWN0KTI3CitiKHQpbih5cClyKGUuKTAgNDQ2MSB5IEZtKFg1MDlcKFwpKTIwOCA0NTYxIHkgRnIoRiktNworYihhY3RvcnkpMjYgYihmdW5jdGlvbilpKHRoYXQpZyhjcmVhdGVzKWUoYW4paShYNTA5KWUob2IpNQorYihqZWN0LikwIDQ3MDcgeSBGbShYNTA5TmFtZVR5cGUpMjA4IDQ4MDcgeSBGcihBKTI3IGIoUHl0aG9uKWgodCluKHlwKXIKKyhlKWcob2IpNSBiKGplY3QpMjggYihyZXByZXNlbiluKHRpbmcpZCh0aGUpaihYNTA5TmFtZSlmKG9iKTUKK2IoamVjdCkyNyBiKHQpbih5cClyKGUuKTAgNDk1NCB5IEZtKFg1MDlOYW1lXCgpcCBGZCh4NTA5bmFtZSk2CitiIEZtKFwpKTIwOCA1MDU0IHkgRnIoRiktNyBiKGFjdG9yeSkyNiBiKGZ1bmN0aW9uKWkodGhhdClnKGNyZWF0ZXMpZShhKQoraChjb3Apbih5KWcob2YpMzQgYiBGZCh4NTA5bmFtZSk2IGIgRnIoLikwIDUyMDAgeSBGbShYNTA5UmVxVHlwZSkyMDgKKzUzMDAgeSBGcihBKTI3IGIoUHl0aG9uKWgodCluKHlwKXIoZSlnKG9iKTUgYihqZWN0KTI4CitiKHJlcHJlc2VuKW4odGluZylkKHRoZSlqKFg1MDlSZXEpZihvYik1IGIoamVjdCkyNyBiKHQpbih5cClyKGUuKXAKKzAgNTU0OSAzOTAxIDQgdiAwIDU2NDkgYSBGZygyLjIpODIgYihCdWlsZGluZykyNyBiKHRoZSlnKE1vKXIoZHVsZSlnCisob24pZyhhKWcoV2luZG8pbih3cylnKFN5c3RlbSkyMTY0IGIoMylwIGVvcCBlbmQKKyUlUGFnZTogNCA0CitUZVhEaWN0IGJlZ2luIDQgMyBib3AgMCA4MyBhIEZtKFg1MDlSZXFcKFwpKTIwOCAxODMgeQorRnIoRiktNyBiKGFjdG9yeSkyNiBiKGZ1bmN0aW9uKWkodGhhdClnKGNyZWF0ZXMpZShhbilpKFg1MDlSZXEpZShvYik1CitiKGplY3QuKTAgMzMwIHkgRm0oWDUwOVN0b3JlVHlwZSkyMDggNDI5IHkgRnIoQSkyNyBiKFB5dGhvbiloKHQpbih5cClyCisoZSlnKG9iKTUgYihqZWN0KTI4IGIocmVwcmVzZW4pbih0aW5nKWQodGhlKWooWDUwOVN0b3JlKWUob2IpNQorYihqZWN0KTI3IGIodCluKHlwKXIoZS4pMCA1NzYgeSBGbShQS2V5VHlwZSkyMDggNjc2IHkKK0ZyKEEpZyhQeXRob24paCh0KW4oeXApcihlKWcob2IpNSBiKGplY3QpMjggYihyZXByZXNlbiluKHRpbmcpZCh0aGUpagorKFBLZXkpZyhvYik1IGIoamVjdCkyNyBiKHQpbih5cClyKGUuKTAgODIzIHkgRm0oUEtleVwoXCkpMjA4Cis5MjIgeSBGcihGKS03IGIoYWN0b3J5KTI2IGIoZnVuY3Rpb24paSh0aGF0KWcoY3JlYXRlcyllKGEpaChQS2V5KWgob2IpNQorYihqZWN0LikwIDEwNjkgeSBGbShQS0NTN1R5cGUpMjA4IDExNjkgeSBGcihBKTI3IGIoUHl0aG9uKWgodCluKHlwKXIoZSkKK2cob2IpNSBiKGplY3QpMjggYihyZXByZXNlbiluKHRpbmcpZCh0aGUpaihQSyluKENTNylmKG9iKTUKK2IoamVjdCkyOCBiKHQpbih5cClyKGUuKTAgMTMxNiB5IEZtKFBLQ1MxMlR5cGUpMjA4IDE0MTUKK3kgRnIoQSlmKFB5dGhvbiloKHQpbih5cClyKGUpZyhvYik1IGIoamVjdCkyOCBiKHJlcHJlc2VuKW4odGluZylkKHRoZSlqCisoUEspbihDUzEyKWYob2IpNSBiKGplY3QpMjcgYih0KW4oeXApcihlLikwIDE1NjIgeSBGbShYNTA5RXh0ZW5zaW9uVHlwKQorbyhlKTIwOCAxNjYyIHkgRnIoQSlnKFB5dGhvbiloKHQpbih5cClyKGUpZyhvYik1IGIoamVjdCkyOAorYihyZXByZXNlbiluKHRpbmcpZCh0aGUpaihYNTA5RXh0ZW5zaW9uKWYob2IpNSBiKGplY3QpMjcKK2IodCluKHlwKXIoZS4pMCAxODA4IHkgRm0oWDUwOUV4dGVuc2lvblwoKXAgRmQodHlwKWwoZW5hbWUsKWUoY3JpdGljKWwKKyhhbCwpMzEgYih2YWx1ZSk2IGIgRm0oXCkpMjA4IDE5MDggeSBGcihGKS03IGIoYWN0b3J5KTI2CitiKGZ1bmN0aW9uKWkodGhhdClnKGNyZWF0ZXMpZShhKWgoWDUwOUV4dGVuc2lvbilnKG9iKTUKK2IoamVjdC4pMCAyMDU1IHkgRm0oTmV0c2NhcGVTUEtJVHlwZSkyMDggMjE1NSB5IEZyKEEpMjcKK2IoUHl0aG9uKWgodCluKHlwKXIoZSlnKG9iKTUgYihqZWN0KTI4IGIocmVwcmVzZW4pbih0aW5nKWQodGhlKWoKKyhOZXRzY2FwKXIoZVNQS0kpZyhvYik1IGIoamVjdCkyNyBiKHQpbih5cClyKGUuKTAgMjMxNgoreSBGbShOZXRzY2FwZVNQS0lcKClwIEZjKFspcCBGZChlbmMpMTEgYiBGYyhdKXAgRm0oXCkpMjA4CisyNDE1IHkgRnIoRiktNyBiKGFjdG9yeSkyOSBiKGZ1bmN0aW9uKWkodGhhdClnKGNyZWF0ZXMpZShhKWgoTmV0c2NhcClyCisoZVNQS0kpZyhvYik1IGIoamVjdC4pNDUgYihJZikzMSBiKHRoZSlnIEZkKGVuYylrIEZyKGFyZ3VtZW4pbih0KTMwCitiKGlzKWcocHJlc2VuKW4odCwpaChpdClmKHNob3VsZCloKGIpcihlKWYoYSkyMDggMjUxNQoreShiYXNlNjQtZW5jbylyKGRlZCkyNSBiKHN0cmluZylpKHJlcHJlc2VuKW4odGluZylmKGEpaChOZXRzY2FwKXIKKyhlU1BLSSloKG9iKTUgYihqZWN0LCkyNyBiKGFzKWcocmV0dXJuZWQpZyhiKW4oeSlnKHRoZSloCitGbShiNjRfZW5jb2RlKWMgRnIobWV0aG8pcihkLikwIDI2NjIgeSBGbShGSUxFVFlQRV9QRU0pMAorMjc2MiB5KEZJTEVUWVBFX0FTTjEpMjA4IDI4NjEgeSBGcihGaWxlKWoodCluKHlwKXIoZSloKGNvbnN0YW4pbih0cy4pMAorMzAwOCB5IEZtKFRZUEVfUlNBKTAgMzEwOCB5KFRZUEVfRFNBKTIwOCAzMjA3IHkgRnIoS2V5KWUodCluKHlwKXIoZSlpCisoY29uc3RhbiluKHRzLikwIDMzNTQgeSBGbihleGNlcHRpb24payBGbShFcnJvcikyMDggMzQ1NAoreSBGcihHZW5lcmljKTI3IGIoZXhjZXB0aW9uKWcodXNlZClnKGluKWgodGhlKWcgRm0oY3J5cHRvKWQKK0ZyKG1vKXIoZHVsZS4pMCAzNjAxIHkgRm0oZHVtcF9jZXJ0aWZpY2F0ZSlvKFwoKXAgRmQodClvKHlwKWwoZSwpZyhjKWwKKyhlcnQpOCBiIEZtKFwpKTIwOCAzNzAwIHkgRnIoRHVtcCkyOCBiKHRoZSlnKGNlcnRpXDAzNGNhdGUpZgorRmQoYylsKGVydCkzNSBiIEZyKGluKW4odG8pMjcgYihhKWgoYnVcMDMzZXIpZihzdHJpbmcpZyhlbmNvKXIoZGVkKWgKKyh3aXRoKWcodGhlKWcodCluKHlwKXIoZSlmIEZkKHR5cClsKGUpNiBiIEZyKC4pMCAzODQ3Cit5IEZtKGR1bXBfY2VydGlmaWNhdGUpbyhfcilvKGVxdSlvKGVzKW8odFwoKW8gRmQodHlwKWwoZSwpMjUKK2IocilsKGUpbChxKTcgYiBGbShcKSkyMDggMzk0NyB5IEZyKER1bXApMjggYih0aGUpZyhjZXJ0aVwwMzRjYXRlKWYKKyhyZXF1ZXN0KWcgRmQocilsKGUpbChxKTM1IGIgRnIoaW4pbih0bykyNyBiKGEpZyhidVwwMzNlciloKHN0cmluZylmCisoZW5jbylyKGRlZClnKHdpdGgpaCh0aGUpZyh0KW4oeXApcihlKWcgRmQodHlwKWwoZSk2CitiIEZyKC4pMCA0MTA4IHkgRm0oZHVtcF9wcml2YXRla2V5XCgpbyBGZCh0eXApbChlLCkyNQorYihwa2V5KTcgYiBGYyhbKXAgRmQoLCkzMSBiKGNpcGhlciwpaChwKWwoYXNzcGhyKWwoYXNlKTE5CitiIEZjKF0pcCBGbShcKSkyMDggNDIwOCB5IEZyKER1bXApMzkgYih0aGUpZihwcml2KS01CitiKGF0ZSkzOCBiKGspbihleSloIEZkKHBrZXkpNDYgYiBGcihpbiluKHRvKTM4IGIoYSlnKGJ1XDAzM2VyKWcoc3RyaW5nKQorZyhlbmNvKXIoZGVkKWcod2l0aClnKHRoZSloKHQpbih5cClyKGUpZiBGZCh0eXApbChlKTYKK2IgRnIoLCk0MiBiKG9wdGlvbmFsbHkpMzcgYihcKGlmKTQ1IGIgRmQodHlwKWwoZSlnIEZyKGlzKTIwOAorNDMwNyB5IEZtKEZJTEVUWVBFX1BFTSlwIEZyKFwpKTIyIGIoZW5jcnlwdGluZykyNyBiKGl0KWgodXNpbmcpaAorRmQoY2lwaGVyKTM4IGIgRnIoYW5kKTI3IGIgRmQocClsKGFzc3BocilsKGFzZSk2IGIgRnIoLikyMDgKKzQ0NDAgeSBGZChwKWwoYXNzcGhyKWwoYXNlKTM1IGIgRnIobSluKHVzdCkyOCBiKGIpcihlKWcoZWl0aGVyKWYoYSlnCisoc3RyaW5nKWcob3IpZyhhKWcoY2FsbGJhYyluKGspZihmb3IpaChwcm8pbih2aWRpbmcpZih0aGUpaShwYXNzKWYKKyhwaHJhc2UuKTAgNDU4NyB5IEZtKGxvYWRfY2VydGlmaWNhdGUpbyhcKClwIEZkKHQpbyh5cClsKGUsKWUoYnVcMDMzZXIpCis5IGIgRm0oXCkpMjA4IDQ2ODcgeSBGcihMb2FkKTI2IGIoYSloKGNlcnRpXDAzNGNhdGUpZyhcKFg1MDlcKSlnKGZyb20paAorKHRoZSlmKHN0cmluZyloIEZkKGJ1XDAzM2VyKTM3IGIgRnIoZW5jbylyKGRlZCkyNyBiKHdpdGgpaCh0aGUpZyh0KW4KKyh5cClyKGUpZyBGZCh0eXApbChlKTYgYiBGciguKTAgNDgzNCB5IEZtKGxvYWRfY2VydGlmaWNhdGUpbyhfcilvKGVxdSlvCisoZXMpbyh0XCgpbyBGZCh0eXApbChlLCkyNSBiKGJ1XDAzM2VyKTkgYiBGbShcKSkyMDggNDkzMworeSBGcihMb2FkKTI2IGIoYSloKGNlcnRpXDAzNGNhdGUpZyhyZXF1ZXN0KWcoXChYNTA5UmVxXCkpZyhmcm9tKWcodGhlKWgKKyhzdHJpbmcpZyBGZChidVwwMzNlcikzNyBiIEZyKGVuY28pcihkZWQpMjcgYih3aXRoKWgodGhlKWcodCluKHlwKXIoZSlnCitGZCh0eXApbChlKTYgYiBGciguKTAgNTA5OSB5IEZtKGxvYWRfcHJpdmF0ZWtleVwoKW8gRmQodHlwKWwoZSwpMjUKK2IoYnVcMDMzZXIpOSBiIEZjKFspcCBGZCgsKTI5IGIocClsKGFzc3BocilsKGFzZSkyMCBiCitGYyhdKXAgRm0oXCkpMjA4IDUxOTkgeSBGcihMb2FkKTQzIGIoYSloKHByaXYpLTUgYihhdGUpNDQKK2IoayluKGV5KWYoXChQS2V5XCkpaShmcm9tKWYodGhlKWgoc3RyaW5nKWcgRmQoYnVcMDMzZXIpNTMKK2IgRnIoZW5jbylyKGRlZCk0NCBiKHdpdGgpaCh0aGUpZih0KW4oeXApcihlKWggRmQodHlwKWwoZSk1MQorYiBGcihcKG0pbih1c3QpNDUgYihiKXIoZSlmKG9uZSlnKG9mKTIwOCA1Mjk4IHkgRm0oRklMRVRZUEVfUEVNKTIyCitiIEZyKGFuZCkyOCBiIEZtKEZJTEVUWVBFX0FTTjEpcCBGcihcKS4pcCAwIDU1NDkgMzkwMQorNCB2IDAgNTY0OSBhIEZnKDQpMjIzOSBiKDMpODMgYiBGbShPcGVuU1NMKTI0IGIgRmcoXDAyNilrKFB5dGhvbilmCisoaW50ZXJmYWNlKWgodG8pZihPcClyKGVuU1NMKXAgZW9wIGVuZAorJSVQYWdlOiA1IDUKK1RlWERpY3QgYmVnaW4gNSA0IGJvcCAyMDggODMgYSBGZChwKWwoYXNzcGhyKWwoYXNlKTM1CitiIEZyKG0pbih1c3QpMjggYihiKXIoZSlnKGVpdGhlcilmKGEpZyhzdHJpbmcpZyhvcilnKGEpZyhjYWxsYmFjKW4oaylmCisoZm9yKWgocHJvKW4odmlkaW5nKWYodGhlKWkocGFzcylmKHBocmFzZS4pMCAyMzAgeSBGbQorKGxvYWRfcGtjczdfZGF0YVwoKW8gRmQodHlwKWwoZSwpZShidVwwMzNlcik5IGIgRm0oXCkpMjA4CiszMzAgeSBGcihMb2FkKTI2IGIocGspbihjczcpaChkYXRhKWcoZnJvbSlnKHRoZSloKHN0cmluZylnCitGZChidVwwMzNlcikzNiBiIEZyKGVuY28pcihkZWQpMjggYih3aXRoKWcodGhlKWcodCluKHlwKXIoZSlnCitGZCh0eXApbChlKTYgYiBGciguKTAgNDkxIHkgRm0obG9hZF9wa2NzMTJcKClwIEZkKGJ1XDAzM2VyKWoKK0ZjKFspcCBGZCgsKTI0IGIocClsKGFzc3BocilsKGFzZSljIEZjKF0pcCBGbShcKSkyMDgKKzU5MCB5IEZyKExvYWQpMzAgYihwayluKGNzMTIpZihkYXRhKWgoZnJvbSloKHRoZSlnKHN0cmluZylnCitGZChidVwwMzNlcik5IGIgRnIoLik0NyBiKElmKTMxIGIodGhlKWgocGspbihjczEyKWQoc3RydWN0dXJlKWgoaXMpaAorKGVuY3J5cHRlZCwpZyhhKWcgRmQocClsKGFzc3BocilsKGFzZSkzOSBiIEZyKG0pbih1c3QpMzEKK2IoYilyKGUpMjA4IDY5MCB5KGluY2x1ZGVkLikwIDk1MyB5IEZnKFg1MDkpYyhvYmplY3RzKTAKKzExNTQgeSBGcihYNTA5KWYob2IpNSBiKGplY3RzKTI3IGIoaGEpbih2KW4oZSlnKHRoZSloKGZvbGxvKW4od2luZyllCisobWV0aG8pcihkczopMCAxMzAwIHkgRm0oZ2V0X2lzc3VlclwoXCkpMjA4IDE0MDAgeSBGcihSZXR1cm4pZihhKWcKK0ZkKGIpbChvcnIpbChvd2UpbChkKWoocilsKGVmZXIpbChlbmMpbChlKWcodG8pZihhKWgoWDUwOU5hbWUpaChvYmplKWwKKyhjdClmKHIpbChlcHIpbChlc2VudGluZylmKHRoZSloKGlzc3VlcilmKG9mKWkodGhlKWUoYylsKGVydGlcMDM0YylsCisoYXRlLikzOCBiKFdoZW4pMjggYih0aGUpMjA4IDE1MDAgeShjKWwob3JyKWwoZXNwKWwob25kaW5nKWkoWDUwOSloKG9yKQorZihYNTA5UilsKGUpbChxKWcob2JqZSlsKGN0KWgoaXMpZihkZXN0cilsKG95ZSlsKGQsKWgodGhpcylmKG9iamUpbChjdCkKK2god2lsKXQobClmKGIpbChlKWcoaW52YWxpZCEpMCAxNjQ2IHkgRm0oZ2V0X3B1YmtleVwoXCkpMjA4CisxNzQ2IHkgRnIoUmV0dXJuKWQoYSlnKFBLZXkpaChvYik1IGIoamVjdCkyNyBiKHJlcHJlc2VuKW4odGluZylmKHRoZSlpCisocHVibGljKWcoayluKGV5KWYob2YpZyh0aGUpaChjZXJ0aVwwMzRjYXRlLikwIDE4OTMgeQorRm0oZ2V0X3NlcmlhbF9udW1iZSlvKHJcKClvKFwpKTIwOCAxOTkzIHkgRnIoUmV0dXJuKWYodGhlKWgKKyhjZXJ0aVwwMzRjYXRlKWYoc2VyaWFsKWcobiluKHVtKW4oYilyKGVyLikwIDIxMzkgeSBGbShnZXRfc3ViamVjdFwoXCkpCisyMDggMjIzOSB5IEZyKFJldHVybikzMiBiKGEpZyBGZChiKWwob3JyKWwob3dlKWwoZClrKHIpbChlZmVyKWwoZW5jKWwKKyhlKWUodG8paChhKWYoWDUwOU5hbWUpaShvYmplKWwoY3QpZihyKWwoZXByKWwoZXNlbnRpbmcpZih0aGUpaChzdWJqZSlsCisoY3QpZihvZiloKHRoZSlmKGMpbChlcnRpXDAzNGMpbChhdGUuKTUzIGIoV2hlbikyMDggMjMzOQoreSh0aGUpMjkgYihjKWwob3JyKWwoZXNwKWwob25kaW5nKWkoWDUwOSlnKG9yKWYoWDUwOVIpbChlKWwocSlnKG9iamUpbAorKGN0KWgoaXMpZihkZXN0cilsKG95ZSlsKGQsKWgodGhpcylmKG9iamUpbChjdClnKHdpbCl0KGwpaChiKWwoZSlmCisoaW52YWxpZCEpMCAyNDg2IHkgRm0oZ2V0X3ZlcnNpb25cKFwpKTIwOCAyNTg1IHkgRnIoUmV0dXJuKWQodGhlKWgKKyhjZXJ0aVwwMzRjYXRlKWYodiluKGVyc2lvbi4pMCAyNzMyIHkgRm0oZ210aW1lX2Fkal9ub3RCZSlvKGZvKW8ocmVcKClvCitGZCh0aW1lKTYgYiBGbShcKSkyMDggMjgzMiB5IEZyKEEpbihkanVzdCkyOCBiKHRoZSlnKHRpbWVzdGFtcClnKFwoaW4pZworKEdNVFwpKWcod2hlbilnKHRoZSlmKGNlcnRpXDAzNGNhdGUpZyhzdGFydHMpZyhiKXIoZWluZyloKHYpLTUKK2IoYWxpZC4pMCAyOTc5IHkgRm0oZ210aW1lX2Fkal9ub3RBZilvKHRlKW8oclwoKXAgRmQodClvKGltZSk2CitiIEZtKFwpKTIwOCAzMDc4IHkgRnIoQSluKGRqdXN0KTI4IGIodGhlKWcodGltZXN0YW1wKWcoXChpbilnKEdNVFwpKWcKKyh3aGVuKWcodGhlKWYoY2VydGlcMDM0Y2F0ZSlnKHN0b3BzKWcoYilyKGVpbmcpaCh2KS01CitiKGFsaWQuKTAgMzIyNSB5IEZtKGhhc19leHBpcmVkXChcKSkyMDggMzMyNSB5IEZyKENoZWMpbihrcykzMgorYih0aGUpaChjZXJ0aVwwMzRjYXRlJ3MpZih0aW1lKWkoc3RhbXApZihhZ2FpbnN0KWYoY3VycmVuKW4odClnKHRpbWUuKQorNTQgYihSZXR1cm5zKTMzIGIodHJ1ZSlnKGlmKWcodGhlKWgoY2VydGlcMDM0Y2F0ZSllKGhhcyloKGV4cGlyZWQpMjA4CiszNDI0IHkoYW5kKTI3IGIoZmFsc2UpZyhvdGhlcndpc2UuKTAgMzU3MSB5IEZtKHNldF9pc3N1ZXJcKClwCitGZChpc3N1ZXIpOSBiIEZtKFwpKTIwOCAzNjcxIHkgRnIoU2V0KTI4IGIodGhlKWYoaXNzdWVyKWcob2YpaCh0aGUpZworKGNlcnRpXDAzNGNhdGUpZih0bylnIEZkKGlzc3Vlcik5IGIgRnIoLikwIDM4MTggeSBGbShzZXRfcHVia2V5XCgpcAorRmQocGtleSllIEZtKFwpKTIwOCAzOTE3IHkgRnIoU2V0KTI4IGIodGhlKWYocHVibGljKWgoayluKGV5KWYob2YpaAorKHRoZSlnKGNlcnRpXDAzNGNhdGUpZih0bylnIEZkKHBrZXkpNyBiIEZyKC4pMCA0MDY0IHkKK0ZtKHNldF9zZXJpYWxfbnVtYmUpbyhyXCgpbyBGZChzZXJpYWxubyllIEZtKFwpKTIwOCA0MTY0Cit5IEZyKFNldCkyOCBiKHRoZSlmKHNlcmlhbClnKG4pbih1bSluKGIpcihlcilnKG9mKWgodGhlKWcKKyhjZXJ0aVwwMzRjYXRlKWYodG8pZyBGZChzZXJpYWxubyk1IGIgRnIoLikwIDQzMTEgeSBGbShzZXRfc3ViamVjdFwoKXAKK0ZkKHN1YmplKWwoY3QpaiBGbShcKSkyMDggNDQxMCB5IEZyKFNldCkyOCBiKHRoZSlmKHN1Yik1CitiKGplY3QpMjggYihvZilnKHRoZSlnKGNlcnRpXDAzNGNhdGUpZih0bylnIEZkKHN1YmplKWwoY3QpOAorYiBGciguKTAgNDU1NyB5IEZtKHNldF92ZXJzaW9uXCgpcCBGZCh2ZXJzaW9uKWUgRm0oXCkpMjA4Cis0NjU3IHkgRnIoU2V0KTI4IGIodGhlKWYoY2VydGlcMDM0Y2F0ZSlnKHYpbihlcnNpb24pZih0bylpCitGZCh2ZXJzaW9uKTYgYiBGciguKTAgNDgwNCB5IEZtKHNpZ25cKClwIEZkKHBrZXksKTI5CitiKGRpZ2VzdCk4IGIgRm0oXCkpMjA4IDQ5MDMgeSBGcihTaWduKTIyIGIodGhlKWgoY2VydGlcMDM0Y2F0ZSwpZgorKHVzaW5nKWcodGhlKWgoayluKGV5KWcgRmQocGtleSkzMSBiIEZyKGFuZCkyMiBiKHRoZSloKG1lc3NhZ2UpZQorKGRpZ2VzdCloKGFsZ29yaXRobSlmKGlkZW4pbih0aVwwMzRlZClpKGIpbih5KWYodGhlKWgoc3RyaW5nKWYKK0ZkKGRpZ2VzdCk4IGIgRnIoLikwIDUwNTAgeSBGbShzdWJqZWN0X25hbWVfaGFzKW8oaFwoKW8oXCkpMjA4Cis1MTUwIHkgRnIoUmV0dXJuKTI3IGIodGhlKWgoaGFzaClmKG9mKWgodGhlKWcoY2VydGlcMDM0Y2F0ZSlmKHN1Yik1CitiKGplY3QuKTAgNTI5NyB5IEZtKGRpZ2VzdFwoKXAgRmQoZGlnZXN0X25hbWUpaCBGbShcKSkyMDgKKzUzOTYgeSBGcihSZXR1cm4pMjcgYihhKWcoZGlnZXN0KWgob2YpZih0aGUpaChjZXJ0aVwwMzRjYXRlLClmKHVzaW5nKWcKKyh0aGUpaCBGZChkaWdlc3RfbmFtZSkzNSBiIEZyKG1ldGhvKXIoZC4pcCAwIDU1NDkgMzkwMQorNCB2IDAgNTY0OSBhIEZnKDMuMSk4MiBiIEZtKGNyeXB0bykyNSBiIEZnKFwwMjYpaihHZW5lcmljKWcKKyhjcnlwdG9ncmFwaGljKWUobW8pcihkdWxlKTIyMzQgYig1KXAgZW9wIGVuZAorJSVQYWdlOiA2IDYKK1RlWERpY3QgYmVnaW4gNiA1IGJvcCAwIDgzIGEgRm0oYWRkX2V4dGVuc2lvbnNcKClwIEZkKGV4KW8odGVuc2lvbnMpNworYiBGbShcKSkyMDggMTgzIHkgRnIoQSluKGRkKTI3IGIodGhlKWgoZXh0ZW5zaW9ucylmKGluKWgodGhlKWcKKyhzZXF1ZW5jZSlmIEZkKGV4dGVuc2lvbnMpMzQgYiBGcih0bykyNyBiKHRoZSloKGNlcnRpXDAzNGNhdGUuKTAKKzQ0NiB5IEZnKFg1MDlOYW1lKWUob2JqZWN0cykwIDY0NiB5IEZyKFg1MDlOYW1lKWcob2IpNQorYihqZWN0cykyNyBiKGhhKW4odiluKGUpZyh0aGUpaChmb2xsbyluKHdpbmcpZShtZW0pbihiKXIoZXJzOikwCis3OTMgeSBGbShjb3VudHJ5TmFtZSkyMDggODkzIHkgRnIoVGhlKWgoY291biluKHRyeSlnKG9mKWcodGhlKWgoZW4pbgorKHRpdCluKHkpLTcgYiguKTM3IGIgRm0oQykyNyBiIEZyKG1hKW4oeSlnKGIpcihlKWgodXNlZClnKGFzKWYoYW4pZworKGFsaWFzKWYoZm9yKWggRm0oY291bnRyeU5hbWUpcCBGciguKTAgMTA0MCB5IEZtKHN0YXRlT3JQcm92aW5jZU4pbyhhbSkKK28oZSkyMDggMTEzOSB5IEZyKFRoZSlnKHN0YXRlKWgob3IpZShwcm8pbih2aW5jZSlnKG9mKWkodGhlKWcoZW4pbih0aXQpCituKHkpLTcgYiguKTM3IGIgRm0oU1QpMjcgYiBGcihtYSluKHkpZihiKXIoZSlpKHVzZWQpZyhhcylmKGFuKWcoYWxpYXMpZworKGZvcilnIEZtKHN0YXRlT3JQcm92aW5jZSlvKE5hKW8obWUpcCBGcihcMjY3KTAgMTI4NgoreSBGbShsb2NhbGl0eU5hbWUpMjA4IDEzODYgeSBGcihUaGUpZyhsbylyKGNhbGl0KW4oeSlnKG9mKWgodGhlKWYoZW4pbgorKHRpdCluKHkpLTcgYiguKTM3IGIgRm0oTCkyOCBiIEZyKG1hKW4oeSllKGIpcihlKWkodXNlZClnKGFzKWYoYW4pZworKGFsaWFzKWcoZm9yKWcgRm0obG9jYWxpdHlOYW1lKXAgRnIoLikwIDE1MzIgeSBGbShvcmdhbml6YXRpb25OYW1lKTIwOAorMTYzMiB5IEZyKFRoZSlnKG9yZ2FuaXphdGlvbillKG5hbWUpaihvZilmKHRoZSloKGVuKW4odGl0KW4oeSktNworYiguKTM3IGIgRm0oTykyNyBiIEZyKG1hKW4oeSlnKGIpcihlKWgodXNlZClnKGFzKWUoYW4paShhbGlhcyllKGZvciloCitGbShvcmdhbml6YXRpb25OYW1lKXAgRnIoLikwIDE3NzkgeSBGbShvcmdhbml6YXRpb25hbFVuKW8oaXQpbyhOYW0pbyhlKQorMjA4IDE4NzkgeSBGcihUaGUpZyhvcmdhbml6YXRpb25hbCllKHVuaXQpaihvZilnKHRoZSlnKGVuKW4odGl0KW4oeSktNworYiguKTM2IGIgRm0oT1UpMjcgYiBGcihtYSluKHkpZyhiKXIoZSloKHVzZWQpZyhhcylmKGFuKWcoYWxpYXMpZihmb3IpaAorRm0ob3JnYW5pemF0aW9uYWxVbmkpbyh0TilvKGFtKW8oZSlwIEZyKC4pMCAyMDI1IHkgRm0oY29tbW9uTmFtZSkyMDgKKzIxMjUgeSBGcihUaGUpZyhjb21tb24pZyhuYW1lKWgob2YpZih0aGUpaChlbiluKHRpdCluKHkpLTcKK2IoLikzNyBiIEZtKENOKTI3IGIgRnIobWEpbih5KWYoYilyKGUpaSh1c2VkKWcoYXMpZihhbilnKGFsaWFzKWcoZm9yKWcKK0ZtKGNvbW1vbk5hbWUpcCBGciguKTAgMjI3MiB5IEZtKGVtYWlsQWRkcmVzcykyMDggMjM3MgoreSBGcihUaGUpZyhlLW1haWwpZyhhZGRyZXNzKWYob2YpaSh0aGUpZyhlbiluKHRpdCluKHkpLTcKK2IoLikwIDI2MzUgeSBGZyhYNTA5UmVxKTI2IGIob2JqZWN0cykwIDI4MzUgeSBGcihYNTA5UmVxKWcob2IpNQorYihqZWN0cykyNyBiKGhhKW4odiluKGUpZyh0aGUpaChmb2xsbyluKHdpbmcpZShtZXRobylyKGRzOikwCisyOTgyIHkgRm0oZ2V0X3B1YmtleVwoXCkpMjA4IDMwODIgeSBGcihSZXR1cm4paChhKWcoUEtleSloKG9iKTUKK2IoamVjdCkyNyBiKHJlcHJlc2VuKW4odGluZylmKHRoZSlpKHB1YmxpYylnKGspbihleSlmKG9mKWcodGhlKWgKKyhjZXJ0aVwwMzRjYXRlKWYocmVxdWVzdC4pMCAzMjI4IHkgRm0oZ2V0X3N1YmplY3RcKFwpKTIwOAorMzMyOCB5IEZyKFJldHVybikzMiBiKGEpZyBGZChiKWwob3JyKWwob3dlKWwoZClrKHIpbChlZmVyKWwoZW5jKWwoZSllCisodG8paChhKWYoWDUwOU5hbWUpaShvYmplKWwoY3QpZihyKWwoZXByKWwoZXNlbnRpbmcpZih0aGUpaChzdWJqZSlsKGN0KQorZihvZiloKHRoZSlmKGMpbChlcnRpXDAzNGMpbChhdGUuKTUzIGIoV2hlbikyMDggMzQyOAoreSh0aGUpMjkgYihjKWwob3JyKWwoZXNwKWwob25kaW5nKWkoWDUwOSlnKG9yKWYoWDUwOVIpbChlKWwocSlnKG9iamUpbAorKGN0KWgoaXMpZihkZXN0cilsKG95ZSlsKGQsKWgodGhpcylmKG9iamUpbChjdClnKHdpbCl0KGwpaChiKWwoZSlmCisoaW52YWxpZCEpMCAzNTc1IHkgRm0oc2V0X3B1YmtleVwoKXAgRmQocGtleSk3IGIgRm0oXCkpMjA4CiszNjc0IHkgRnIoU2V0KTI4IGIodGhlKWYocHVibGljKWgoayluKGV5KWYob2YpaCh0aGUpZyhjZXJ0aVwwMzRjYXRlKWYKKyhyZXF1ZXN0KWcodG8pZyBGZChwa2V5KTcgYiBGciguKTAgMzgyMSB5IEZtKHNpZ25cKClwCitGZChwa2V5LCkyOSBiKGRpZ2VzdCk4IGIgRm0oXCkpMjA4IDM5MjEgeSBGcihTaWduKTM2CitiKHRoZSlnKGNlcnRpXDAzNGNhdGUpZyhyZXF1ZXN0LCloKHVzaW5nKWYodGhlKWcoayluKGV5KWgKK0ZkKHBrZXkpNDUgYiBGcihhbmQpMzYgYih0aGUpZyhtZXNzYWdlKWYoZGlnZXN0KWcoYWxnb3JpdGhtKWcoaWRlbiluCisodGlcMDM0ZWQpaShiKW4oeSlmKHRoZSkyMDggNDAyMCB5KHN0cmluZykyOCBiIEZkKGRpZ2VzdCk4CitiIEZyKC4pMCA0MTY3IHkgRm0odmVyaWZ5XCgpcCBGZChwa2V5KWYgRm0oXCkpMjA4IDQyNjcKK3kgRnIoViktNyBiKGVyaWZ5KTI3IGIoYSlnKGNlcnRpXDAzNGNhdGUpZyhyZXF1ZXN0KWcodXNpbmcpZyh0aGUpaAorKHB1YmxpYylnKGspbihleSlnIEZkKHBrZXkpNyBiIEZyKC4pMCA0NTMwIHkgRmcoWDUwOVN0byluKHJlKTI2CitiKG9iamVjdHMpMCA0NzMwIHkgRnIoVGhlKWkoWDUwOVN0b3JlKWQob2IpNSBiKGplY3QpMjgKK2IoaGFzKWYoY3VycmVuKW4odGx5KWYoanVzdClpKG9uZSlnKG1ldGhvKXIoZDopMCA0ODc3Cit5IEZtKGFkZF9jZXJ0XCgpcCBGZChjKWwoZXJ0KTggYiBGbShcKSkyMDggNDk3NyB5IEZyKEEpbihkZCkyNworYih0aGUpaChjZXJ0aVwwMzRjYXRlKWYgRmQoYylsKGVydCkzNiBiIEZyKHRvKTI3IGIodGhlKWgoY2VydGlcMDM0Y2F0ZSkKK2Yoc3RvcmUuKXAgMCA1NTQ5IDM5MDEgNCB2IDAgNTY0OSBhIEZnKDYpMjIzOSBiKDMpODMKK2IgRm0oT3BlblNTTCkyNCBiIEZnKFwwMjYpayhQeXRob24pZihpbnRlcmZhY2UpaCh0bylmKE9wKXIoZW5TU0wpcAorZW9wIGVuZAorJSVQYWdlOiA3IDcKK1RlWERpY3QgYmVnaW4gNyA2IGJvcCAwIDgzIGEgRmcoUEtleSkyNyBiKG9iamVjdHMpMCAyODMKK3kgRnIoVGhlKWgoUEtleSlmKG9iKTUgYihqZWN0KTI3IGIoaGFzKWcodGhlKWgoZm9sbG8pbih3aW5nKWYobWV0aG8pcgorKGRzOikwIDQzMCB5IEZtKGJpdHNcKFwpKTIwOCA1MzAgeSBGcihSZXR1cm4pZyh0aGUpaChuKW4odW0pbihiKXIoZXIpZgorKG9mKWgoYml0cylnKG9mKWYodGhlKWgoayluKGV5KS03IGIoLikwIDY3NyB5IEZtKGdlbmVyYXRlX2tleVwoKXAKK0ZkKHR5cClsKGUsKTI1IGIoYml0cyk3IGIgRm0oXCkpMjA4IDc3NiB5IEZyKEdlbmVyYXRlKTIyCitiKGEpaChwdWJsaWMvcHJpdiktNSBiKGF0ZSkyMyBiKGspbihleSlmKHBhaXIpaChvZilnKHRoZSloKHQpbih5cClyKGUpZgorRmQodHlwKWwoZSkzMCBiIEZyKFwob25lKTIzIGIob2YpMzAgYiBGbShUWVBFX1JTQSkxOQorYiBGcihhbmQpMjQgYiBGbShUWVBFX0RTQSlwIEZyKFwpKWMod2l0aClqKHRoZSloKHNpemUpZgorRmQoYml0cyk3IGIgRnIoLikwIDkyMyB5IEZtKHR5cGVcKFwpKTIwOCAxMDIzIHkgRnIoUmV0dXJuKTI3CitiKHRoZSloKHQpbih5cClyKGUpZyhvZilmKHRoZSloKGspbihleSktNyBiKC4pMCAxMjg2Cit5IEZnKFBLKW4oQ1M3KTI3IGIob2JqZWN0cykwIDE0ODYgeSBGcihQSyluKENTNylnKG9iKTUKK2IoamVjdHMpMjcgYihoYSluKHYpbihlKWYodGhlKWkoZm9sbG8pbih3aW5nKWYobWV0aG8pcihkczopMAorMTYzMyB5IEZtKHR5cGVfaXNfc2lnbmVkXChcKSkyMDggMTczMyB5IEZyKEZJWE1FKTAgMTg4MAoreSBGbSh0eXBlX2lzX2VudmVsb3BlKW8oZFwoKW8oXCkpMjA4IDE5NzkgeSBGcihGSVhNRSkwCisyMTI2IHkgRm0odHlwZV9pc19zaWduZWRBbilvKGRFKW8obnZlKW8obG8pbyhwZSlvKGRcKFwpKTIwOAorMjIyNiB5IEZyKEZJWE1FKTAgMjM3MyB5IEZtKHR5cGVfaXNfZGF0YVwoXCkpMjA4IDI0NzIKK3kgRnIoRklYTUUpMCAyNjE5IHkgRm0oZ2V0X3R5cGVfbmFtZVwoXCkpMjA4IDI3MTkgeSBGcihHZXQpaCh0aGUpZih0KW4KKyh5cClyKGUpaChuYW1lKWcob2YpZih0aGUpaChQSyluKENTNy4pMCAyOTgyIHkgRmcoUEspbihDUzEyKWUob2JqZWN0cykwCiszMTgyIHkgRnIoUEspbihDUzEyKWcob2IpNSBiKGplY3RzKTI4IGIoaGEpbih2KW4oZSllKHRoZSlpKGZvbGxvKW4KKyh3aW5nKWUobWV0aG8pcihkczopMCAzMzI5IHkgRm0oZ2V0X2NlcnRpZmljYXRlXCgpbyhcKSkyMDgKKzM0MjkgeSBGcihSZXR1cm4paChjZXJ0aVwwMzRjYXRlKWcocClyKG9ydGlvbilnKG9mKWgodGhlKWcoUEspbihDUzEyKWUKKyhzdHJ1Y3R1cmUuKTAgMzU3NiB5IEZtKGdldF9wcml2YXRla2V5XChcKSkyMDggMzY3NSB5CitGcihSZXR1cm4paChwcml2KS01IGIoYXRlKTI3IGIoayluKGV5KWcocClyKG9ydGlvbilnKG9mKWgodGhlKWcoUEspbgorKENTMTIpZShzdHJ1Y3R1cmUpMCAzODIyIHkgRm0oZ2V0X2NhX2NlcnRpZmljYSlvKHRlKW8oc1woXCkpMjA4CiszOTIyIHkgRnIoUmV0dXJuKWsoQ0EpZyhjZXJ0aVwwMzRjYXRlcylmKHdpdGhpbilpKHRoZSlmKFBLKW4oQ1MxMilmKG9iKQorNSBiKGplY3QpMzAgYihhcylmKGEpZyh0dXBsZS4pNDUgYihSZXR1cm5zKTMwIGIoTm9uZSlnKGlmKWcobm8pZyhDQSlnCisoY2VydGlcMDM0Y2F0ZXMpZihhcmUpMjA4IDQwMjIgeShwcmVzZW4pbih0LikwIDQyODUgeQorRmcoWDUwOUV4dGVuc2lvbiljKG9iamVjdHMpMCA0NDg1IHkgRnIoWDUwOUV4dGVuc2lvbiloKG9iKTUKK2IoamVjdHMpMjcgYihjdXJyZW4pbih0bHkpZyhvbmx5KWcoaGEpbih2KW4oZSlmKG9uZSlpKG1ldGhvKXIoZDopMAorNDYzMiB5IEZtKGdldF9jcml0aWNhbFwoXCkpMjA4IDQ3MzIgeSBGcihSZXR1cm4pZih0aGUpaChjcml0aWNhbClmCisoXDAzNGVsZCloKG9mKWYodGhlKWgoZXh0ZW5zaW9uKWYob2IpNSBiKGplY3QuKTAgNDk5NQoreSBGZyhOZXRzY2FwKXIoZVNQS0kpMjcgYihvYmplY3RzKTAgNTE5NSB5IEZyKE5ldHNjYXApcihlU1BLSSloKG9iKTUKK2IoamVjdHMpMjcgYihoYSluKHYpbihlKWYodGhlKWkoZm9sbG8pbih3aW5nKWUobWV0aG8pcihkczopcAorMCA1NTQ5IDM5MDEgNCB2IDAgNTY0OSBhIEZnKDMuMSk4MiBiIEZtKGNyeXB0bykyNSBiIEZnKFwwMjYpaihHZW5lcmljKWcKKyhjcnlwdG9ncmFwaGljKWUobW8pcihkdWxlKTIyMzQgYig3KXAgZW9wIGVuZAorJSVQYWdlOiA4IDgKK1RlWERpY3QgYmVnaW4gOCA3IGJvcCAwIDgzIGEgRm0oYjY0X2VuY29kZVwoXCkpMjA4IDE4MworeSBGcihSZXR1cm4pMjcgYihhKWcoYmFzZTY0LWVuY28pcihkZWQpZihzdHJpbmcpaChyZXByZXNlbiluKHRhdGlvbillCisob2Ypaih0aGUpZyhvYik1IGIoamVjdC4pMCAzMzAgeSBGbShnZXRfcHVia2V5XChcKSkyMDgKKzQyOSB5IEZyKFJldHVybikyNyBiKHRoZSloKHB1YmxpYylnKGspbihleSlmKG9mKWgob2IpNQorYihqZWN0LikwIDU3NiB5IEZtKHNldF9wdWJrZXlcKClwIEZkKGtleSlpIEZtKFwpKTIwOAorNjc2IHkgRnIoU2V0KTI4IGIodGhlKWYocHVibGljKWgoayluKGV5KWYob2YpaCh0aGUpZyhvYik1CitiKGplY3QpMjcgYih0byloIEZkKGtleSk3IGIgRnIoLikwIDgyMyB5IEZtKHNpZ25cKClwCitGZChrZXksKTI5IGIoZGlnZXN0X25hbWUpNiBiIEZtKFwpKTIwOCA5MjIgeSBGcihTaWduKTI3CitiKHRoZSloKE5ldHNjYXApcihlU1BLSSlnKG9iKTUgYihqZWN0KTI3IGIodXNpbmcpZyh0aGUpaChnaXYpbihlbilmCitGZChrZXkpMzUgYiBGcihhbmQpMjggYiBGZChkaWdlc3RfbmFtZSk2IGIgRnIoLikwIDEwNjkKK3kgRm0odmVyaWZ5XCgpcCBGZChrZXkpaCBGbShcKSkyMDggMTE2OSB5IEZyKFYpLTcgYihlcmlmeSkyNworYih0aGUpaChOZXRzY2FwKXIoZVNQS0kpZyhvYik1IGIoamVjdCkyNyBiKHVzaW5nKWcodGhlKWgoZ2l2KW4oZW4pZgorRmQoa2V5KTcgYiBGciguKTAgMTQ0OCB5IEZrKDMuMik5NyBiIEZlKHJhbmQpMzQgYiBGayhcMDI2KWUoQW4paAorKGludGVyZmFjZSlnKHRvKWcodGhlKWcoT3ApcyhlblNTTClmKHBzZXVkbyloKHJhbmRvbSlnKG51bWIpcyhlcilnCisoZ2VuZXJhdG8pbShyKTAgMTY0OSB5IEZyKFRoaXMpMjggYihtbylyKGR1bGUpZihoYW5kbGVzKWgodGhlKWYoT3ApcgorKGVuU1NMKWgocHNldWRvKWYocmFuZG9tKWcobiluKHVtKW4oYilyKGVyKWcoZ2VuZXJhdG9yKWYoXChQUk5HXCkpagorKGFuZCllKGRlY2xhcmVzKWYodGhlKWkoZm9sbG8pbih3aW5nOikwIDE3OTYgeSBGbShhZGRcKClwCitGZChzdHJpbmcsKWcoZW50cilsKG9weSk3IGIgRm0oXCkpMjA4IDE4OTUgeSBGcihNaXgpMjIKK2IoYiluKHl0ZXMpZyhmcm9tKWcgRmQoc3RyaW5nKTMwIGIgRnIoaW4pbih0bykyMiBiKHRoZSloKFBSTkcpaChzdGF0ZS4pCiszNSBiKFRoZSkyMiBiIEZkKGVudHIpbChvcHkpMzAgYiBGcihhcmd1bWVuKW4odCkyMiBiKGlzKWcoXCh0aGUpaChsbyluCisodyluKGVyKWUoYilyKG91bmQpaShvZik2IGIoXCkpMjMgYihhbilmKGVzdGltYXRlKTIwOAorMTk5NSB5KG9mKWYoaG8pbih3KWcobSluKHVjKW4oaCloKHJhbmRvbW5lc3MpZShpcyloKGNvbiluKHRhaW5lZClnKGluKWgKK0ZkKHN0cmluZyk3IGIgRnIoLCkyMyBiKG1lYXN1cmVkKWUoaW4paChiKW4oeXRlcy4pMzQKK2IoRiktNyBiKG9yKTIxIGIobW9yZSlnKGluZm9ybWF0aW9uLCloKHNlZSlnKGUuZy4pMzQKK2IoUkYpbihDKTIwOCAyMDk0IHkoMTc1MC4pMCAyMjQxIHkgRm0oZWdkXCgpcCBGZChwKWwoYXRoKTYKK2IgRmMoWylwIEZkKCwpMjkgYihieXRlcykxOSBiIEZjKF0pcCBGbShcKSkyMDggMjM0MSB5CitGcihRdWVyeSkyOSBiKHRoZSlqKEVuKW4odHJvcCluKHkpZShHYXRoZXJpbmcpZyhEYWVtb24pMTYyOQorMjMxMSB5IEZsKDMpMTY5NyAyMzQxIHkgRnIob24paChzbylyKGMpbihrKW4oZXQpZiBGZChwKWwoYXRoKTM4CitiIEZyKGZvcikzMCBiIEZkKGJ5dGVzKTM4IGIgRnIoYiluKHl0ZXMpMzEgYihvZilnKHJhbmRvbSlmKGRhdGEpZyhhbmQpaAorKGFuZClnKHVzZXMpMjA4IDI0NDEgeSBGbShhZGQpMjYgYiBGcih0byloKHNlZWQpaCh0aGUpZyhQUk5HLilnKFRoZSlnCisoZGVmYXVsdClnKHYpLTUgYihhbHVlKTI3IGIob2YpMzQgYiBGZChieXRlcyloIEZyKGlzKTI3CitiKDI1NS4pMCAyNjAyIHkgRm0obG9hZF9maWxlXCgpcCBGZChwKWwoYXRoKTYgYiBGYyhbKXAKK0ZkKCwpMjYgYihieXRlcykxOSBiIEZjKF0pcCBGbShcKSkyMDggMjcwMSB5IEZyKFJlYWQpMjkKK2IgRmQoYnl0ZXMpMzggYiBGcihiKW4oeXRlcykzMCBiKFwob3IpZihhbGwpaChvZilnKGl0LClpKGlmKTM3CitiIEZkKGJ5dGVzKWcgRnIoaXMpMzEgYihuZWdhdGl2KW4oZVwpKWUob2YpaChkYXRhKWcoZnJvbSlnKHRoZSlnCisoXDAzNGxlKWggRmQocClsKGF0aCkzNyBiIEZyKHRvKTMwIGIoc2VlZClnKHRoZSloKFBSTkcuKWcoVGhlKTIwOAorMjgwMSB5KGRlZmF1bHQpZCh2KS01IGIoYWx1ZSkyNyBiKG9mKTM0IGIgRmQoYnl0ZXMpaAorRnIoaXMpMjcgYigtMS4pMCAyOTQ4IHkgRm0oc2NyZWVuXChcKSkyMDggMzA0OCB5IEZyKEEpbihkZClnKHRoZSloCisoY3VycmVuKW4odClmKGNvbiluKHRlbiluKHRzKWcob2YpZyh0aGUpaChzY3JlZW4pZih0bylnKHRoZSloKFBSTkcpaAorKHN0YXRlLikzNyBiKEEpLTkgYih2KWsoYWlsYWJpbGl0KW4oeTopMzYgYihXaW5kbyluKHdzLikwCiszMTk0IHkgRm0oc2VlZFwoKXAgRmQoc3RyaW5nKTcgYiBGbShcKSkyMDggMzI5NCB5IEZyKFRoaXMpMjcKK2IoaXMpaChlcXVpdiktNSBiKGFsZW4pbih0KTI3IGIodG8pZyhjYWxsaW5nKWggRm0oYWRkKWYKK0ZyKHdpdGgpaCBGZChlbnRyKWwob3B5KTM1IGIgRnIoYXMpMjcgYih0aGUpaChsZW5ndGgpZihvZiloKHRoZSlnCisoc3RyaW5nLikwIDM0NDEgeSBGbShzdGF0dXNcKFwpKTIwOCAzNTQxIHkgRnIoUmV0dXJucylmKHRydWUpZyhpZilpCisodGhlKWUoUFJORylpKGhhcyllKGIpcihlZW4paChzZWVkZWQpZih3aXRoKWgoZW5vdWdoKWYoZGF0YSwpZyhhbmQpaAorKGZhbHNlKWYob3RoZXJ3aXNlLikwIDM2ODcgeSBGbSh3cml0ZV9maWxlXCgpcCBGZChwKWwoYXRoKTYKK2IgRm0oXCkpMjA4IDM3ODcgeSBGcihXKS03IGIocml0ZSkzNCBiKGEpZyhuKW4odW0pbihiKXIoZXIpZyhvZiloCisocmFuZG9tKWUoYiluKHl0ZXMpaChcKGN1cnJlbiluKHRseSlnKDEwMjRcKSlmKHRvKWgodGhlKWgoXDAzNGxlKWYKK0ZkKHApbChhdGgpNiBiIEZyKC4pNTkgYihUaGlzKTM0IGIoXDAzNGxlKWgoY2FuKWYodGhlbilnKGIpcihlKWgodXNlZClnCisod2l0aCkyMDggMzg4NyB5IEZtKGxvYWRfZmlsZSkyMyBiIEZyKHRvKTI4IGIoc2VlZClmKHRoZSloKFBSTkcpaAorKGFnYWluLikwIDQxNjYgeSBGaygzLjMpOTcgYiBGZShTU0wpMzMgYiBGayhcMDI2KWYoQW4paChpbnRlcmZhY2UpaCh0bykKK2UodGhlKWgoU1NMLXNwKXMoZWNpXDAzNGMpaChwYSltKHJ0cylmKG9mKWYoT3ApcyhlblNTTCkwCis0MzY3IHkgRnIoVGhpcyljKG1vKXIoZHVsZSlmKGhhbmRsZXMpaCh0aGluZ3MpZihzcClyKGVjaVwwMzRjKWgodG8pZgorKFNTTC4paChUaGVyZSlmKGFyZSlmKHQpbih3KW4obyloKG9iKTUgYihqZWN0cykyNyBiKGRlXDAzNG5lZDopMzgKK2IoQ29uKW4odGV4dCwpMjcgYihDb25uZWN0aW9uLikwIDQ1MTQgeSBGbShTU0x2Ml9NRVRIT0QpMAorNDYxMyB5KFNTTHYzX01FVEhPRCkwIDQ3MTMgeShTU0x2MjNfTUVUSE9EKTAgNDgxMyB5KFRMU3YxX01FVEhPRCkyMDgKKzQ5MTIgeSBGcihUaGVzZSlnKGNvbnN0YW4pbih0cylmKHJlcHJlc2VuKW4odCloKHRoZSloKGRpXDAzM2VyZW4pbih0KWYKKyhTU0wpaChtZXRobylyKGRzKWcodG8pZih1c2UpaCh3aGVuKWYoY3JlYXRpbmcpZyhhKWcoY29uKW4odGV4dClnKG9iKTUKK2IoamVjdC4pMCA1MDU5IHkgRm0oVkVSSUZZX05PTkUpMCA1MTU5IHkoVkVSSUZZX1BFRVIpcAorMCA1MjIwIDE1NjAgNCB2IDkyIDUyNzQgYSBGaSgzKTEyNyA1Mjk3IHkgRmgoU2VlKTI0IGIKK0ZxKGh0dHA6Ly93d3cubG90aGEpbihyLmNvbS90ZWNoL2NyeXB0by8pcCAwIDU1NDkgMzkwMQorNCB2IDAgNTY0OSBhIEZnKDgpMjIzOSBiKDMpODMgYiBGbShPcGVuU1NMKTI0IGIgRmcoXDAyNilrKFB5dGhvbilmCisoaW50ZXJmYWNlKWgodG8pZihPcClyKGVuU1NMKXAgZW9wIGVuZAorJSVQYWdlOiA5IDkKK1RlWERpY3QgYmVnaW4gOSA4IGJvcCAwIDgzIGEgRm0oVkVSSUZZX0ZBSUxfSUZfTilvKE9fKW8oUEVFKW8oUl8pbyhDRSlvCisoUlQpMjA4IDE4MyB5IEZyKFRoZXNlKTI3IGIoY29uc3RhbiluKHRzKWYocmVwcmVzZW4pbih0KWgodGhlKWgodiluCisoZXJpXDAzNGNhdGlvbillKG1vKXIoZGUpaCh1c2VkKWgoYiluKHkpZih0aGUpaChDb24pbih0ZXh0KWYob2IpNQorYihqZWN0J3MpMjcgYiBGbShzZXRfdmVyaWZ5KWQgRnIobWV0aG8pcihkLikwIDMzMCB5IEZtKEZJTEVUWVBFX1BFTSkwCis0MjkgeShGSUxFVFlQRV9BU04xKTIwOCA1MjkgeSBGcihGaWxlKTQxIGIodCluKHlwKXIoZSlnKGNvbnN0YW4pbih0cylmCisodXNlZCloKHdpdGgpZyh0aGUpaCBGbSh1c2VfY2VydGlmaWNhdGUpbyhfZilvKGlsZSkzNAorYiBGcihhbmQpNDEgYiBGbSh1c2VfcHJpdmF0ZWtleV9mKW8oaWwpbyhlKTM1IGIgRnIobWV0aG8pcihkcyk0MQorYihvZikyMDggNjI4IHkoQ29uKW4odGV4dCkyNyBiKG9iKTUgYihqZWN0cy4pMCA3NzUgeQorRm0oT1BfU0lOR0xFX0RIX1VTRSkwIDg3NSB5KE9QX0VQSEVNRVJBTF9SU0EpMCA5NzUgeShPUF9OT19TU0x2MikwCisxMDc0IHkoT1BfTk9fU1NMdjMpMCAxMTc0IHkoT1BfTk9fVExTdjEpMjA4IDEyNzMgeSBGcihDb25zdGFuKW4odHMpMzAKK2IodXNlZClpKHdpdGgpZyBGbShzZXRfb3B0aW9ucykyNiBiIEZyKG9mKTMyIGIoQ29uKW4odGV4dClmKG9iKTUKK2IoamVjdHMuKTQ4IGIgRm0oT1BfU0lOR0xFX0RIX1VTRSkyNSBiIEZyKG1lYW5zKTMxIGIodG8pZyhhbHcpbihhKW4oeXMpCitmKGNyZWF0ZSlnKGEpMjA4IDEzNzMgeShuZXcpMTkgYihrKW4oZXkpZih3aGVuKWgodXNpbmcpZyhlcGhlbWVyYWwpZgorKERpXDAzNmUtSGVsbG1hbi4pMzQgYiBGbShPUF9FUEhFTUVSQUxfUlNBKTEzIGIgRnIobWVhbnMpMTgKK2IodG8paChhbHcpbihhKW4oeXMpZSh1c2UpaShlcGhlbWVyYWwpZyhSU0EpMjA4IDE0NzMKK3koayluKGV5cylmKHdoZW4paChkb2luZylmKFJTQSlpKG9wKXIoZXJhdGlvbnMuKTMzIGIKK0ZtKE9QX05PX1NTTHYyKXAgRnIoLCkxNiBiIEZtKE9QX05PX1NTTHYzKWYgRnIoYW5kKWsKK0ZtKE9QX05PX1RMU3YxKTE0IGIgRnIobWVhbnMpMTkgYih0bylnKGRpc2FibGUpZih0aG9zZSkyMDgKKzE1NzIgeShzcClyKGVjaVwwMzRjKTI5IGIocHJvdG8pcihjb2xzLikzOSBiKFRoaXMpMjkKK2IoaXMpZyhpbiluKHRlcmVzdGluZylnKGlmKWcoeSluKG91J3JlKWYodXNpbmcpZyhlLmcuKTQxCitiIEZtKFNTTHYyM19NRVRIT0QpMjQgYiBGcih0bykyOSBiKGdldClnKGFuKWYoU1NMdjItY29tcGF0aWJsZSkyMDgKKzE2NzIgeShoYW5kc2hhayluKGUsKWUoYnV0KWkoZG9uJ3QpZyh3KW4oYW4pbih0KWYodG8pZyh1c2UpaChTU0x2Mi4pMAorMTgxOSB5IEZtKENvbnRleHRUeXBlKTIwOCAxOTE4IHkgRnIoQSlmKFB5dGhvbiloKHQpbih5cClyKGUpZyhvYik1CitiKGplY3QpMjggYihyZXByZXNlbiluKHRpbmcpZCh0aGUpaihDb24pbih0ZXh0KWcob2IpNQorYihqZWN0KTI3IGIodCluKHlwKXIoZS4pMCAyMDY1IHkgRm0oQ29udGV4dFwoKXAgRmQobWV0aG8pbChkKTkKK2IgRm0oXCkpMjA4IDIxNjUgeSBGcihGKS03IGIoYWN0b3J5KTM0IGIoZnVuY3Rpb24paSh0aGF0KWcoY3JlYXRlcylmKGEpCitnKG5ldyloKENvbiluKHRleHQpZihvYik1IGIoamVjdCkzNiBiKGdpdiluKGVuKWUoYW4paShTU0wpZyhtZXRobylyKGQuKQorNjEgYihUaGUpMzYgYihtZXRobylyKGQpZyhzaG91bGQpZyhiKXIoZSkyMDggMjI2NSB5IEZtKFNTTHYyX01FVEhPRClwCitGcigsKTIyIGIgRm0oU1NMdjNfTUVUSE9EKXAgRnIoLCloIEZtKFNTTHYyM19NRVRIT0QpZgorRnIob3IpMjcgYiBGbShUTFN2MV9NRVRIT0QpcCBGciguKTAgMjQxMSB5IEZtKENvbm5lY3Rpb25UeXBlKTIwOAorMjUxMSB5IEZyKEEpZyhQeXRob24paCh0KW4oeXApcihlKWcob2IpNSBiKGplY3QpMjggYihyZXByZXNlbiluKHRpbmcpZAorKHRoZSlqKENvbm5lY3Rpb24pZihvYik1IGIoamVjdCkyOCBiKHQpbih5cClyKGUuKTAgMjY1OAoreSBGbShDb25uZWN0aW9uXCgpcCBGZChjKWwob250ZXh0LCljKHNvKWwoY2tldCk4IGIgRm0oXCkpMjA4CisyNzU4IHkgRnIoRiktNyBiKGFjdG9yeSkyNiBiKGZ1Y25jdGlvbilpKHRoYXQpZyhjcmVhdGVzKWUoYSloKG5ldyloCisoQ29ubmVjdGlvbilmKG9iKTUgYihqZWN0KTI3IGIoZ2l2KW4oZW4pZyhhbilnKFNTTCloKGNvbiluKHRleHQpZihhbmQpaAorKGEpZihzbylyKGMpbihrKW4oZXQpMzUzOCAyNzI3IHkgRmwoNCkzNjAzIDI3NTggeSBGcihvYik1CitiKGplY3QuKTAgMjkwNCB5IEZuKGV4Y2VwdGlvbikzMiBiIEZtKEVycm9yKTIwOCAzMDA0Cit5IEZyKFRoaXMpaShleGNlcHRpb24pZyhpcyloKHVzZWQpZihhcylnKGEpaChiYXNlKWUoY2xhc3MpaChmb3IpZyh0aGUpaAorKG90aGVyKWYoU1NMLXJlbGF0ZWQpZyhleGNlcHRpb25zLClpKGJ1dClmKG1hKW4oeSlmKGFsc28pZihiKXIoZSlpCisocmFpc2VkKTIwOCAzMTA0IHkoZGlyZWN0bHkpLTcgYiguKTIwOCAzMjM2IHkoV2hlbmV2KW4oZXIpMzYKK2IodGhpcyloKGV4Y2VwdGlvbilnKGlzKWcocmFpc2VkKWYoZGlyZWN0bHkpLTcgYigsKTQwCitiKGl0KWQoaGFzKWcoYSlmKGxpc3QpaShvZilmKGVycm9yKWUobWVzc2FnZXMpaChmcm9tKWcodGhlKWkoT3ApcgorKGVuU1NMKWYoZXJyb3IpMjA4IDMzMzYgeShxdWV1ZSwpayh3aGVyZSlkKGVhYyluKGgpZihpdGVtKWkoaXMpZyhhKWYKKyh0dXBsZSloIEZtKFwoKXAgRmQobGliKTUgYiBGbSgsKTQ0IGIgRmQoZnVuY3Rpb24pNiBiCitGbSgsKTQzIGIgRmQocilsKGUpbChhc29uKTYgYiBGbShcKSlwIEZyKC4pNzAgYihIZXJlKTM4CitiIEZkKGxpYik1IGIgRnIoLCk0MyBiIEZkKGZ1bmN0aW9uKWggRnIoYW5kKTM5IGIgRmQocilsKGUpbChhc29uKTQ1CitiIEZyKGFyZSkzNyBiKGFsbCkyMDggMzQzNiB5KHN0cmluZ3MsKTI2IGIoZGVzY3JpYmluZyloKHdoZXJlKWcoYW5kKWcKKyh3aGF0KWgodGhlKWcocHJvYmxlbSlmKGlzLikzNiBiKFNlZSkyOCBiIEZkKGVycilwIEZyKFwoM1wpKWcoZm9yKWYKKyhtb3JlKWcoaW5mb3JtYXRpb24uKTAgMzU4MyB5IEZuKGV4Y2VwdGlvbikzMiBiIEZtKFplcm9SZXR1cm5FcnJvcikyMDgKKzM2ODIgeSBGcihUaGlzKWcoZXhjZXB0aW9uKWcobWF0YyluKGhlcylnKHRoZSloKGVycm9yKWQocmV0dXJuKWkoY28pcgorKGRlKWggRm0oU1NMX0VSUk9SX1pFUk9fKW8oUkUpbyhUVVIpbyhOKXAgRnIoLCkyNiBiKGFuZCkzMworYihpcylmKHJhaXNlZClmKHdoZW4paSh0aGUpZyhTU0wpMjA4IDM3ODIgeShDb25uZWN0aW9uKWMoaGFzKWcoYilyKGVlbikKK2goY2xvc2VkLik0MyBiKEluKTI5IGIoU1NMKWgoMy4wKWYoYW5kKWgoVExTKWcoMS4wLClmKHRoaXMpaChvbmx5KWYobylyCisoY2N1cnMpZyhpZiloKGEpZyhjbG9zdXJlKWUoYWxlcnQpaChoYXMpZyhvKXIoY2N1cnJlZCkyMDgKKzM4ODEgeShpbilnKHRoZSlnKHByb3RvKXIoY29sLClmKGkuZS4pNDEgYih0aGUpMjkgYihjb25uZWN0aW9uKWYoaGFzKWcKKyhiKXIoZWVuKWkoY2xvc2VkKWUoY2xlYW5seSktNyBiKC4pNDAgYihOb3RlKTI5IGIodGhhdClnKHRoaXMpZyhkbylyCisoZXMpZihub3QpaChuZWNlc3NhcmlseSllKG1lYW4pMjA4IDM5ODEgeSh0aGF0KWcodGhlKWgodHJhbnNwKXIob3J0KWYKKyhsYSluKHkpbihlcilmKFwoZS5nLikzNiBiKGEpMjggYihzbylyKGMpbihrKW4oZXRcKSllKGhhcyloKGIpcihlZW4paAorKGNsb3NlZC4pMjA4IDQxMTQgeShJdClrKG1hKW4oeSlmKHNlZW0paChhKWYobGl0dGxlKWkoc3RyYW5nZSllKHRoYXQpaAorKHRoaXMpZyhpcylnKGFuKWcoZXhjZXB0aW9uLClnKGJ1dCloKGl0KWYoZG8pcihlcylnKG1hdGMpbihoKWcoYW4pZgorRm0oU1NMX0VSUk9SKWUgRnIoY28pcihkZSwpaihhbmQpZyhpcykyMDggNDIxNCB5KHYpbihlcnkpMjYKK2IoY29uKW4odiluKGVuaWVuKW4odC4pMCA0MzYwIHkgRm4oZXhjZXB0aW9uKTMyIGIgRm0oV2FudFJlYWRFcnJvcikyMDgKKzQ0NjAgeSBGcihUaGUpaShvcClyKGVyYXRpb24pZShkaWQpaihub3QpZihjb21wbGV0ZTspaih0aGUpZChzYW1lKWcKKyhJL08pZihtZXRobylyKGQpaChzaG91bGQpZyhiKXIoZSlnKGNhbGxlZClnKGFnYWluKWYobGF0ZXIsKWkod2l0aClmCisodGhlKWgoc2FtZSkyMDggNDU2MCB5KGFyZ3VtZW4pbih0cy4pZyhBbiluKHkpMjggYihJL08pZShtZXRobylyKGQpaQorKGNhbilmKGxlYWQpaCh0bylmKHRoaXMpaChzaW5jZSlmKG5ldyloKGhhbmRzaGFrKW4oZXMpZShjYW4paChvKXIoY2N1cikKK2coYXQpZyhhbiluKHkpZyh0aW1lLikwIDQ3MDcgeSBGbihleGNlcHRpb24pMzIgYiBGbShXYW50V3JpdGVFcnJvcikyMDgKKzQ4MDYgeSBGcihTZWUpMjcgYiBGbShXYW50UmVhZEVycm9yKXAgRnIoLikwIDQ5NTMgeSBGbihleGNlcHRpb24pMzIKK2IgRm0oV2FudFg1MDlMb29rdXBFKW8ocnIpbyhvcikyMDggNTA1MyB5IEZyKFRoZSkyNCBiKG9wKXIoZXJhdGlvbilnCisoZGlkKWgobm90KWcoY29tcGxldGUpZihiKXIoZWNhdXNlKWcoYW4paChhcHBsaWNhdGlvbilmKGNhbGxiYWMpbihrKWYKKyhoYXMpaChhc2spbihlZClnKHRvKWcoYilyKGUpaChjYWxsZWQpZyhhZ2Fpbi4pMzQgYihUaGUpMjUKK2IoSS9PKTIwOCA1MTUyIHkobWV0aG8pcihkKWYoc2hvdWxkKWgoYilyKGUpZihjYWxsZWQpZyhhZ2FpbilnKGxhdGVyLClnCisod2l0aCloKHRoZSlnKHNhbWUpZShhcmd1bWVuKW4odHMuKTM1IGIoTm90ZTopZyhUaGlzKTI0CitiKHcpbihvbid0KWgobylyKGNjdXIpZShpbilpKHRoaXMpZyh2KW4oZXJzaW9uLClwIDAgNTIyMgorMTU2MCA0IHYgOTIgNTI3NSBhIEZpKDQpMTI3IDUyOTkgeSBGaChBKW4oY3R1YWxseSktNgorYigsKTI1IGIoYWxsKWUodGhhdClqKGlzKWQocmVxdWlyZWQpaihpcyllKGFuKWcob2IpdChqZWN0KWgodGhhdCloCitGYihiKWwoZWhhdmVzKWUgRmgobGlrKW4oZSlnKGEpaChzbylyKGMpbihrKW4oZXQsKWcoeSluKG91KWcoY291bGQpZworKGV2KW4oZW4pZyh1c2UpZihcMDM0bGVzLClnKGV2KW4oZW4paSh0aG91Z2gpZihpdCdkKWYoYilyKGUpaCh0cmljKW4KKyhreSlnKHRvKTAgNTM3NyB5KGdldClnKHRoZSlmKGhhbmRzaGFrKW4oZXMpaChyaWdoKW4odCEpcAorMCA1NTQ5IDM5MDEgNCB2IDAgNTY0OSBhIEZnKDMuMyk4MiBiIEZtKFNTTCkyNiBiIEZnKFwwMjYpaShBbilnCisoaW50ZXJmYWNlKWcodG8pZih0aGUpZyhTU0wtc3ApcihlY2lcMDM0YyloKHBhKW4ocnRzKWYob2YpaChPcClyKGVuU1NMKQorMTY1MiBiKDkpcCBlb3AgZW5kCislJVBhZ2U6IDEwIDEwCitUZVhEaWN0IGJlZ2luIDEwIDkgYm9wIDIwOCA4MyBhIEZyKGFzKTI2IGIodGhlcmUpaShhcmUpZShubylpKHN1YyluKGgpZgorKGNhbGxiYWMpbihrcylmKGluKWkodGhpcylmKHYpbihlcnNpb24uKTAgMjMwIHkgRm4oZXhjZXB0aW9uKTMyCitiIEZtKFN5c0NhbGxFcnJvcikyMDggMzMwIHkgRnIoVGhlKTI1IGIgRm0oU3lzQ2FsbEVycm9yKTIwCitiIEZyKG8pcihjY3VycylrKHdoZW4paSh0aGVyZSdzKWUoYW4paChJL08pZyhlcnJvcillKGFuZClpKE9wKXIKKyhlblNTTCdzKWcoZXJyb3IpZShxdWV1ZSlpKGRvKXIoZXMpZyhub3QpZyhjb24pbih0YWluKWcoYW4pbih5KTIwOAorNDI5IHkoaW5mb3JtYXRpb24uKTU5IGIoVGhpcykzNiBiKGNhbilmKG1lYW4pZyh0KW4odyluKG8pZyh0aGluZ3M6KTUyCitiKEFuKTM2IGIoZXJyb3IpZChpbilqKHRoZSlnKHRyYW5zcClyKG9ydCllKHByb3RvKXIoY29sLClpKG9yKWYoYW4pZworKGVuZCloKG9mKWYoXDAzNGxlKWgodGhhdCkyMDggNTI5IHkodmlvbGF0ZXMpMjYgYih0aGUpaShwcm90bylyKGNvbC4pMzYKK2IoVGhlKTI3IGIocGFyYW1ldGVyKWYodG8paSh0aGUpZyhleGNlcHRpb24pZihpcylnKGFsdyluKGEpbih5cylmKGEpaAorKHBhaXIpZyBGbShcKClwIEZkKGVycm51bSk2IGIgRm0oLCk0MiBiIEZkKGVycnN0cik5IGIKK0ZtKFwpKXAgRnIoLikwIDc5MiB5IEZnKENvbnRleHQpMjcgYihvYmplY3RzKTAgOTkyIHkKK0ZyKENvbiluKHRleHQpZyhvYik1IGIoamVjdHMpMjcgYihoYSluKHYpbihlKWcodGhlKWgoZm9sbG8pbih3aW5nKWUKKyhtZXRobylyKGRzOikwIDExMzkgeSBGbShjaGVja19wcml2YXRla2V5KW8oXChcKSkyMDgKKzEyNTUgeSBGcihDaGVjKW4oaylrKGlmKWkodGhlKWcocHJpdiktNSBiKGF0ZSkzMSBiKGspbihleSlmKFwobG9hZGVkKWgKKyh3aXRoKWggRm0odXNlX3ByaXZhdGVrZXkpcCBGYyhbKXAgRm0oXylvKGZpKW8obGUpMTEKK2IgRmMoXSlwIEZyKFwpKTI2IGIobWF0YyluKGhlcylrKHRoZSlpKGNlcnRpXDAzNGNhdGUpZihcKGxvYWRlZClnKHdpdGgpCisyMDggMTM4MyB5IEZtKHVzZV9jZXJ0aWZpY2F0ZSlvIEZjKFspcCBGbShfKW8oZmlsKW8oZSkxMQorYiBGYyhdKXAgRnIoXCkuKTMxIGIoUmV0dXJucylkKHRydWUpZihpZiloKHRoZXkpZyhtYXRjKW4oaCwpZihmYWxzZSloCisob3RoZXJ3aXNlLikwIDE1MzAgeSBGbShnZXRfYXBwX2RhdGFcKFwpKTIwOCAxNjMwIHkgRnIoUmV0cmlldiluKGUpZQorKGFwcGxpY2F0aW9uKWgoZGF0YSlnKGFzKWcoc2V0KWgoYiluKHkpZyBGbShzZXRfYXBwX2RhdGEpcAorRnIoLikwIDE3NzYgeSBGbShnZXRfY2VydF9zdG9yZVwoXCkpMjA4IDE4NzYgeSBGcihSZXRyaWV2KW4oZSkzNAorYih0aGUpaShjZXJ0aVwwMzRjYXRlKWYoc3RvcmUpZihcKGEpaChYNTA5U3RvcmUpZihvYik1CitiKGplY3RcKSkzNSBiKHRoYXQpaCh0aGUpZihjb24pbih0ZXh0KWcodXNlcy4pNjAgYihUaGlzKTM1CitiKGNhbilnKGIpcihlKWgodXNlZClmKHRvKWcoYWRkKTIwOCAxOTc2IHkoInRydXN0ZWQiKTI2CitiKGNlcnRpXDAzNGNhdGVzKWgod2l0aG91dCloKHVzaW5nKWYodGhlLikzNyBiIEZtKGxvYWRfdmVyaWZ5X2xvY2EpbworKHRpbylvKG5zKW8oXChcKSkyMSBiIEZyKG1ldGhvKXIoZC4pMCAyMTIzIHkgRm0oZ2V0X3RpbWVvdXRcKFwpKTIwOAorMjIyMiB5IEZyKFJldHJpZXYpbihlKTI2IGIoc2Vzc2lvbiloKHRpbWVvdXQsKWgoYXMpZihzZXQpZyhiKW4oeSlpCitGbShzZXRfdGltZW91dClwIEZyKC4paihUaGUpYyhkZWZhdWx0KWcoaXMpZigzMDApZihzZWNvbmRzLikwCisyMzY5IHkgRm0oZ2V0X3ZlcmlmeV9kZXB0aClvKFwoXCkpMjA4IDI0NjkgeSBGcihSZXRyaWV2KW4oZSlnKHRoZSlpCisoQ29uKW4odGV4dClmKG9iKTUgYihqZWN0J3MpMjggYih2KW4oZXJpZnkpZShkZXB0aCwpaihhcylkKHNldClpKGIpbih5KQorZyBGbShzZXRfdmVyaWZ5X2RlcHRoKXAgRnIoLikwIDI2MTYgeSBGbShnZXRfdmVyaWZ5X21vZGVcKClvKFwpKTIwOAorMjcxNSB5IEZyKFJldHJpZXYpbihlKWUodGhlKWkoQ29uKW4odGV4dClmKG9iKTUgYihqZWN0J3MpMjgKK2IodiluKGVyaWZ5KWUobW8pcihkZSwpaShhcylmKHNldCloKGIpbih5KWcgRm0oc2V0X3ZlcmlmeV9tb2RlKXAKK0ZyKC4pMCAyODYyIHkgRm0obG9hZF9jbGllbnRfY2FcKClwIEZkKHApbChlbVwwMzRsZSk2CitiIEZtKFwpKTIwOCAyOTYyIHkgRnIoUmVhZCkzMyBiKGEpZyhcMDM0bGUpaCh3aXRoKWcoUEVNLWZvcm1hdHRlZClnCisoY2VydGlcMDM0Y2F0ZXMpZih0aGF0KWgod2lsbClnKGIpcihlKWcoc2VuKW4odClmKHRvKWgodGhlKWcoY2xpZW4pbih0KQorZih3aGVuKWgocmVxdWVzdGluZylmKGEpZyhjbGllbiluKHQpMjA4IDMwNjEgeShjZXJ0aVwwMzRjYXRlLikwCiszMjA4IHkgRm0obG9hZF92ZXJpZnlfbG9jYSlvKHRpKW8ob25zKW8oXCgpcCBGZChwKWwoZW1cMDM0bGUpNgorYiBGbShcKSkyMDggMzMwOCB5IEZyKFNwKXIoZWNpZnkpMjQgYih3aGVyZSlmKENBKWcoY2VydGlcMDM0Y2F0ZXMpZworKGZvcilnKHYpbihlcmlcMDM0Y2F0aW9uKWYocHVycClyKG9zZXMpaChhcmUpZihsbylyKGNhdGVkLikzNQorYihUaGVzZSkyMyBiKGFyZSlnKHRydXN0ZWQpZyhjZXJ0aVwwMzRjYXRlcy4pMzUgYihOb3RlKTIwOAorMzQwNyB5KHRoYXQpMjcgYih0aGUpaChjZXJ0aVwwMzRjYXRlcylmKGhhKW4odiluKGUpZih0bylpKGIpcihlKWcoaW4pZworKFBFTSlnKGZvcm1hdC4pMCAzNTU0IHkgRm0obG9hZF90bXBfZGhcKClwIEZkKGRoXDAzNGxlKTYKK2IgRm0oXCkpMjA4IDM2NTQgeSBGcihMb2FkKTI2IGIocGFyYW1ldGVycylnKGZvciloKEVwaGVtZXJhbClnCisoRGlcMDM2ZS1IZWxsbWFuKWgoZnJvbSlnIEZkKGRoXDAzNGxlKTYgYiBGciguKTAgMzgwMQoreSBGbShzZXRfYXBwX2RhdGFcKClwIEZkKGRhdGEpZyBGbShcKSkyMDggMzkwMCB5IEZyKEFzc28pcihjaWF0ZSkyNQorYiBGZChkYXRhKTMzIGIgRnIod2l0aCkyNyBiKHRoaXMpZihDb24pbih0ZXh0KWYob2IpNQorYihqZWN0LikzNiBiIEZkKGRhdGEpZSBGcihjYW4pMjUgYihiKXIoZSlpKHJldHJpZXYpbihlZClkKGxhdGVyKWkKKyh1c2luZylmKHRoZSlpIEZtKGdldF9hcHBfZGF0YSkyMSBiIEZyKG1ldGhvKXIoZC4pMCA0MDQ3Cit5IEZtKHNldF9jaXBoZXJfbGlzdFwoKW8gRmQoY2lwaGVycyk3IGIgRm0oXCkpMjA4IDQxNDcKK3kgRnIoU2V0KTI4IGIodGhlKWcobGlzdCloKG9mKWYoY2lwaGVycylmKHRvKWgoYilyKGUpZyh1c2VkKWcoaW4pZworKHRoaXMpaChjb24pbih0ZXh0LikzNyBiKFNlZSkyOCBiKHRoZSloKE9wKXIoZW5TU0wpZihtYW4pbih1YWwpZihmb3IpaAorKG1vcmUpZihpbmZvcm1hdGlvbilnKFwoZS5nLikyMDggNDI0NyB5KGNpcGhlcnNcKDFcKVwpKTAKKzQzOTMgeSBGbShzZXRfaW5mb19jYWxsYmFjKW8oa1woKW8gRmQoYylsKGFsKXQobGIpbChhY2spOQorYiBGbShcKSkyMDggNDQ5MyB5IEZyKFNldCkzMyBiKHRoZSlmKGluZm9ybWF0aW9uKWcoY2FsbGJhYyluKGspZih0bylpCitGZChjKWwoYWwpdChsYilsKGFjayk5IGIgRnIoLik1NCBiKFRoaXMpMzIgYihmdW5jdGlvbiloKHdpbGwpZyhiKXIoZSlnCisoY2FsbGVkKWYoZnJvbSlnKHRpbWUpaCh0bylnKHRpbWUpZyhkdXJpbmcpZihTU0wpMjA4Cis0NTkzIHkoaGFuZHNoYWspbihlcy4pMjA4IDQ3MjYgeSBGZChjKWwoYWwpdChsYilsKGFjaylqCitGcihzaG91bGQpMjQgYih0YWspbihlKWcodGhyZWUpZyhhcmd1bWVuKW4odHM6KTM0IGIoYSkyNQorYihDb25uZWN0aW9uKWYob2IpNSBiKGplY3QpMjQgYihhbmQpZyh0KW4odyluKG8pZyhpbiluKHRlZ2Vycy4pMzUKK2IoVGhlKTI0IGIoXDAzNHJzdCloKGluKW4odGVnZXIpZShzcClyKGVjaVwwMzRlcykyMDgKKzQ4MjUgeSh3aGVyZSkyOSBiKGluKWkodGhlKWcoU1NMKWcoaGFuZHNoYWspbihlKWUodGhlKWkoZnVuY3Rpb24pZyh3KW4KKyhhcyllKGNhbGxlZCwpaShhbmQpZih0aGUpaChvdGhlcilmKHRoZSloKHJldHVybilmKGNvKXIoZGUpZyhmcm9tKWcoYSlnCisoXChwKXIob3NzaWJseSkyMDggNDkyNSB5KGZhaWxlZFwpKWQoaW4pbih0ZXJuYWwpZyhmdW5jdGlvbiloKGNhbGwuKTAKKzUwNzIgeSBGbShzZXRfb3B0aW9uc1woKXAgRmQob3B0aW9ucyk3IGIgRm0oXCkpMjA4IDUxNzEKK3kgRnIoQSluKGRkKTI3IGIoU1NMKWgob3B0aW9ucy4pMzYgYihPcHRpb25zKTI3IGIoeSluKG91KWcoaGEpbih2KW4oZSlnCisoc2V0KWcoYilyKGVmb3JlKWcoYXJlKWcobm90KWgoY2xlYXJlZCEpMjA4IDUzMDQgeShUaGlzKWYobWV0aG8pcihkKWgKKyhzaG91bGQpZihiKXIoZSloKHVzZWQpZyh3aXRoKWcodGhlKWcgRm0oT1BfKillIEZyKGNvbnN0YW4pbih0cy4pcAorMCA1NTQ5IDM5MDEgNCB2IDAgNTY0OSBhIEZnKDEwKTIxOTcgYigzKTgzIGIgRm0oT3BlblNTTCkyNAorYiBGZyhcMDI2KWsoUHl0aG9uKWYoaW50ZXJmYWNlKWgodG8pZihPcClyKGVuU1NMKXAgZW9wCitlbmQKKyUlUGFnZTogMTEgMTEKK1RlWERpY3QgYmVnaW4gMTEgMTAgYm9wIDAgOTAgYSBGbShzZXRfcGFzc3dkX2NiXCgpcCBGZChjKWwoYWwpdChsYilsCisoYWNrKTkgYiBGYyhbKXAgRmQoLCkyNSBiKHVzZXIpbChkYXRhKTE5IGIgRmMoXSlwIEZtKFwpKTIwOAorMTg5IHkgRnIoU2V0KTQyIGIodGhlKWcocGFzc3BocmFzZSlmKGNhbGxiYWMpbihrKWYodG8paQorRmQoYylsKGFsKXQobGIpbChhY2spOSBiIEZyKC4pODIgYihUaGlzKTQyIGIoZnVuY3Rpb24paCh3aWxsKWYoYilyKGUpZworKGNhbGxlZClnKHdoZW4pZyhhKWcocHJpdiktNSBiKGF0ZSk0MiBiKGspbihleSlmKHdpdGgpaChhKTIwOAorMjg5IHkocGFzc3BocmFzZSkyNSBiKGlzKWoobG9hZGVkLikyMDggNDIyIHkgRmQoYylsKGFsKXQobGIpbChhY2spNTQKK2IgRnIoc2hvdWxkKTQzIGIodGFrKW4oZSlmKGEpaChiKXIobylyKG9sZWFuKWcoYXJndW1lbiluKHQpZgorRmQocilsKGVwKWwoZSlsKGF0KTUxIGIgRnIoYW5kKTQzIGIoYW4pZyhhcmJpdHJhcnkpZShhcmd1bWVuKW4odCloCitGZChkYXRhKTUxIGIgRnIoYW5kKTQzIGIocmV0dXJuKWcodGhlKTIwOCA1MjEgeShwYXNzcGhyYXNlKTMzCitiKGVuKW4odGVyZWQpaShiKW4oeSlmKHRoZSlpKHVzZXIuKTU5IGIoSWYpNDIgYiBGZChyKWwoZXApbChlKWwoYXQpaAorRnIoaXMpMzYgYih0cnVlKWYodGhlbilnIEZkKGMpbChhbCl0KGxiKWwoYWNrKTQ2IGIgRnIoc2hvdWxkKTM1CitiKGFzaylnKGZvcilmKHRoZSlpKHBhc3NwaHJhc2UpZCh0KW4od2ljZSkyMDggNjIxIHkoYW5kKWQobWFrKW4oZSlnCisoc3VyZSlnKHRoYXQpaCh0aGUpZyh0KW4odyluKG8pZihlbiluKHRyaWVzKWcoYXJlKWcoZXF1YWwuKTQ2CitiKFRoZSkzMSBiIEZkKGRhdGEpMzggYiBGcihhcmd1bWVuKW4odCkyOSBiKGlzKWkodGhlKWcKK0ZkKHVzZXIpbChkYXRhKTM4IGIgRnIodiktNSBiKGFyaWFibGUpMjkgYihwYXNzZWQpaCh0bykyMDgKKzcyMSB5KHRoZSlqIEZtKHNldF9wYXNzd2RfY2IpMjcgYiBGcihtZXRobylyKGQuKTU0IGIoSWYpMzMKK2IoYW4pZyhlcnJvcillKG8pcihjY3VycywpaiBGZChjKWwoYWwpdChsYilsKGFjayk0MyBiCitGcihzaG91bGQpMzMgYihyZXR1cm4pZihhKWgoZmFsc2UpZyh2KS01IGIoYWx1ZSkzMiBiKFwoZS5nLik1MworYihhbikzMyBiKGVtcHQpbih5KTIwOCA4MjAgeShzdHJpbmdcKS4pMCA5NjcgeSBGbShzZXRfc2Vzc2lvbl9pZFwoKXAKK0ZkKG4pbyhhbWUpNiBiIEZtKFwpKTIwOCAxMDY3IHkgRnIoU2V0KTMzIGIodGhlKWgoY29uKW4odGV4dClmCitGZChuYW1lKTM5IGIgRnIod2l0aGluKTM0IGIod2hpYyluKGgpZihhKWcoc2Vzc2lvbilmKGNhbiloKGIpcihlKWgKKyhyZXVzZWQpZShmb3IpaCh0aGlzKWcoQ29uKW4odGV4dClnKG9iKTUgYihqZWN0Lik1NCBiKFRoaXMpMzMKK2IoaXMpZyhuZWVkZWQpMjA4IDExNjYgeSh3aGVuKWUoZG9pbmcpZyhzZXNzaW9uKWcocmVzdW1wdGlvbiwpaChiKXIKKyhlY2F1c2UpZyh0aGVyZSlmKGlzKWgobm8pZih3KW4oYSluKHkpZyhmb3IpZyhhKWcoc3RvcmVkKWcoc2Vzc2lvbilmCisodG8paShrbm8pbih3KWYod2hpYyluKGgpZyhDb24pbih0ZXh0KTIwOCAxMjY2IHkob2IpNQorYihqZWN0KTI3IGIoaXQpaChpcylmKGFzc28pcihjaWF0ZWQpZyh3aXRoLikzNyBiIEZkKG5hbWUpZAorRnIobWEpbih5KTI3IGIoYilyKGUpaChhbiluKHkpZShiaW5hcnkpaChkYXRhLikwIDE0MTMKK3kgRm0oc2V0X3RpbWVvdXRcKClwIEZkKHRpbWUpbChvdXQpOCBiIEZtKFwpKTIwOCAxNTEyCit5IEZyKFNldCkyOSBiKHRoZSlnKHRpbWVvdXQpaChmb3IpZShuZXdseSloKGNyZWF0ZWQpZihzZXNzaW9ucylnKGZvciloCisodGhpcylnKENvbiluKHRleHQpZyhvYik1IGIoamVjdCkyOCBiKHRvKWggRmQodGltZSlsKG91dCk4CitiIEZyKC4pNDEgYiBGZCh0aW1lKWwob3V0KTM2IGIgRnIobSluKHVzdCkyOSBiKGIpcihlKWgoZ2l2KW4oZW4pMjA4CisxNjEyIHkoaW4pZihcKHdob2xlXCkpZihzZWNvbmRzLik0MCBiKFRoZSkyOSBiKGRlZmF1bHQpZyh2KS01CitiKGFsdWUpMjggYihpcyloKDMwMCllKHNlY29uZHMuKTQwIGIoU2VlKTI5IGIodGhlKWcoT3ApcihlblNTTClnKG1hbiluCisodWFsKWYoZm9yKWcobW9yZSlnKGluZm9ybWF0aW9uKTIwOCAxNzEyIHkoXChlLmcuKTM2CitiKFNTTF9DVFhfc2V0X3RpbWVvdXRcKDNcKVwpLikwIDE4NTkgeSBGbShzZXRfdmVyaWZ5XCgpcAorRmQobW8pbChkZSwpMjYgYihjKWwoYWwpdChsYilsKGFjayk5IGIgRm0oXCkpMjA4IDE5NTgKK3kgRnIoU2V0KTI4IGIodGhlKWgodiluKGVyaVwwMzRjYXRpb24pZShcMDM1YWdzKWcoZm9yKWgodGhpcyloKENvbiluCisodGV4dClmKG9iKTUgYihqZWN0KTI4IGIodG8pZyBGZChtbylsKGRlKTM2IGIgRnIoYW5kKTI4CitiKHNwKXIoZWNpZnkpaCh0aGF0KWYgRmQoYylsKGFsKXQobGIpbChhY2spMzkgYiBGcihzaG91bGQpMjgKK2IoYilyKGUpaCh1c2VkKWcoZm9yKTIwOCAyMDU4IHkodiluKGVyaVwwMzRjYXRpb24pMjMKK2IoY2FsbGJhYyluKGtzLikzNCBiIEZkKG1vKWwoZGUpZSBGcihzaG91bGQpMjUgYihiKXIoZSlnKG9uZSlnKG9mKTMxCitiIEZtKFZFUklGWV9OT05FKTIwIGIgRnIoYW5kKTI1IGIgRm0oVkVSSUZZX1BFRVIpcCBGciguKTIwCitiKElmKTMyIGIgRm0oVkVSSUZZX1BFRVIpMjAgYiBGcihpcykyNSBiKHVzZWQsKTIwOCAyMTU3Cit5IEZkKG1vKWwoZGUpayBGcihjYW4pMjIgYihiKXIoZSloKE9SOmVkKWYod2l0aCloIEZtKFZFUklGWV9GQUlMX0lGXylvCisoTk9fKW8oUEUpbyhFUilvKF9DRSlvKFJUKTE2IGIgRnIoYW5kKTIyIGIgRm0oVkVSSUZZX0NMSUVOVF9PTilvKENFKTE2CitiIEZyKHRvKTIyIGIoZnVydGhlcilnKGNvbiluKHRyb2wpMjA4IDIyNTcgeSh0aGUpMjggYihiKXIoZWhhKW4odmlvdXIuKQorMjA4IDIzOTAgeSBGZChjKWwoYWwpdChsYilsKGFjaykzNCBiIEZyKHNob3VsZCkyNCBiKHRhayluKGUpZyhcMDM0diluCisoZSlmKGFyZ3VtZW4pbih0czopMzQgYihBKTI0IGIoQ29ubmVjdGlvbilnKG9iKTUgYihqZWN0LCkyNAorYihhbilnKFg1MDkpZihvYik1IGIoamVjdCwpMjUgYihhbmQpZSh0aHJlZSloKGluKW4odGVnZXIpZih2KS01CitiKGFyaWFibGVzLCkyMDggMjQ4OSB5KHdoaWMpbihoKTI4IGIoYXJlKWcoaW4paCh0dXJuKWcocClyKG90ZW4pbih0aWFsKQorZyhlcnJvcillKG4pbih1bSluKGIpcihlciwpaShlcnJvcillKGRlcHRoKWkoYW5kKWcocmV0dXJuKWcoY28pcihkZS4pNDAKK2IgRmQoYylsKGFsKXQobGIpbChhY2spZyBGcihzaG91bGQpMjggYihyZXR1cm4paCh0cnVlKWcoaWYpMjA4CisyNTg5IHkodiluKGVyaVwwMzRjYXRpb24pZChwYXNzZXMpZyhhbmQpaChmYWxzZSloKG90aGVyd2lzZS4pMAorMjczNiB5IEZtKHNldF92ZXJpZnlfZGVwdGgpbyhcKClwIEZkKGRlcHRoKTYgYiBGbShcKSkyMDgKKzI4MzYgeSBGcihTZXQpMzYgYih0aGUpZyhtYXhpbSluKHVtKWYoZGVwdGgpaChmb3IpZyh0aGUpZworKGNlcnRpXDAzNGNhdGUpZihjKW4oaGFpbilnKHYpbihlcmlcMDM0Y2F0aW9uKWYodGhhdClpKHNoYWxsKWYoYilyKGUpaAorKGFsbG8pbih3KW4oZWQpZShmb3IpaSh0aGlzKWYoQ29uKW4odGV4dCkyMDggMjkzNSB5KG9iKTUKK2IoamVjdC4pMCAzMDgyIHkgRm0odXNlX2NlcnRpZmljYXRlXCgpbyBGZChjKWwoZXJ0KWoKK0ZtKFwpKTIwOCAzMTgyIHkgRnIoVXNlKTI3IGIodGhlKWgoY2VydGlcMDM0Y2F0ZSlmIEZkKGMpbChlcnQpMzUKK2IgRnIod2hpYyluKGgpMjggYihoYXMpZih0bylnKGIpcihlKWgoYSlmKFg1MDkpZyhvYik1CitiKGplY3QuKTAgMzMyOSB5IEZtKHVzZV9jZXJ0aWZpY2F0ZV8pbyhjaClvKGFpbilvKF9mKW8oaWwpbyhlXCgpcAorRmQoXDAzNClvKGxlKWggRm0oXCkpMjA4IDM0MjggeSBGcihMb2FkKTI2IGIoYSloKGNlcnRpXDAzNGNhdGUpZyhjKW4KKyhoYWluKWcoZnJvbSloIEZkKFwwMzRsZSkzNCBiIEZyKHdoaWMpbihoKTI3IGIobSluKHVzdCloKGIpcihlKWcoUEVNKWcKKyhlbmNvKXIoZGVkLikwIDM1NzUgeSBGbSh1c2VfcHJpdmF0ZWtleVwoKXAgRmQocGtleSk3CitiIEZtKFwpKTIwOCAzNjc1IHkgRnIoVXNlKTI3IGIodGhlKWgocHJpdiktNSBiKGF0ZSkyNworYihrKW4oZXkpaCBGZChwa2V5KTM2IGIgRnIod2hpYyluKGgpMjggYihoYXMpZih0bylnKGIpcihlKWgoYSlmKFBLZXkpaAorKG9iKTUgYihqZWN0LikwIDM4MzYgeSBGbSh1c2VfY2VydGlmaWNhdGVfKW8oZmkpbyhsZVwoKW8KK0ZkKFwwMzRsZSloIEZjKFspcCBGZCgsKTI0IGIoZm9ybWF0KWQgRmMoXSlwIEZtKFwpKTIwOAorMzkzNiB5IEZyKExvYWQpaSh0aGUpaChcMDM0cnN0KWcoY2VydGlcMDM0Y2F0ZSlmKGZvdW5kKWgoaW4paAorRmQoXDAzNGxlKTYgYiBGciguKTM2IGIoVGhlKTI0IGIoY2VydGlcMDM0Y2F0ZSlmKG0pbih1c3QpaChiKXIoZSloKGluKWYKKyh0aGUpZyhmb3JtYXQpZyhzcClyKGVjaVwwMzRlZClnKGIpbih5KWggRmQoZm9ybWF0KTgKK2IgRnIoLCkyNSBiKHdoaWMpbihoKTIwOCA0MDM1IHkoaXMpaShlaXRoZXIpZyBGbShGSUxFVFlQRV9QRU0pYworRnIob3IpayBGbShGSUxFVFlQRV9BU04xKXAgRnIoLilrKFRoZSlkKGRlZmF1bHQpZyhpcylmCitGbShGSUxFVFlQRV9QRU0pcCBGciguKTAgNDE4MiB5IEZtKHVzZV9wcml2YXRla2V5X2YpbyhpbClvKGVcKClwCitGZChcMDM0KW8obGUpNiBiIEZjKFspcCBGZCgsKTI1IGIoZm9ybWF0KTIwIGIgRmMoXSlwCitGbShcKSkyMDggNDI4MiB5IEZyKExvYWQpMzEgYih0aGUpaChcMDM0cnN0KWcocHJpdiktNQorYihhdGUpMzEgYihrKW4oZXkpZyhmb3VuZClpKGluKWYgRmQoXDAzNGxlKTYgYiBGciguKTUwCitiKFRoZSkzMiBiKHByaXYpLTUgYihhdGUpMzIgYihrKW4oZXkpZihtKW4odXN0KWgoYilyKGUpZyhpbiloKHRoZSlmCisoZm9ybWF0KWYoc3ApcihlY2lcMDM0ZWQpaShiKW4oeSlmIEZkKGZvcm1hdCk4IGIgRnIoLCkyMDgKKzQzODEgeSh3aGljKW4oaCkyNyBiKGlzKWcoZWl0aGVyKWggRm0oRklMRVRZUEVfUEVNKTIyCitiIEZyKG9yKTI3IGIgRm0oRklMRVRZUEVfQVNOMSlwIEZyKC4pMzIgYihUaGUpMjcgYihkZWZhdWx0KWgoaXMpZworRm0oRklMRVRZUEVfUEVNKXAgRnIoLikwIDQ2NDQgeSBGZyhDb25uZWN0aW9uKWUob2JqZWN0cykwCis0ODQ1IHkgRnIoQ29ubmVjdGlvbiloKG9iKTUgYihqZWN0cykyNyBiKGhhKW4odiluKGUpZih0aGUpaShmb2xsbyluCisod2luZylmKG1ldGhvKXIoZHM6KTAgNDk5MiB5IEZtKGFjY2VwdFwoXCkpMjA4IDUwOTEgeQorRnIoQ2FsbCkzMyBiKHRoZSlnIEZtKGFjY2VwdCllIEZyKG1ldGhvKXIoZClqKG9mKWYodGhlKWgodW5kZXJseWluZylmCisoc28pcihjKW4oayluKGV0KWYoYW5kKWgoc2V0KWgodXApZyhTU0wpZihvbilnKHRoZSloKHJldHVybmVkKWYoc28pcihjKQorbihrKW4oZXQsKWgodXNpbmcpZih0aGUpMjA4IDUxOTEgeShDb24pbih0ZXh0KTIyIGIob2IpNQorYihqZWN0KTIyIGIoc3VwcGxpZWQpaCh0bylmKHRoaXMpaChDb25uZWN0aW9uKWYob2IpNQorYihqZWN0KTIyIGIoYXQpaChjcmVhdGlvbi4pMzQgYihSZXR1cm5zKTIyIGIoYSlnKHBhaXIpZworRm0oXCgpcCBGZChjKWwob25uKTYgYiBGbSgsKTQzIGIgRmQoYWRkcilsKGVzcyk3IGIgRm0oXCkpcAorRnIoLikzNiBiKHdoZXJlKTIwOCA1MjkxIHkgRmQoYylsKG9ubilkIEZyKGlzKTI4IGIodGhlKWcobmV3KWYKKyhDb25uZWN0aW9uKWcob2IpNSBiKGplY3QpMjggYihjcmVhdGVkLCllKGFuZClpIEZkKGFkZHIpbChlc3MpMzUKK2IgRnIoaXMpMjggYihhcylmKHJldHVybmVkKWcoYiluKHkpZyh0aGUpaChzbylyKGMpbihrKW4oZXQncyllCitGbShhY2NlcHQpcCBGciguKXAgMCA1NTQ5IDM5MDEgNCB2IDAgNTY0OSBhIEZnKDMuMyk4MgorYiBGbShTU0wpMjYgYiBGZyhcMDI2KWkoQW4pZyhpbnRlcmZhY2UpZyh0bylmKHRoZSlnKFNTTC1zcClyKGVjaVwwMzRjKWgKKyhwYSluKHJ0cylmKG9mKWgoT3ApcihlblNTTCkxNjExIGIoMTEpcCBlb3AgZW5kCislJVBhZ2U6IDEyIDEyCitUZVhEaWN0IGJlZ2luIDEyIDExIGJvcCAwIDgzIGEgRm0oYmluZFwoKXAgRmQoYWRkcilsKGVzcyk3CitiIEZtKFwpKTIwOCAxODMgeSBGcihDYWxsKTI3IGIodGhlKWggRm0oYmluZCllIEZyKG1ldGhvKXIoZClpKG9mKWYodGhlKQoraCh1bmRlcmx5aW5nKWYoc28pcihjKW4oayluKGV0LikwIDMzMCB5IEZtKGNsb3NlXChcKSkyMDgKKzQyOSB5IEZyKENhbGwpaSh0aGUpaCBGbShjbG9zZSllIEZyKG1ldGhvKXIoZClpKG9mKWcodGhlKWcodW5kZXJseWluZylmCisoc28pcihjKW4oayluKGV0Lik0MyBiKE5vdGU6KWUoSWYpMzEgYih5KW4ob3UpZSh3KW4oYW4pbih0KWcoY29ycmVjdClmCisoU1NMKWkoY2xvc3VyZSwpZih5KW4ob3UpZyhuZWVkKWgodG8pMjA4IDUyOSB5KGNhbGwpZCh0aGUpaAorRm0oc2h1dGRvd24pYyBGcihtZXRobylyKGQpayhcMDM0cnN0LikwIDY3NiB5IEZtKGNvbm5lY3RcKClwCitGZChhZGRyKWwoZXNzKTcgYiBGbShcKSkyMDggNzc1IHkgRnIoQ2FsbCkzMSBiKHRoZSloCitGbShjb25uZWN0KWUgRnIobWV0aG8pcihkKWkob2YpZyh0aGUpZyh1bmRlcmx5aW5nKWcoc28pcihjKW4oayluKGV0KWUKKyhhbmQpaShzZXQpZyh1cClnKFNTTCloKG9uKWUodGhlKWkoc28pcihjKW4oayluKGV0LClmKHVzaW5nKWYodGhlKWgKKyhDb24pbih0ZXh0KTIwOCA4NzUgeShvYik1IGIoamVjdCkyNyBiKHN1cHBsaWVkKWgodG8pZih0aGlzKWgKKyhDb25uZWN0aW9uKWYob2IpNSBiKGplY3QpMjcgYihhdCloKGNyZWF0aW9uLikwIDEwMjIKK3kgRm0oY29ubmVjdF9leFwoKXAgRmQoYWRkcilsKGVzcyk3IGIgRm0oXCkpMjA4IDExMjEKK3kgRnIoQ2FsbCkyNCBiKHRoZSlnIEZtKGNvbm5lY3RfZXgpYyBGcihtZXRobylyKGQpMjUKK2Iob2YpZih0aGUpaCh1bmRlcmx5aW5nKWYoc28pcihjKW4oayluKGV0KWYoYW5kKWgoc2V0KWcodXApaChTU0wpZihvbilnCisodGhlKWgoc28pcihjKW4oayluKGV0LClmKHVzaW5nKWcodGhlKWcoQ29uKW4odGV4dCkyMDgKKzEyMjEgeShvYik1IGIoamVjdCkzNSBiKHN1cHBsaWVkKWcodG8paCh0aGlzKWYoQ29ubmVjdGlvbilnKG9iKTUKK2IoamVjdCkzNiBiKGF0KWYoY3JlYXRpb24uKTU5IGIoTm90ZSkzNiBiKHRoYXQpZihpZiloKHRoZSlnCitGbShjb25uZWN0X2V4KTMxIGIgRnIobWV0aG8pcihkKTM2IGIob2YpZyh0aGUpMjA4IDEzMjEKK3koc28pcihjKW4oayluKGV0KTI2IGIoZG8pcihlc24ndClpKHJldHVybilmKDAsKWcoU1NMKWgodyluKG9uJ3QpZihiKXIKKyhlKWgoaW5pdGlhbGl6ZWQuKTAgMTQ2OCB5IEZtKGRvX2hhbmRzaGFrZVwoXCkpMjA4IDE1NjcKK3kgRnIoUCluKGVyZm9ybSk0OSBiKGFuKWgoU1NMKWcoaGFuZHNoYWspbihlKWYoXCh1c3VhbGx5KWgoY2FsbGVkKWcKKyhhZnRlcilmIEZtKHJlbmVnb3RpYXRlKWQgRnIob3IpaihvbmUpaChvZik1NyBiIEZtKHNldF9hY2NlcHRfc3RhdClvKGUpCis0NCBiIEZyKG9yKTIwOCAxNjY3IHkgRm0oc2V0X2FjY2VwdF9zdGF0KW8oZSlwIEZyKFwpLikzMQorYihUaGlzKWQoY2FuKWYocmFpc2UpZih0aGUpaShzYW1lKWYoZXhjZXB0aW9ucylnKGFzKWcKK0ZtKHNlbmQpZiBGcihhbmQpaCBGbShyZWN2KXAgRnIoLikwIDE4MTQgeSBGbShmaWxlbm9cKFwpKTIwOAorMTkxMyB5IEZyKFJldHJpZXYpbihlKWYodGhlKWkoXDAzNGxlKWcoZGVzY3JpcHRvcillKG4pbih1bSluKGIpcihlcilpCisoZm9yKWYodGhlKWgodW5kZXJseWluZyllKHNvKXIoYyluKGspbihldC4pMCAyMDYwIHkgRm0obGlzdGVuXCgpcAorRmQoYilsKGFja2xvKWwoZyk3IGIgRm0oXCkpMjA4IDIxNjAgeSBGcihDYWxsKTI3IGIodGhlKWgKK0ZtKGxpc3RlbilkIEZyKG1ldGhvKXIoZClqKG9mKWYodGhlKWgodW5kZXJseWluZylmKHNvKXIoYyluKGspbihldC4pMAorMjMwNyB5IEZtKGdldF9hcHBfZGF0YVwoXCkpMjA4IDI0MDYgeSBGcihSZXRyaWV2KW4oZSlmKGFwcGxpY2F0aW9uKWgKKyhkYXRhKWcoYXMpZyhzZXQpaChiKW4oeSlnIEZtKHNldF9hcHBfZGF0YSlwIEZyKC4pMCAyNTUzCit5IEZtKGdldF9jaXBoZXJfbGlzdFwoKW8oXCkpMjA4IDI2NTMgeSBGcihSZXRyaWV2KW4oZSkyMworYih0aGUpaChsaXN0KWcob2YpZyhjaXBoZXJzKWcodXNlZClnKGIpbih5KWYodGhlKWkoQ29ubmVjdGlvbillKG9iKTUKK2IoamVjdC4pMzYgYihXKS05IGIoQVJOSU5HOikyNSBiKFRoaXMpZihBUEkpaChoYXMpZShjKW4oaGFuZ2VkLikzNQorYihJdCkyNCBiKHVzZWQpMjA4IDI3NTIgeSh0bylqKHRhayluKGUpZyhhbilnKG9wdGlvbmFsKWcocGFyYW1ldGVyKWYKKyhhbmQpaChqdXN0KWgocmV0dXJuKWcoYSlmKHN0cmluZywpZyhidXQpaChub3QpZihpdCloKHJldHVybnMpZih0aGUpaAorKGVuKW4odGlyZSlmKGxpc3QpaChpbilnKG9uZSlmKGdvLikwIDI4OTkgeSBGbShnZXRfY29udGV4dFwoXCkpMjA4CisyOTk5IHkgRnIoUmV0cmlldiluKGUpZih0aGUpaShDb24pbih0ZXh0KWYob2IpNSBiKGplY3QpMjgKK2IoYXNzbylyKGNpYXRlZCllKHdpdGgpaSh0aGlzKWcoQ29ubmVjdGlvbi4pMCAzMTQ2IHkKK0ZtKGdldF9wZWVyX2NlcnRpZmkpbyhjYSlvKHRlXCgpbyhcKSkyMDggMzI0NSB5IEZyKFJldHJpZXYpbihlKWUodGhlKWkKKyhvdGhlcilmKHNpZGUncylnKGNlcnRpXDAzNGNhdGUpZyhcKGlmKWkoYW4pbih5XCkpMCAzMzkyCit5IEZtKGdldHBlZXJuYW1lXChcKSkyMDggMzQ5MiB5IEZyKENhbGwpZSh0aGUpaCBGbShnZXRwZWVybmFtZSkyMworYiBGcihtZXRobylyKGQpMjggYihvZilmKHRoZSloKHVuZGVybHlpbmcpZihzbylyKGMpbihrKW4oZXQuKTAKKzM2MzkgeSBGbShnZXRzb2NrbmFtZVwoXCkpMjA4IDM3MzggeSBGcihDYWxsKWcodGhlKWgKK0ZtKGdldHNvY2tuYW1lKTIzIGIgRnIobWV0aG8pcihkKTI4IGIob2YpZih0aGUpaCh1bmRlcmx5aW5nKWYoc28pcihjKW4KKyhrKW4oZXQuKTAgMzkwMiB5IEZtKGdldHNvY2tvcHRcKClwIEZkKGxldmVsLClmKG9wdG5hbWUpNgorYiBGYyhbKXAgRmQoLCkzMSBiKGJ1XDAzNWVuKTE4IGIgRmMoXSlwIEZtKFwpKTIwOCA0MDAyCit5IEZyKENhbGwpMjcgYih0aGUpaCBGbShnZXRzb2Nrb3B0KTIzIGIgRnIobWV0aG8pcihkKTI4CitiKG9mKWcodGhlKWcodW5kZXJseWluZylmKHNvKXIoYyluKGspbihldC4pMCA0MTQ4IHkgRm0ocGVuZGluZ1woXCkpMjA4Cis0MjQ4IHkgRnIoUmV0cmlldiluKGUpZih0aGUpaShuKW4odW0pbihiKXIoZXIpZyhvZilmKGIpbih5dGVzKWcodGhhdCloCisoY2FuKWYoYilyKGUpaChzYWZlbHkpZihyZWFkKWcoZnJvbSlnKHRoZSloKFNTTClnKGJ1XDAzM2VyLikwCis0Mzk1IHkgRm0ocmVjdlwoKXAgRmQoYnVmc2l6ZSk2IGIgRm0oXCkpMjA4IDQ0OTUgeSBGcihSZWNlaXYpbihlKTMwCitiKGRhdGEpaChmcm9tKWcodGhlKWgoQ29ubmVjdGlvbi4pNDcgYihUaGUpMzEgYihyZXR1cm4pZyh2KS01CitiKGFsdWUpMzEgYihpcyloKGEpZShzdHJpbmcpaChyZXByZXNlbiluKHRpbmcpZih0aGUpaChkYXRhKWcocmVjZWl2KW4KKyhlZC4pNDcgYihUaGUpMjA4IDQ1OTQgeShtYXhpbSluKHVtKTI3IGIoYW1vdW4pbih0KWcob2YpZyhkYXRhKWgodG8pZgorKGIpcihlKWgocmVjZWl2KW4oZWQpZShhdClpKG9uY2UsKWYoaXMpZyhzcClyKGVjaVwwMzRlZCloKGIpbih5KWgKK0ZkKGJ1ZnNpemUpNiBiIEZyKC4pMCA0NzQxIHkgRm0ocmVuZWdvdGlhdGVcKFwpKTIwOCA0ODQxCit5IEZyKFJlbmVnb3RpYXRlKTI2IGIodGhlKWkoU1NMKWcoc2Vzc2lvbi4pMzYgYihDYWxsKTI3CitiKHRoaXMpaChpZilnKHkpbihvdSlmKHdpc2gpZyh0byloKGMpbihoYW5nZSllKGNpcGhlciloKHN1aXRlcyloKG9yKWUKKyhhbiluKHl0aGluZyloKGxpayluKGUpZyh0aGF0LikwIDQ5ODggeSBGbShzZW5kXCgpcCBGZChzdHJpbmcpNworYiBGbShcKSkyMDggNTA4NyB5IEZyKFNlbmQpMjcgYih0aGUpaCBGZChzdHJpbmcpMzUgYgorRnIoZGF0YSkyNyBiKHRvKWgodGhlKWcoQ29ubmVjdGlvbi4pMCA1MjM0IHkgRm0oc2VuZGFsbFwoKXAKK0ZkKHN0cmluZyk3IGIgRm0oXCkpMjA4IDUzMzQgeSBGcihTZW5kKTMwIGIoYWxsKWYob2YpaCh0aGUpZworRmQoc3RyaW5nKTM3IGIgRnIoZGF0YSkyOSBiKHRvKWcodGhlKWgoQ29ubmVjdGlvbi4pNDMKK2IoVGhpcykzMCBiKGNhbGxzKWYgRm0oc2VuZClmIEZyKHJlcClyKGVhdGVkbHkpaCh1biluKHRpbCloKGFsbClmKGRhdGEpCitoKGlzKWYoc2VuKW4odC4pNDMgYihJZikzMCBiKGFuKXAgMCA1NTQ5IDM5MDEgNCB2IDAgNTY0OQorYSBGZygxMikyMTk3IGIoMyk4MyBiIEZtKE9wZW5TU0wpMjQgYiBGZyhcMDI2KWsoUHl0aG9uKWYoaW50ZXJmYWNlKWgKKyh0bylmKE9wKXIoZW5TU0wpcCBlb3AgZW5kCislJVBhZ2U6IDEzIDEzCitUZVhEaWN0IGJlZ2luIDEzIDEyIGJvcCAyMDggODMgYSBGcihlcnJvcikyNSBiKG8pcihjY3VycywpaShpdCdzKWgoaW1wKQorcihvc3NpYmxlKWYodG8pZyh0ZWxsKWgoaG8pbih3KWYobSluKHVjKW4oaCloKGRhdGEpZihoYXMpZyhiKXIoZWVuKWgKKyhzZW4pbih0LikwIDIzMCB5IEZtKHNldF9hY2NlcHRfc3RhdGUpbyhcKFwpKTIwOCAzMzAKK3kgRnIoU2V0KTIwIGIodGhlKWcoY29ubmVjdGlvbilmKHRvKWgodyluKG9yayllKGluKWkoc2VydiluKGVyKWUobW8pcgorKGRlLikzNCBiKFRoZSkyMCBiKGhhbmRzaGFrKW4oZSlmKHdpbGwpaChiKXIoZSlnKGhhbmRsZWQpZworKGF1dG9tYXRpY2FsbHkpZShiKW4oeSlpKHJlYWQvd3JpdGUuKTAgNDc2IHkgRm0oc2V0X2FwcF9kYXRhXCgpcAorRmQoZGF0YSk2IGIgRm0oXCkpMjA4IDU3NiB5IEZyKEFzc28pcihjaWF0ZSkzOSBiIEZkKGRhdGEpNDcKK2IgRnIod2l0aCk0MCBiKHRoaXMpZyhDb25uZWN0aW9uKWcob2IpNSBiKGplY3QuKTczIGIKK0ZkKGRhdGEpNDcgYiBGcihjYW4pMzkgYihiKXIoZSlpKHJldHJpZXYpbihlZClkKGxhdGVyKWgodXNpbmcpaCh0aGUpZworRm0oZ2V0X2FwcF9kYXRhKTIwOCA2NzYgeSBGcihtZXRobylyKGQuKTAgODIzIHkgRm0oc2V0X2Nvbm5lY3Rfc3RhdClvCisoZVwoKW8oXCkpMjA4IDkyMiB5IEZyKFNldCkyMSBiKHRoZSlnKGNvbm5lY3Rpb24pZyh0bylnKHcpbihvcmspZShpbilpCisoY2xpZW4pbih0KWcobW8pcihkZS4pMzUgYihUaGUpMjEgYihoYW5kc2hhayluKGUpZih3aWxsKWgoYilyKGUpZworKGhhbmRsZWQpZyhhdXRvbWF0aWNhbGx5KWYoYiluKHkpaChyZWFkL3dyaXRlLikwIDEwNjkKK3kgRm0oc2V0YmxvY2tpbmdcKClwIEZkKFwwMzVhZyk3IGIgRm0oXCkpMjA4IDExNjkgeSBGcihDYWxsKTI3CitiKHRoZSloIEZtKHNldGJsb2NraW5nKTIzIGIgRnIobWV0aG8pcihkKTI4IGIob2YpZih0aGUpaCh1bmRlcmx5aW5nKWYKKyhzbylyKGMpbihrKW4oZXQuKTAgMTMxNiB5IEZtKHNldHNvY2tvcHRcKClwIEZkKGxldmVsLClmKG9wdG5hbWUsKTMxCitiKHZhbHVlKTYgYiBGbShcKSkyMDggMTQxNSB5IEZyKENhbGwpMjcgYih0aGUpaCBGbShzZXRzb2Nrb3B0KTIzCitiIEZyKG1ldGhvKXIoZCkyOCBiKG9mKWcodGhlKWcodW5kZXJseWluZylmKHNvKXIoYyluKGspbihldC4pMAorMTU2MiB5IEZtKHNodXRkb3duXChcKSkyMDggMTY2MiB5IEZyKFNlbmQpMzUgYih0aGUpaChzaCluKHV0ZG8pbih3bilmCisobWVzc2FnZSlmKHRvKWgodGhlKWgoQ29ubmVjdGlvbi4pNjAgYihSZXR1cm5zKTM1IGIodHJ1ZSlnKGlmKWgodGhlKWcKKyhzaCluKHV0ZG8pbih3billKG1lc3NhZ2UpZyhleGMpbihoYW5nZSlnKGlzKTIwOCAxNzYxCit5KGNvbXBsZXRlZCkyNSBiKGFuZClnKGZhbHNlKWgob3RoZXJ3aXNlKWUoXChpbilpKHdoaWMpbihoKWcoY2FzZSllKHkpbgorKG91KWgoY2FsbClnIEZtKHJlY3ZcKFwpKWUgRnIob3IpaSBGbShzZW5kXChcKSllIEZyKHdoZW4paih0aGUpZworKGNvbm5lY3Rpb24pZihiKXIoZWNvbWVzKTIwOCAxODYxIHkocmVhZGFibGUvd3JpdGVhYmxlLikwCisyMDA4IHkgRm0oc29ja19zaHV0ZG93blwoKXAgRmQoaG93KTkgYiBGbShcKSkyMDggMjEwNworeSBGcihDYWxsKTI3IGIodGhlKWggRm0oc2h1dGRvd24pYyBGcihtZXRobylyKGQpayhvZilnKHRoZSlnCisodW5kZXJseWluZyllKHNvKXIoYyluKGspbihldC4pMCAyMjU0IHkgRm0oc3RhdGVfc3RyaW5nXChcKSkyMDgKKzIzNTQgeSBGcihSZXRyaWV2KW4oZSlnKGEpaSh2KW4oZXJiKXIob3NlKWUoc3RyaW5nKWcoZGV0YWlsaW5nKWkodGhlKWcKKyhzdGF0ZSlmKG9mKWgodGhlKWYoQ29ubmVjdGlvbi4pMCAyNTAxIHkgRm0od2FudF9yZWFkXChcKSkyMDgKKzI2MDAgeSBGcihDaGVjKW4oa3MpZihpZilpKG1vcmUpZihkYXRhKWcoaGFzKWcodG8paChiKXIoZSlnKHJlYWQpZQorKGZyb20paSh0aGUpZih0cmFuc3ApcihvcnQpZyhsYSluKHkpbihlcilmKHRvKWgoY29tcGxldGUpaChhbilmKG9wKXIKKyhlcmF0aW9uLikwIDI3NDcgeSBGbSh3YW50X3dyaXRlXChcKSkyMDggMjg0NyB5IEZyKENoZWMpbihrcylmKGlmKWkKKyh0aGVyZSlnKGlzKWYoZGF0YSlnKHRvKWgod3JpdGUpZih0bylnKHRoZSloKHRyYW5zcClyKG9ydClmKGxhKW4oeSluCisoZXIpZih0byloKGNvbXBsZXRlKWgoYW4pZihvcClyKGVyYXRpb24uKTAgMzE2OSB5IEZzKDQpMTE0CitiKEludGVybmFscykwIDMzOTggeSBGcihXKS03IGIoZSkyNSBiKHJhbilnKGluKW4odG8pZih0aHJlZSloKG1haW4pZworKHByb2JsZW1zKWYoZGV2KW4oZWxvcGluZylnKHRoaXM6KTM2IGIoRXhjZXB0aW9ucywpMjUKK2IoY2FsbGJhYyluKGtzKWYoYW5kKWgoYWNjZXNzaW5nKWUoc28pcihjKW4oayluKGV0KWgobWV0aG8pcihkcy4pMzYKK2IoVGhpcykwIDM0OTcgeShpcykyNyBiKHdoYXQpaCh0aGlzKWcoYyluKGhhcHRlcillKGlzKWkoYWIpcihvdXQuKTAKKzM3NzcgeSBGayg0LjEpOTcgYihFeGNlcHRpb25zKTAgMzk3NyB5IEZyKFcpLTcgYihlKTUyCitiKHJlYWxpemVkKWYoZWFybHkpZyh0aGF0KWgobW9zdClnKG9mKWcodGhlKWcoZXhjZXB0aW9ucylmKHcpbihvdWxkKWgKKyhiKXIoZSlnKHJhaXNlZClmKGIpbih5KWgodGhlKWcoSS9PKWYoZnVuY3Rpb25zKWgob2YpZyhPcClyKGVuU1NMLCkwCis0MDc3IHkoc28pZChpdClpKGZlbHQpZihuYXR1cmFsKWYodG8paChtaW1pYylnKE9wKXIoZW5TU0wncylnKGVycm9yKWUKKyhjbylyKGRlKWkoc3lzdGVtLCk1NSBiKHRyYW5zbGF0aW5nKTQ4IGIodGhlbSlqKGluKW4odG8pZShQeXRob24paQorKGV4Y2VwdGlvbnMuKTAgNDE3NyB5KFRoaXMpMzAgYihuYXR1cmFsbHkpZShnaXYpbihlcyloKHVzKWgodGhlKWcKKyhleGNlcHRpb25zKWYgRm0oU1NMLlplcm9SZXR1cm5FcilvKHJvKW8ocilwIEZyKCwpMjQKK2IgRm0oU1NMLldhbnRSZWFkRXJyb3IpbyBGcigsKWggRm0oU1NMLldhbnRXcml0ZUVyKW8ocm8pbyhyKXAKK0ZyKCwpMCA0Mjc2IHkgRm0oU1NMLldhbnRYNTA5TG9vaylvKHVwKW8oRXJyKW8ob3IpYyBGcihhbmQpMjcKK2IgRm0oU1NMLlN5c0NhbGxFcnJvcilwIEZyKC4pMCA0NDIzIHkoRiktNyBiKG9yKTI3IGIobW9yZSlnCisoaW5mb3JtYXRpb24pZyhhYilyKG91dClnKHRoaXMsKWgoc2VlKWYoc2VjdGlvbilnKDMuMy4pMAorNDcwMyB5IEZrKDQuMik5NyBiKENhbGxiYWNrcykwIDQ5MDMgeSBGcihUaGVyZSkzNCBiKGFyZSlmKGEpaChuKW4odW0pbgorKGIpcihlcilnKG9mKWgocHJvYmxlbXMpZSh3aXRoKWkoY2FsbGJhYyluKGtzLik1NiBiKEZpcnN0KTM0CitiKG9mKWcoYWxsLClpKE9wKXIoZW5TU0wpZihpcylmKHdyaXR0ZW4paChhcyllKGEpaChDKWgobGlicmFyeSktNworYigsKTM0IGIoaXQncyloKG5vdCkwIDUwMDMgeShtZWFuKW4odCkyNiBiKHRvKWcoaGEpbih2KW4oZSllKFB5dGhvbilqCisoY2FsbGJhYyluKGtzLClkKHNvKWkoYSlmKHcpbihhKW4oeSlnKGFyb3VuZClnKHRoYXQpaChpcylnKG5lZWRlZC4pMzYKK2IoQW5vdGhlcikyNiBiKHByb2JsZW0pZihpcyloKHRocmVhZClnKHN1cHApcihvcnQuKTM2CitiKEEpMjYgYihsb3QpMCA1MTAzIHkob2YpaCh0aGUpZyhPcClyKGVuU1NMKWcoSS9PKWUoZnVuY3Rpb25zKWkoY2FuKWcKKyhibG8pcihjKW4oaylmKGlmKWgodGhlKWcoc28pcihjKW4oayluKGV0KWYoaXMpZyhpbiloKGJsbylyKGMpbihraW5nKWYKKyhtbylyKGRlLCloKGFuZClnKHRoZW4pZyh5KW4ob3UpZih3KW4oYW4pbih0KWcob3RoZXIpZyhQeXRob24pMAorNTIwMiB5KHRocmVhZHMpYyh0bylnKGIpcihlKWgoYWJsZSlmKHRvKWcoZG8pZyhvdGhlcilnKHRoaW5ncy4pMzUKK2IoVGhlKTIyIGIocmVhbClnKHRyb3VibGUpZyhpcylnKGlmKWgoeSluKG91J3YpbihlKWUocmVsZWFzZWQpZyh0aGUpaAorKHRocmVhZClnKGxvKXIoYyluKGspZyh0bylnKGRvKWcoYSlnKHApcihvdGVuKW4odGlhbGx5KXAKKzAgNTU0OSAzOTAxIDQgdiAzODE3IDU2NDkgYSBGZygxMylwIGVvcCBlbmQKKyUlUGFnZTogMTQgMTQKK1RlWERpY3QgYmVnaW4gMTQgMTMgYm9wIDAgODMgYSBGcihibG8pcihjKW4oa2luZykyNyBiKG9wKXIoZXJhdGlvbiwpZgorKGFuZClpKHRoZSlnKG9wKXIoZXJhdGlvbillKGNhbGxzKWgoYSlnKGNhbGxiYWMpbihrLikzNQorYihUaGVuKTI4IGIodyluKGUpZihtKW4odXN0KWgodGFrKW4oZSlmKHRoZSloKHRocmVhZClmKGxvKXIoYyluKGspZworKGJhYyluKGspMzQ3NSA1MyB5IEZsKDUpMzUxMSA4MyB5IEZyKC4pMCAyMzAgeShUaGVyZSlkKGFyZSlmKHQpbih3KW4obykKK2coc29sdXRpb25zKWgodG8pZyh0aGUpaChcMDM0cnN0KWYocHJvYmxlbSwpZyhiKXIob3RoKWgob2YpZih3aGljKW4oaClnCisoYXJlKWYobmVjZXNzYXJ5KS03IGIoLikzNCBiKFRoZSkyNSBiKFwwMzRyc3QpZihzb2x1dGlvbilmKHRvKWgodXNlKWgKKyhpcylmKGlmKWcodGhlKWgoQykwIDMzMCB5KGNhbGxiYWMpbihrKWkoYWxsbyluKHdzKWYoXDAyMXVzZXJkYXRhXDAyMSkKKzMzIGIodG8pMjggYihiKXIoZSloKHBhc3NlZCllKHRvKWgoaXQpZyhcKGFuKWcoYXJiaXRyYXJ5KWUocClyKG9pbiluCisodGVyKWkobm9ybWFsbHlcKS4pMzcgYihUaGlzKTI4IGIoaXMpZyhncmVhdCEpMzcgYihXKS03CitiKGUpMjggYihjYW4pZyhzZXQpZyhvdXIpMCA0MjkgeShQeXRob24paShmdW5jdGlvbilnKG9iKTUKK2IoamVjdCkyOSBiKGFzKWYodGhlKWkocmVhbClmKHVzZXJkYXRhKWYoYW5kKWgoZW0pbih1bGF0ZSlnKHVzZXJkYXRhKWYKKyhmb3IpaCh0aGUpaChQeXRob24pZihmdW5jdGlvbiloKGluKWcoYW5vdGhlcillKHcpbihhKW4oeSktNworYiguKTAgNTI5IHkoVGhlKTI0IGIob3RoZXIpZyhzb2x1dGlvbilnKGNhbilnKGIpcihlKWgodXNlZClnKGlmKWcoYW4pZgorKG9iKTUgYihqZWN0KTI0IGIod2l0aCloKGFuKWYoXDAyMWFwcF9kYXRhXDAyMSkyOSBiKHN5c3RlbSljKGFsdyluKGEpbgorKHlzKWQoaXMpaihwYXNzZWQpZSh0byloKHRoZSloKGNhbGxiYWMpbihrLikzNSBiKEYpLTcKK2Iob3IpMCA2MjggeShleGFtcGxlLCkyNiBiKHRoZSloKFNTTClmKG9iKTUgYihqZWN0KTI2CitiKGluKWgoT3ApcihlblNTTClmKGhhcylnKGFwcF9kYXRhKWYoZnVuY3Rpb25zKWkoYW5kKWYoaW4paChlLmcuKTM2CitiKHRoZSkyNiBiKHYpbihlcmlcMDM0Y2F0aW9uKWYoY2FsbGJhYyluKGtzLClnKHkpbihvdSlnKGNhbikwCis3MjggeShyZXRyaWV2KW4oZSlpKHRoZSlpKHJlbGF0ZWQpZihTU0wpaChvYik1IGIoamVjdC4pMzkKK2IoV2hhdCkyOSBiKHcpbihlKWcoZG8pZihpcylnKHRvKWgoc2V0KWYob3VyKWcod3JhcHApcihlcilnCitGbShDb25uZWN0aW9uKWMgRnIob2IpNSBiKGplY3QpMjggYihhcylnKGFwcF9kYXRhKWcoZm9yKWcodGhlKTAKKzgyOCB5KFNTTClnKG9iKTUgYihqZWN0LCkyNyBiKGFuZCloKHcpbihlKWYoY2FuKWcoZWFzaWx5KWcoXDAzNG5kKWgKKyh0aGUpZyhQeXRob24pZyhjYWxsYmFjKW4oay4pMCA5NzUgeShUaGUpNDIgYihvdGhlcilnKHByb2JsZW0pZyhpcylnCisoYWxzbylmKHBhcnRpYWxseSloKHNvbHYpbihlZClmKGIpbih5KWgoYXBwX2RhdGEuKTgwCitiKFNpbmNlKTQzIGIodyluKGUncmUpZShhc3NvKXIoY2lhdGluZylnKG91cilnKHdyYXBwKXIoZXIpaChvYik1CitiKGplY3RzKTAgMTA3NCB5KHdpdGgpNDQgYih0aGUpZihcMDIxcmVhbFwwMjEpNDkgYihvYik1CitiKGplY3RzLCk0NiBiKHcpbihlKWQoY2FuKWcoZWFzaWx5KWYoYWNjZXNzKWcoZGF0YSlnKGZyb20paCh0aGUpaAorRm0oQ29ubmVjdGlvbikzOSBiIEZyKG9iKTUgYihqZWN0Lik4MyBiKFRoZSk0MyBiKHNvbHV0aW9uKWcodGhlbilnKGlzKTAKKzExNzQgeSh0bykzNSBiKHNpbXBseSloKGluY2x1ZGUpZyhhKWYgRm0oUHlUaHJlYWRTdGF0ZSljCitGcih2KS01IGIoYXJpYWJsZSkzNCBiKGluKWkodGhlKWcgRm0oQ29ubmVjdGlvbikzMSBiCitGcihkZWNsYXJhdGlvbiwpMzcgYihhbmQpZSh3cml0ZSlnKG1hY3JvcylmKHNpbWlsYXIpaCh0bykwCisxMjczIHkgRm0oUHlfQkVHSU5fQUxMT1dfVClvKEhSKW8oRUFEKW8oUykyNiBiIEZyKGFuZCkzMworYiBGbShQeV9FTkRfQUxMT1dfVEgpbyhSRUEpbyhEUykyNiBiIEZyKHRoYXQpMzMgYihhbGxvKW4od3MpZShzcClyCisoZWNpZnlpbmcpaChvZiloKHRoZSlnIEZtKFB5VGhyZWFkU3RhdGUpMjcgYiBGcih2KS01CitiKGFyaS0pMCAxMzczIHkoYWJsZSkyMyBiKHRvKWcodXNlLikzNSBiKE5vKW4odykyMyBiKHcpbihlKWcoY2FuKWcKKyhzaW1wbHkpZyhcMDIxYilyKGVnaW4pZyhhbGxvKW4odylmKHRocmVhZHNcMDIxKTI5IGIoYilyKGVmb3JlKTIzCitiKGEpZyhwKXIob3RlbiluKHRpYWxseSlnKGJsbylyKGMpbihraW5nKWYob3ApcihlcmF0aW9uLCloKGFuZClnCisoXDAyMWVuZClnKGFsbG8pbih3KTAgMTQ3MyB5KHRocmVhZHNcMDIxKTMzIGIoYilyKGVmb3JlKTI4CitiKGNhbGxpbmcpZShhKWkoY2FsbGJhYyluKGsuKTAgMTc1MiB5IEZrKDQuMyk5NyBiKEEpbShjZXNzaW5nKTM1CitiKFNvKXMoY2spbShldCllKE1ldGhvKXMoZHMpMCAxOTUzIHkgRnIoVyktNyBiKGUpMjcgYihxdWljKW4oa2x5KWUoc2EpbgorKHcpaCh0aGUpZyhiKXIoZW5lXDAzNHQpaChvZilnKHdyYXBwaW5nKWUoc28pcihjKW4oayluKGV0KWcobWV0aG8pcihkcykKK2goaW4paCh0aGUpZyBGbShTU0wuQ29ubmVjdGlvbikyMCBiIEZyKGNsYXNzLCkyNiBiKGZvcilnKGFuKWcoZWFzeSlmCisodHJhbnNpdGlvbikwIDIwNTIgeShpbiluKHRvKWUodXNpbmcpZihTU0wuKWgoVGhlKWcocHJvYmxlbSlmKGhlcmUpaAorKGlzKWYodGhhdCloKHRoZSloIEZtKHNvY2tldCljIEZyKG1vKXIoZHVsZSlqKGxhYyluKGtzKWYoYSlnKEMpaChBUEksKWgKKyhhbmQpZShhbGwpaCh0aGUpZyhtZXRobylyKGRzKWcoYXJlKWYoZGVjbGFyZWQpMCAyMTUyCit5KHN0YXRpYy4pMzYgYihPbmUpMjcgYihhcHByb2FjKW4oaClkKHcpbihvdWxkKWkoYilyKGUpaCh0bylmKGhhKW4odiluCisoZSlnIEZtKE9wZW5TU0wpZCBGcihhcylqKGEpZyhzdWJtbylyKGR1bGUpaCh0bylmKHRoZSloCitGbShzb2NrZXQpZCBGcihtbylyKGR1bGUsKWoocGxhY2luZylmKGFsbClnKHRoZSloKGNvKXIoZGUpMAorMjI1MiB5KGluKWooYClwIEZxKHNvKXIoY2spbihldG1vKXIoZHVsZS5jKXAgRnIoJywpaChidXQpZih0aGlzKWcoaXMpZworKG9iKW4odmlvdXNseSllKG5vdClpKGEpZihnbylyKG8pcihkKWcoc29sdXRpb24sKWgoc2luY2UpZyh5KW4ob3UpZgorKG1pZ2gpbih0KWcobm90KWgodyluKGFuKW4odClmKHRvKWgoaW1wKXIob3J0KWcodG9ubmVzKWYob2YpMAorMjM1MSB5KGV4dHJhKWYoc3R1XDAzMyloKHkpbihvdSdyZSllKG5vdClpKGdvaW5nKWUodG8paSh1c2UpZih3aGVuKWgKKyhpbXApcihvcnRpbmcpZih0aGUpaSBGbShzb2NrZXQpYyBGcihtbylyKGR1bGUuKTQwIGIoVGhlKTI5CitiKG90aGVyKWYoYXBwcm9hYyluKGgpZShpcylqKHRvKWYoc29tZWhvKW4odykwIDI0NTEgeShnZXQpMzMKK2IoYSlnKHApcihvaW4pbih0ZXIpZyh0byloKHRoZSlmKG1ldGhvKXIoZCloKHRvKWcoYilyKGUpZihjYWxsZWQsKWkKKyhlaXRoZXIpZSh0aGUpaChDKWcoZnVuY3Rpb24sKWgob3IpZShhKWcoY2FsbGFibGUpZihQeXRob24paShvYik1CitiKGplY3QuKTU0IGIoVGhpcykzNCBiKGlzKWYobm90KTAgMjU1MSB5KHJlYWxseSkyNiBiKGEpaShnbylyKG8pcihkKWYKKyhzb2x1dGlvbilnKGVpdGhlciwpZyhzaW5jZSlnKHRoZXJlJ3MpaChhKWYobG90KWcob2YpaChsbylyKG9rdXBzKWYoaW4pCituKHYpbihvbHYpbihlZC4pMCAyNjk3IHkoVGhlKWgodyluKGEpbih5KWYoaXQpaCh3KW4ob3JrcyllKGlzKWkodGhhdCloCisoeSluKG91KWUoaGEpbih2KW4oZSlnKHRvKWcoc3VwcGx5KWgoYSlnKFwwMjApNyBiIEZtKHNvY2tldClwCitGcigtbGlrKW4oZVwwMjEpMzEgYih0cmFuc3ApcihvcnQpYyhvYik1IGIoamVjdCkyOCBiKHRvKWYodGhlKWkKK0ZtKFNTTC5Db25uZWN0aW9uKXAgRnIoLilqKFRoZSkwIDI3OTcgeShvbmx5KTI0IGIocmVxdWlyZW1lbiluKHQpZihvZilpCisodGhpcylmKG9iKTUgYihqZWN0KTI0IGIoaXMpaCh0aGF0KWYoaXQpaChoYXMpZihhKWcgRm0oZmlsZW5vXChcKSlkCitGcihtZXRobylyKGQpayh0aGF0KWYocmV0dXJucylnKGEpZyhcMDM0bGUpZyhkZXNjcmlwdG9yKWYodGhhdCdzKWkodiktNQorYihhbGlkKTI0IGIoYXQpMCAyODk3IHkodGhlKWcoQylnKGxldiluKGVsKWYoXChpLmUuKTM2CitiKHkpbihvdSkyMyBiKGNhbiloKHVzZSlmKHRoZSlpKHN5c3RlbSllKGNhbGxzKWcocmVhZClnKGFuZCloKHdyaXRlXCkuKQorMzUgYihJZikyNSBiKHkpbihvdSllKHcpbihhbiluKHQpZyh0byloKHVzZSlmKHRoZSloIEZtKGNvbm5lY3RcKFwpKWMKK0ZyKG9yKWogRm0oYWNjZXB0XChcKSkwIDI5OTYgeSBGcihtZXRobylyKGRzKTI5IGIob2YpaCh0aGUpZgorRm0oU1NMLkNvbm5lY3Rpb24pMjQgYiBGcihvYik1IGIoamVjdCwpMjkgYih0aGUpaCh0cmFuc3ApcihvcnQpZShvYik1CitiKGplY3QpMjkgYihoYXMpZih0byloKHN1cHBseSloKHN1YyluKGgpZihtZXRobylyKGRzKWcodG8pcihvLik0MQorYihBcGFydCkyOSBiKGZyb20pMCAzMDk2IHkodGhlbSwpYyhhbiluKHkpZShtZXRobylyKGQpaChsbylyKG9rdXBzKWYKKyhpbiloKHRoZSlmIEZtKFNTTC5Db25uZWN0aW9uKTE4IGIgRnIob2IpNSBiKGplY3QpMjQKK2IodGhhdClmKGZhaWwpaChhcmUpZihwYXNzZWQpZihvbilpKHRvKWYodGhlKWgodW5kZXJseWluZylmKHRyYW5zcClyCisob3J0KTAgMzE5NiB5KG9iKTUgYihqZWN0LikwIDMzNDIgeShGKS03IGIodXR1cmUpMjUgYihjKW4oaGFuZ2VzKWYKKyhtaWdoKW4odCloKGIpcihlKWcodG8pZyhhbGxvKW4odylmKFB5dGhvbi1sZXYpbihlbClnKHRyYW5zcClyKG9ydClnCisob2IpNSBiKGplY3RzLCkyNSBiKHRoYXQpZyhpbnN0ZWFkKWcob2YpZyhoYSluKHZpbmcpZworRm0oZmlsZW5vXChcKSlkIEZyKG1ldGhvKXIoZHMsKTAgMzQ0MiB5KGhhKW4odiluKGUpaAorRm0ocmVhZFwoXCkpZyBGcihhbmQpaCBGbSh3cml0ZVwoXCkpZSBGcihtZXRobylyKGRzLClrKHNvKWUobW9yZSlmKGFkdikKKy01IGIoYW5jZWQpMjQgYihmZWF0dXJlcyloKG9mKWYoUHl0aG9uKWgoY2FuKWcoYilyKGUpZyh1c2VkLikzNQorYihUaGlzKTI1IGIodyluKG91bGQpZihwcm9iYWJseSkwIDM1NDIgeShlbiluKHRhaWwpMzYKK2Ioc29tZSlnKHNvcnQpZyhvZilnKE9wKXIoZW5TU0wpaChcMDIwQklPc1wwMjEsKWcoYnV0KWcoY29uKW4odiluCisoZXJ0aW5nKWUoUHl0aG9uKWkoc3RyaW5ncyllKGJhYyluKGspaChhbmQpZyhmb3J0aClnKGlzKWgoZXhwKXIoZW5zaXYpbgorKGUsKWgoc28pZSh0aGlzKTAgMzY0MSB5KHNob3VsZG4ndClmKGIpcihlKWgodXNlZClmKHVubGVzcylnKG5lY2Vzc2FyeSkKKy03IGIoLik1NyBiKE90aGVyKTM1IGIobmljZSlnKHRoaW5ncylnKHcpbihvdWxkKWcoYilyKGUpZyh0bylnKGIpcihlKWgKKyhhYmxlKWUodG8paChwYXNzKWcoaW4pZyhkaVwwMzNlcmVuKW4odClnKHRyYW5zcClyKG9ydCkwCiszNzQxIHkob2IpNSBiKGplY3RzKTQxIGIoZm9yKWcocmVhZGluZylmKGFuZCloKHdyaXRpbmcsKWooYnV0KWUodGhlbilnCisodGhlKWcgRm0oZmlsZW5vXChcKSljIEZyKG1ldGhvKXIoZClrKG9mKTQ3IGIgRm0oU1NMLkNvbm5lY3Rpb24pMzYKK2IgRnIoYilyKGVjb21lcyk0MSBiKHZpcnR1YWxseSkwIDM4NDEgeSh1c2VsZXNzLikzNiBiKEFsc28sKTI3CitiKHNob3VsZCloKHRoZSlnKG1ldGhvKXIoZClnKHJlc29sdXRpb24pZShiKXIoZSlpKHVzZWQpZyhvbilmKHRoZSloCisocmVhZC10cmFuc3ApcihvcnQpZChvcilpKHRoZSloKHdyaXRlLXRyYW5zcClyKG9ydD8pcAorMCA1MzIzIDE1NjAgNCB2IDkyIDUzNzYgYSBGaSg1KTEyNyA1NDAwIHkgRmgoSSdtKTIyIGIobm90KWooc3VyZSlmKHdoKW4KKyh5KWcodGhpcylnKGlzKWYobmVjZXNzYXJ5KS02IGIoLCkyNSBiKGJ1dClmKG90aGVyd2lzZSloKEkpZihnZXQpaChhKWUKKyhzZWdtZW4pbih0YXRpb24paSh2aW9sYXRpb24pZihvbilnIEZhKFB5RXZhbF9DYWxsT2JqZWN0KXAKKzAgNTU0OSAzOTAxIDQgdiAwIDU2NDkgYSBGZygxNCkzMzY4IGIoNCk4MyBiKEludGVybmFscylwCitlb3AgZW5kCislJVRyYWlsZXIKKwordXNlcmRpY3QgL2VuZC1ob29rIGtub3due2VuZC1ob29rfWlmCislJUVPRgpkaWZmIC0tZ2l0IGEvZG9jL3B5T3BlblNTTC50ZXggYi9kb2MvcHlPcGVuU1NMLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDM5ODU2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3B5T3BlblNTTC50ZXgKQEAgLTAsMCArMSwxMDU2IEBACitcZG9jdW1lbnRjbGFzc3tob3d0b30KKworXHRpdGxle1B5dGhvbiBPcGVuU1NMIE1hbnVhbH0KKworXHJlbGVhc2V7MC42fQorCitcYXV0aG9ye01hcnRpbiBTavZncmVufQorXGF1dGhvcmFkZHJlc3N7XGVtYWlse21hcnRpbkBzdHJha3QuY29tfX0KKworXHVzZXBhY2thZ2VbZW5nbGlzaF17YmFiZWx9CitcdXNlcGFja2FnZVtUMV17Zm9udGVuY30KKworXGJlZ2lue2RvY3VtZW50fQorCitcbWFrZXRpdGxlCisKK1xiZWdpbnthYnN0cmFjdH0KK1xub2luZGVudAorVGhpcyBtb2R1bGUgaXMgYSByYXRoZXIgdGhpbiB3cmFwcGVyIGFyb3VuZCAoYSBzdWJzZXQgb2YpIHRoZSBPcGVuU1NMIGxpYnJhcnkuCitXaXRoIHRoaW4gd3JhcHBlciBJIG1lYW4gdGhhdCBhIGxvdCBvZiB0aGUgb2JqZWN0IG1ldGhvZHMgZG8gbm90aGluZyBtb3JlIHRoYW4KK2NhbGxpbmcgYSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uIGluIHRoZSBPcGVuU1NMIGxpYnJhcnkuCitcZW5ke2Fic3RyYWN0fQorCitcdGFibGVvZmNvbnRlbnRzCisKKworXHNlY3Rpb257SW50cm9kdWN0aW9uIFxsYWJlbHtpbnRyb319CisKK1RoZSByZWFzb24gdGhpcyBtb2R1bGUgZXhpc3RzIGF0IGFsbCBpcyB0aGF0IHRoZSBTU0wgc3VwcG9ydCBpbiB0aGUgc29ja2V0Cittb2R1bGUgaW4gdGhlIFB5dGhvbiAyLjEgZGlzdHJpYnV0aW9uICh3aGljaCBpcyB3aGF0IHdlIHVzZWQsIG9mIGNvdXJzZSBJCitjYW5ub3Qgc3BlYWsgZm9yIGxhdGVyIHZlcnNpb25zKSBpcyBzZXZlcmVseSBsaW1pdGVkLgorCitXaGVuIGFza2luZyBhYm91dCBTU0wgb24gdGhlIGNvbXAubGFuZy5weXRob24gbmV3c2dyb3VwIChvciBvbgorcHl0aG9uLWxpc3RAcHl0aG9uLm9yZykgcGVvcGxlIHVzdWFsbHkgcG9pbnRlZCB5b3UgdG8gdGhlIE0yQ3J5cHRvIHBhY2thZ2UuCitUaGUgTTJDcnlwdG8uU1NMIG1vZHVsZSBkb2VzIGltcGxlbWVudCBhIGxvdCBvZiBPcGVuU1NMJ3MgZnVuY3Rpb25hbGl0eSBidXQKK3VuZm9ydHVuYXRlbHkgaXRzIGVycm9yIGhhbmRsaW5nIHN5c3RlbSBkb2VzIG5vdCBzZWVtIHRvIGJlIGZpbmlzaGVkLAorZXNwZWNpYWxseSBmb3Igbm9uLWJsb2NraW5nIEkvTy4gIEkgdGhpbmsgdGhhdCBtdWNoIG9mIHRoZSByZWFzb24gZm9yIHRoaXMKK2lzIHRoYXQgTTJDcnlwdG9cZm9vdG5vdGV7U2VlIFx1cmx7aHR0cDovL3d3dy5wb3N0MS5jb20vaG9tZS9uZ3BzL20yL319IGlzCitkZXZlbG9wZWQgdXNpbmcgU1dJR1xmb290bm90ZXtTZWUgXHVybHtodHRwOi8vc3dpZy5zb3VyY2Vmb3JnZS5uZXQvfX0uICBUaGlzCittYWtlcyBpdCBhd2t3YXJkIHRvIGNyZWF0ZSBmdW5jdGlvbnMgdGhhdCBlLmcuIGNhbiByZXR1cm4gYm90aCBhbiBpbnRlZ2VyIGFuZAorTlVMTCBzaW5jZSAoYXMgZmFyIGFzIEkga25vdykgeW91IGJhc2ljYWxseSB3cml0ZSBDIGZ1bmN0aW9ucyBhbmQgU1dJRyBtYWtlcword3JhcHBlciBmdW5jdGlvbnMgdGhhdCBwYXJzZXMgdGhlIFB5dGhvbiBhcmd1bWVudCBsaXN0IGFuZCBjYWxscyB5b3VyIEMKK2Z1bmN0aW9uLCBhbmQgZmluYWxseSB0cmFuc2Zvcm1zIHlvdXIgcmV0dXJuIHZhbHVlIHRvIGEgUHl0aG9uIG9iamVjdC4KKworCitcc2VjdGlvbntCdWlsZGluZyBhbmQgSW5zdGFsbGluZyBcbGFiZWx7YnVpbGRpbmd9fQorCitUaGVzZSBpbnN0cnVjdGlvbnMgY2FuIGFsc28gYmUgZm91bmQgaW4gdGhlIGZpbGUgXHZlcmJ8SU5TVEFMTHwuCisKK0kgaGF2ZSB0ZXN0ZWQgdGhpcyBvbiBEZWJpYW4gTGludXggc3lzdGVtcyAod29vZHkgYW5kIHNpZCksIFNvbGFyaXMgMi42IGFuZAorMi43LiBPdGhlcnMgaGF2ZSBzdWNjZXNzZnVsbHkgY29tcGlsZWQgaXQgb24gV2luZG93cyBhbmQgTlQuCisKK1xzdWJzZWN0aW9ue0J1aWxkaW5nIHRoZSBNb2R1bGUgb24gYSBVbml4IFN5c3RlbSBcbGFiZWx7YnVpbGRpbmctdW5peH19CisKK3B5T3BlblNTTCB1c2VzIGRpc3R1dGlscywgc28gdGhlcmUgcmVhbGx5IHNob3VsZG4ndCBiZSBhbnkgcHJvYmxlbXMuIFRvIGJ1aWxkCit0aGUgbGlicmFyeToKK1xiZWdpbnt2ZXJiYXRpbX0KK3B5dGhvbiBzZXR1cC5weSBidWlsZAorXGVuZHt2ZXJiYXRpbX0KKworSWYgeW91ciBPcGVuU1NMIGhlYWRlciBmaWxlcyBhcmVuJ3QgaW4gXHZlcmJ8L3Vzci9pbmNsdWRlfCwgeW91IG1heSBuZWVkIHRvCitzdXBwbHkgdGhlIFx2ZXJifC1JfCBmbGFnIHRvIGxldCB0aGUgc2V0dXAgc2NyaXB0IGtub3cgd2hlcmUgdG8gbG9vay4gVGhlIHNhbWUKK2dvZXMgZm9yIHRoZSBsaWJyYXJpZXMgb2YgY291cnNlLCB1c2UgdGhlIFx2ZXJifC1MfCBmbGFnLiBOb3RlIHRoYXQKK1x2ZXJifGJ1aWxkfCB3b24ndCBhY2NlcHQgdGhlc2UgZmxhZ3MsIHNvIHlvdSBoYXZlIHRvIHJ1biBmaXJzdAorXHZlcmJ8YnVpbGRfZXh0fCBhbmQgdGhlbiBcdmVyYnxidWlsZHwhIEV4YW1wbGU6CitcYmVnaW57dmVyYmF0aW19CitweXRob24gc2V0dXAucHkgYnVpbGRfZXh0IC1JL3Vzci9sb2NhbC9zc2wvaW5jbHVkZSAtTC91c3IvbG9jYWwvc3NsL2xpYgorcHl0aG9uIHNldHVwLnB5IGJ1aWxkCitcZW5ke3ZlcmJhdGltfQorCitOb3cgeW91IHNob3VsZCBoYXZlIGEgZGlyZWN0b3J5IGNhbGxlZCBcdmVyYnxPcGVuU1NMfCB0aGF0IGNvbnRhaW5zIGUuZy4KK1x2ZXJifFNTTC5zb3wgYW5kIFx2ZXJifF9faW5pdF9fLnB5fCBzb21ld2hlcmUgaW4gdGhlIGJ1aWxkIGRpY3JlY3RvcnksCitzbyBqdXN0OgorXGJlZ2lue3ZlcmJhdGltfQorcHl0aG9uIHNldHVwLnB5IGluc3RhbGwKK1xlbmR7dmVyYmF0aW19CisKK0lmIHlvdSwgZm9yIHNvbWUgYXJjYW5lIHJlYXNvbiwgZG9uJ3Qgd2FudCB0aGUgbW9kdWxlIHRvIGFwcGVhciBpbiB0aGUKK1x2ZXJifHNpdGUtcGFja2FnZXN8IGRpcmVjdG9yeSwgdXNlIHRoZSBcdmVyYnwtLXByZWZpeHwgb3B0aW9uLgorCitZb3UgY2FuLCBvZiBjb3Vyc2UsIGRvCitcYmVnaW57dmVyYmF0aW19CitweXRob24gc2V0dXAucHkgLS1oZWxwCitcZW5ke3ZlcmJhdGltfQorCit0byBmaW5kIG91dCBtb3JlIGFib3V0IGhvdyB0byB1c2UgdGhlIHNjcmlwdC4KKworXHN1YnNlY3Rpb257QnVpbGRpbmcgdGhlIE1vZHVsZSBvbiBhIFdpbmRvd3MgU3lzdGVtIFxsYWJlbHtidWlsZGluZy13aW5kb3dzfX0KKworQmlnIHRoYW5rcyB0byBJdGFtYXIgU2h0dWxsLVRyYXVyaW5nIGFuZCBPbGVnIE9ybG92IGZvciB0aGVpciBoZWxwIHdpdGgKK1dpbmRvd3MgYnVpbGQgaW5zdHJ1Y3Rpb25zLiAgU2FtZSBhcyBmb3IgVW5peCBzeXN0ZW1zLCB3ZSBoYXZlIHRvIHNlcGFyYXRlCit0aGUgXHZlcmJ8YnVpbGRfZXh0fCBhbmQgdGhlIFx2ZXJifGJ1aWxkfC4KKworQnVpbGRpbmcgdGhlIGxpYnJhcnk6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK3NldHVwLnB5IGJ1aWxkX2V4dCAtSSAuLi5cb3BlbnNzbFxpbmMzMiAtTCAuLi5cb3BlbnNzbFxvdXQzMmRsbAorc2V0dXAucHkgYnVpbGQKK1xlbmR7dmVyYmF0aW19CisKK1doZXJlIFx2ZXJifC4uLlxvcGVuc3NsfCBpcyBvZiBjb3Vyc2UgdGhlIGxvY2F0aW9uIG9mIHlvdXIgT3BlblNTTCBpbnN0YWxsYXRpb24uCisKK0luc3RhbGxhdGlvbiBpcyB0aGUgc2FtZSBhcyBmb3IgVW5peCBzeXN0ZW1zOgorXGJlZ2lue3ZlcmJhdGltfQorc2V0dXAucHkgaW5zdGFsbAorXGVuZHt2ZXJiYXRpbX0KKworQW5kIHNpbWlsYXJpbHksIHlvdSBjYW4gZG8KK1xiZWdpbnt2ZXJiYXRpbX0KK3NldHVwLnB5IC0taGVscAorXGVuZHt2ZXJiYXRpbX0KKwordG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24uCisKKworXHNlY3Rpb257XG1vZHVsZXtPcGVuU1NMfSAtLS0gUHl0aG9uIGludGVyZmFjZSB0byBPcGVuU1NMIFxsYWJlbHtvcGVuc3NsfX0KKworXGRlY2xhcmVtb2R1bGV7ZXh0ZW5zaW9ufXtPcGVuU1NMfQorXG1vZHVsZXN5bm9wc2lze1B5dGhvbiBpbnRlcmZhY2UgdG8gT3BlblNTTH0KKworVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgaGlnaC1sZXZlbCBpbnRlcmZhY2UgdG8gdGhlIGZ1bmN0aW9ucyBpbiB0aGUKK09wZW5TU0wgbGlicmFyeS4gVGhlIGZvbGxvd2luZyBtb2R1bGVzIGFyZSBkZWZpbmVkOgorCitcYmVnaW57ZGF0YWRlc2N9e2NyeXB0b30KK0dlbmVyaWMgY3J5cHRvZ3JhcGhpYyBtb2R1bGUuIE5vdGUgdGhhdCBpZiBhbnl0aGluZyBpcyBpbmNvbXBsZXRlLCB0aGlzIG1vZHVsZSBpcyEKK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntkYXRhZGVzY317cmFuZH0KK0FuIGludGVyZmFjZSB0byB0aGUgT3BlblNTTCBwc2V1ZG8gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCitcZW5ke2RhdGFkZXNjfQorCitcYmVnaW57ZGF0YWRlc2N9e1NTTH0KK0FuIGludGVyZmFjZSB0byB0aGUgU1NMLXNwZWNpZmljIHBhcnRzIG9mIE9wZW5TU0wuCitcZW5ke2RhdGFkZXNjfQorCisKKyUgJSAlIGNyeXB0byBtb2R1bGVPcGVuU1NMCisKK1xzdWJzZWN0aW9ue1xtb2R1bGV7Y3J5cHRvfSAtLS0gR2VuZXJpYyBjcnlwdG9ncmFwaGljIG1vZHVsZSBcbGFiZWx7b3BlbnNzbC1jcnlwdG99fQorCitcZGVjbGFyZW1vZHVsZXtleHRlbnNpb259e2NyeXB0b30KK1xtb2R1bGVzeW5vcHNpc3tHZW5lcmljIGNyeXB0b2dyYXBoaWMgbW9kdWxlfQorCitcYmVnaW57ZGF0YWRlc2N9e1g1MDlUeXBlfQorQSBQeXRob24gdHlwZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBYNTA5IG9iamVjdCB0eXBlLgorXGVuZHtkYXRhZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtYNTA5fXt9CitGYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhbiBYNTA5IG9iamVjdC4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntkYXRhZGVzY317WDUwOU5hbWVUeXBlfQorQSBQeXRob24gdHlwZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBYNTA5TmFtZSBvYmplY3QgdHlwZS4KK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntmdW5jZGVzY317WDUwOU5hbWV9e3g1MDluYW1lfQorRmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBjb3B5IG9mIFx2YXJ7eDUwOW5hbWV9LgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2RhdGFkZXNjfXtYNTA5UmVxVHlwZX0KK0EgUHl0aG9uIHR5cGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgWDUwOVJlcSBvYmplY3QgdHlwZS4KK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntmdW5jZGVzY317WDUwOVJlcX17fQorRmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gWDUwOVJlcSBvYmplY3QuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZGF0YWRlc2N9e1g1MDlTdG9yZVR5cGV9CitBIFB5dGhvbiB0eXBlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIFg1MDlTdG9yZSBvYmplY3QgdHlwZS4KK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntkYXRhZGVzY317UEtleVR5cGV9CitBIFB5dGhvbiB0eXBlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIFBLZXkgb2JqZWN0IHR5cGUuCitcZW5ke2RhdGFkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e1BLZXl9e30KK0ZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgUEtleSBvYmplY3QuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZGF0YWRlc2N9e1BLQ1M3VHlwZX0KK0EgUHl0aG9uIHR5cGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgUEtDUzcgb2JqZWN0IHR5cGUuCitcZW5ke2RhdGFkZXNjfQorCitcYmVnaW57ZGF0YWRlc2N9e1BLQ1MxMlR5cGV9CitBIFB5dGhvbiB0eXBlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIFBLQ1MxMiBvYmplY3QgdHlwZS4KK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntkYXRhZGVzY317WDUwOUV4dGVuc2lvblR5cGV9CitBIFB5dGhvbiB0eXBlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIFg1MDlFeHRlbnNpb24gb2JqZWN0IHR5cGUuCitcZW5ke2RhdGFkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e1g1MDlFeHRlbnNpb259e3R5cGVuYW1lLCBjcml0aWNhbCwgdmFsdWV9CitGYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIFg1MDlFeHRlbnNpb24gb2JqZWN0LgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2RhdGFkZXNjfXtOZXRzY2FwZVNQS0lUeXBlfQorQSBQeXRob24gdHlwZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBOZXRzY2FwZVNQS0kgb2JqZWN0IHR5cGUuCitcZW5ke2RhdGFkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e05ldHNjYXBlU1BLSX17XG9wdGlvbmFse2VuY319CitGYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIE5ldHNjYXBlU1BLSSBvYmplY3QuIElmIHRoZSBcdmFye2VuY30gYXJndW1lbnQKK2lzIHByZXNlbnQsIGl0IHNob3VsZCBiZSBhIGJhc2U2NC1lbmNvZGVkIHN0cmluZyByZXByZXNlbnRpbmcgYSBOZXRzY2FwZVNQS0kKK29iamVjdCwgYXMgcmV0dXJuZWQgYnkgdGhlIFxtZXRob2R7YjY0X2VuY29kZX0gbWV0aG9kLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2RhdGFkZXNjfXtGSUxFVFlQRV9QRU19CitcZGF0YWxpbmV7RklMRVRZUEVfQVNOMX0KK0ZpbGUgdHlwZSBjb25zdGFudHMuCitcZW5ke2RhdGFkZXNjfQorCitcYmVnaW57ZGF0YWRlc2N9e1RZUEVfUlNBfQorXGRhdGFsaW5le1RZUEVfRFNBfQorS2V5IHR5cGUgY29uc3RhbnRzLgorXGVuZHtkYXRhZGVzY30KKworXGJlZ2lue2V4Y2Rlc2N9e0Vycm9yfQorR2VuZXJpYyBleGNlcHRpb24gdXNlZCBpbiB0aGUgXG1vZHVsZXtjcnlwdG99IG1vZHVsZS4KK1xlbmR7ZXhjZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtkdW1wX2NlcnRpZmljYXRlfXt0eXBlLCBjZXJ0fQorRHVtcCB0aGUgY2VydGlmaWNhdGUgXHZhcntjZXJ0fSBpbnRvIGEgYnVmZmVyIHN0cmluZyBlbmNvZGVkIHdpdGggdGhlIHR5cGUKK1x2YXJ7dHlwZX0uCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e2R1bXBfY2VydGlmaWNhdGVfcmVxdWVzdH17dHlwZSwgcmVxfQorRHVtcCB0aGUgY2VydGlmaWNhdGUgcmVxdWVzdCBcdmFye3JlcX0gaW50byBhIGJ1ZmZlciBzdHJpbmcgZW5jb2RlZCB3aXRoIHRoZQordHlwZSBcdmFye3R5cGV9LgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtkdW1wX3ByaXZhdGVrZXl9e3R5cGUsIHBrZXlcb3B0aW9uYWx7LCBjaXBoZXIsIHBhc3NwaHJhc2V9fQorRHVtcCB0aGUgcHJpdmF0ZSBrZXkgXHZhcntwa2V5fSBpbnRvIGEgYnVmZmVyIHN0cmluZyBlbmNvZGVkIHdpdGggdGhlIHR5cGUKK1x2YXJ7dHlwZX0sIG9wdGlvbmFsbHkgKGlmIFx2YXJ7dHlwZX0gaXMgXGNvbnN0YW50e0ZJTEVUWVBFX1BFTX0pIGVuY3J5cHRpbmcgaXQKK3VzaW5nIFx2YXJ7Y2lwaGVyfSBhbmQgXHZhcntwYXNzcGhyYXNlfS4KKworXHZhcntwYXNzcGhyYXNlfSBtdXN0IGJlIGVpdGhlciBhIHN0cmluZyBvciBhIGNhbGxiYWNrIGZvciBwcm92aWRpbmcgdGhlCitwYXNzIHBocmFzZS4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317bG9hZF9jZXJ0aWZpY2F0ZX17dHlwZSwgYnVmZmVyfQorTG9hZCBhIGNlcnRpZmljYXRlIChYNTA5KSBmcm9tIHRoZSBzdHJpbmcgXHZhcntidWZmZXJ9IGVuY29kZWQgd2l0aCB0aGUKK3R5cGUgXHZhcnt0eXBlfS4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317bG9hZF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0fXt0eXBlLCBidWZmZXJ9CitMb2FkIGEgY2VydGlmaWNhdGUgcmVxdWVzdCAoWDUwOVJlcSkgZnJvbSB0aGUgc3RyaW5nIFx2YXJ7YnVmZmVyfSBlbmNvZGVkIHdpdGgKK3RoZSB0eXBlIFx2YXJ7dHlwZX0uCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e2xvYWRfcHJpdmF0ZWtleX17dHlwZSwgYnVmZmVyXG9wdGlvbmFseywgcGFzc3BocmFzZX19CitMb2FkIGEgcHJpdmF0ZSBrZXkgKFBLZXkpIGZyb20gdGhlIHN0cmluZyBcdmFye2J1ZmZlcn0gZW5jb2RlZCB3aXRoCit0aGUgdHlwZSBcdmFye3R5cGV9IChtdXN0IGJlIG9uZSBvZiBcY29uc3RhbnR7RklMRVRZUEVfUEVNfSBhbmQKK1xjb25zdGFudHtGSUxFVFlQRV9BU04xfSkuCisKK1x2YXJ7cGFzc3BocmFzZX0gbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYSBjYWxsYmFjayBmb3IgcHJvdmlkaW5nIHRoZQorcGFzcyBwaHJhc2UuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e2xvYWRfcGtjczdfZGF0YX17dHlwZSwgYnVmZmVyfQorTG9hZCBwa2NzNyBkYXRhIGZyb20gdGhlIHN0cmluZyBcdmFye2J1ZmZlcn0gZW5jb2RlZCB3aXRoIHRoZSB0eXBlIFx2YXJ7dHlwZX0uCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e2xvYWRfcGtjczEyfXtidWZmZXJcb3B0aW9uYWx7LCBwYXNzcGhyYXNlfX0KK0xvYWQgcGtjczEyIGRhdGEgZnJvbSB0aGUgc3RyaW5nIFx2YXJ7YnVmZmVyfS4gSWYgdGhlIHBrY3MxMiBzdHJ1Y3R1cmUgaXMKK2VuY3J5cHRlZCwgYSBcdmFye3Bhc3NwaHJhc2V9IG11c3QgYmUgaW5jbHVkZWQuCitcZW5ke2Z1bmNkZXNjfQorCisKK1xzdWJzdWJzZWN0aW9ue1g1MDkgb2JqZWN0cyBcbGFiZWx7b3BlbnNzbC14NTA5fX0KKworWDUwOSBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorCitcYmVnaW57bWV0aG9kZGVzY31bWDUwOV17Z2V0X2lzc3Vlcn17fQorUmV0dXJuIGEgXGVte2JvcnJvd2VkIHJlZmVyZW5jZX0gdG8gYSBYNTA5TmFtZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBpc3N1ZXIKK29mIHRoZSBjZXJ0aWZpY2F0ZS4gIFdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgWDUwOSBvciBYNTA5UmVxIG9iamVjdCBpcworZGVzdHJveWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIGludmFsaWQhCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtnZXRfcHVia2V5fXt9CitSZXR1cm4gYSBQS2V5IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHB1YmxpYyBrZXkgb2YgdGhlIGNlcnRpZmljYXRlLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bWDUwOV17Z2V0X3NlcmlhbF9udW1iZXJ9e30KK1JldHVybiB0aGUgY2VydGlmaWNhdGUgc2VyaWFsIG51bWJlci4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde2dldF9zdWJqZWN0fXt9CitSZXR1cm4gYSBcZW17Ym9ycm93ZWQgcmVmZXJlbmNlfSB0byBhIFg1MDlOYW1lIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHN1YmplY3QKK29mIHRoZSBjZXJ0aWZpY2F0ZS4gIFdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgWDUwOSBvciBYNTA5UmVxIG9iamVjdCBpcworZGVzdHJveWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIGludmFsaWQhCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtnZXRfdmVyc2lvbn17fQorUmV0dXJuIHRoZSBjZXJ0aWZpY2F0ZSB2ZXJzaW9uLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bWDUwOV17Z210aW1lX2Fkal9ub3RCZWZvcmV9e3RpbWV9CitBZGp1c3QgdGhlIHRpbWVzdGFtcCAoaW4gR01UKSB3aGVuIHRoZSBjZXJ0aWZpY2F0ZSBzdGFydHMgYmVpbmcgdmFsaWQuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtnbXRpbWVfYWRqX25vdEFmdGVyfXt0aW1lfQorQWRqdXN0IHRoZSB0aW1lc3RhbXAgKGluIEdNVCkgd2hlbiB0aGUgY2VydGlmaWNhdGUgc3RvcHMgYmVpbmcgdmFsaWQuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtoYXNfZXhwaXJlZH17fQorQ2hlY2tzIHRoZSBjZXJ0aWZpY2F0ZSdzIHRpbWUgc3RhbXAgYWdhaW5zdCBjdXJyZW50IHRpbWUuIFJldHVybnMgdHJ1ZSBpZiB0aGUKK2NlcnRpZmljYXRlIGhhcyBleHBpcmVkIGFuZCBmYWxzZSBvdGhlcndpc2UuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtzZXRfaXNzdWVyfXtpc3N1ZXJ9CitTZXQgdGhlIGlzc3VlciBvZiB0aGUgY2VydGlmaWNhdGUgdG8gXHZhcntpc3N1ZXJ9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bWDUwOV17c2V0X3B1YmtleX17cGtleX0KK1NldCB0aGUgcHVibGljIGtleSBvZiB0aGUgY2VydGlmaWNhdGUgdG8gXHZhcntwa2V5fS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde3NldF9zZXJpYWxfbnVtYmVyfXtzZXJpYWxub30KK1NldCB0aGUgc2VyaWFsIG51bWJlciBvZiB0aGUgY2VydGlmaWNhdGUgdG8gXHZhcntzZXJpYWxub30uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtzZXRfc3ViamVjdH17c3ViamVjdH0KK1NldCB0aGUgc3ViamVjdCBvZiB0aGUgY2VydGlmaWNhdGUgdG8gXHZhcntzdWJqZWN0fS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde3NldF92ZXJzaW9ufXt2ZXJzaW9ufQorU2V0IHRoZSBjZXJ0aWZpY2F0ZSB2ZXJzaW9uIHRvIFx2YXJ7dmVyc2lvbn0uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtYNTA5XXtzaWdufXtwa2V5LCBkaWdlc3R9CitTaWduIHRoZSBjZXJ0aWZpY2F0ZSwgdXNpbmcgdGhlIGtleSBcdmFye3BrZXl9IGFuZCB0aGUgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtCitpZGVudGlmaWVkIGJ5IHRoZSBzdHJpbmcgXHZhcntkaWdlc3R9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bWDUwOV17c3ViamVjdF9uYW1lX2hhc2h9e30KK1JldHVybiB0aGUgaGFzaCBvZiB0aGUgY2VydGlmaWNhdGUgc3ViamVjdC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlde2RpZ2VzdH17ZGlnZXN0X25hbWV9CitSZXR1cm4gYSBkaWdlc3Qgb2YgdGhlIGNlcnRpZmljYXRlLCB1c2luZyB0aGUgXHZhcntkaWdlc3RfbmFtZX0gbWV0aG9kLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bWDUwOV17YWRkX2V4dGVuc2lvbnN9e2V4dGVuc2lvbnN9CitBZGQgdGhlIGV4dGVuc2lvbnMgaW4gdGhlIHNlcXVlbmNlIFx2YXJ7ZXh0ZW5zaW9uc30gdG8gdGhlIGNlcnRpZmljYXRlLgorXGVuZHttZXRob2RkZXNjfQorCitcc3Vic3Vic2VjdGlvbntYNTA5TmFtZSBvYmplY3RzIFxsYWJlbHtvcGVuc3NsLXg1MDluYW1lfX0KKworWDUwOU5hbWUgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWVtYmVyczoKKworXGJlZ2lue21lbWJlcmRlc2N9W1g1MDlOYW1lXXtjb3VudHJ5TmFtZX0KK1RoZSBjb3VudHJ5IG9mIHRoZSBlbnRpdHkuIFxjb2Rle0N9IG1heSBiZSB1c2VkIGFzIGFuIGFsaWFzIGZvcgorXGNvZGV7Y291bnRyeU5hbWV9LgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY31bWDUwOU5hbWVde3N0YXRlT3JQcm92aW5jZU5hbWV9CitUaGUgc3RhdGUgb3IgcHJvdmluY2Ugb2YgdGhlIGVudGl0eS4gXGNvZGV7U1R9IG1heSBiZSB1c2VkIGFzIGFuIGFsaWFzIGZvcgorXGNvZGV7c3RhdGVPclByb3ZpbmNlTmFtZX23CitcZW5ke21lbWJlcmRlc2N9CisKK1xiZWdpbnttZW1iZXJkZXNjfVtYNTA5TmFtZV17bG9jYWxpdHlOYW1lfQorVGhlIGxvY2FsaXR5IG9mIHRoZSBlbnRpdHkuIFxjb2Rle0x9IG1heSBiZSB1c2VkIGFzIGFuIGFsaWFzIGZvcgorXGNvZGV7bG9jYWxpdHlOYW1lfS4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9W1g1MDlOYW1lXXtvcmdhbml6YXRpb25OYW1lfQorVGhlIG9yZ2FuaXphdGlvbiBuYW1lIG9mIHRoZSBlbnRpdHkuIFxjb2Rle099IG1heSBiZSB1c2VkIGFzIGFuIGFsaWFzIGZvcgorXGNvZGV7b3JnYW5pemF0aW9uTmFtZX0uCitcZW5ke21lbWJlcmRlc2N9CisKK1xiZWdpbnttZW1iZXJkZXNjfVtYNTA5TmFtZV17b3JnYW5pemF0aW9uYWxVbml0TmFtZX0KK1RoZSBvcmdhbml6YXRpb25hbCB1bml0IG9mIHRoZSBlbnRpdHkuIFxjb2Rle09VfSBtYXkgYmUgdXNlZCBhcyBhbiBhbGlhcyBmb3IKK1xjb2Rle29yZ2FuaXphdGlvbmFsVW5pdE5hbWV9LgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY31bWDUwOU5hbWVde2NvbW1vbk5hbWV9CitUaGUgY29tbW9uIG5hbWUgb2YgdGhlIGVudGl0eS4gXGNvZGV7Q059IG1heSBiZSB1c2VkIGFzIGFuIGFsaWFzIGZvcgorXGNvZGV7Y29tbW9uTmFtZX0uCitcZW5ke21lbWJlcmRlc2N9CisKK1xiZWdpbnttZW1iZXJkZXNjfVtYNTA5TmFtZV17ZW1haWxBZGRyZXNzfQorVGhlIGUtbWFpbCBhZGRyZXNzIG9mIHRoZSBlbnRpdHkuCitcZW5ke21lbWJlcmRlc2N9CisKK1xzdWJzdWJzZWN0aW9ue1g1MDlSZXEgb2JqZWN0cyBcbGFiZWx7b3BlbnNzbC14NTA5cmVxfX0KKworWDUwOVJlcSBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorCitcYmVnaW57bWV0aG9kZGVzY31bWDUwOVJlcV17Z2V0X3B1YmtleX17fQorUmV0dXJuIGEgUEtleSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwdWJsaWMga2V5IG9mIHRoZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bWDUwOVJlcV17Z2V0X3N1YmplY3R9e30KK1JldHVybiBhIFxlbXtib3Jyb3dlZCByZWZlcmVuY2V9IHRvIGEgWDUwOU5hbWUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3ViamVjdAorb2YgdGhlIGNlcnRpZmljYXRlLiAgV2hlbiB0aGUgY29ycmVzcG9uZGluZyBYNTA5IG9yIFg1MDlSZXEgb2JqZWN0IGlzCitkZXN0cm95ZWQsIHRoaXMgb2JqZWN0IHdpbGwgYmUgaW52YWxpZCEKK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlSZXFde3NldF9wdWJrZXl9e3BrZXl9CitTZXQgdGhlIHB1YmxpYyBrZXkgb2YgdGhlIGNlcnRpZmljYXRlIHJlcXVlc3QgdG8gXHZhcntwa2V5fS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlSZXFde3NpZ259e3BrZXksIGRpZ2VzdH0KK1NpZ24gdGhlIGNlcnRpZmljYXRlIHJlcXVlc3QsIHVzaW5nIHRoZSBrZXkgXHZhcntwa2V5fSBhbmQgdGhlIG1lc3NhZ2UgZGlnZXN0CithbGdvcml0aG0gaWRlbnRpZmllZCBieSB0aGUgc3RyaW5nIFx2YXJ7ZGlnZXN0fS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W1g1MDlSZXFde3ZlcmlmeX17cGtleX0KK1ZlcmlmeSBhIGNlcnRpZmljYXRlIHJlcXVlc3QgdXNpbmcgdGhlIHB1YmxpYyBrZXkgXHZhcntwa2V5fS4KK1xlbmR7bWV0aG9kZGVzY30KKworXHN1YnN1YnNlY3Rpb257WDUwOVN0b3JlIG9iamVjdHMgXGxhYmVse29wZW5zc2wteDUwOXN0b3JlfX0KKworVGhlIFg1MDlTdG9yZSBvYmplY3QgaGFzIGN1cnJlbnRseSBqdXN0IG9uZSBtZXRob2Q6CisKK1xiZWdpbnttZXRob2RkZXNjfVtYNTA5U3RvcmVde2FkZF9jZXJ0fXtjZXJ0fQorQWRkIHRoZSBjZXJ0aWZpY2F0ZSBcdmFye2NlcnR9IHRvIHRoZSBjZXJ0aWZpY2F0ZSBzdG9yZS4KK1xlbmR7bWV0aG9kZGVzY30KKworXHN1YnN1YnNlY3Rpb257UEtleSBvYmplY3RzIFxsYWJlbHtvcGVuc3NsLXBrZXl9fQorCitUaGUgUEtleSBvYmplY3QgaGFzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworXGJlZ2lue21ldGhvZGRlc2N9W1BLZXlde2JpdHN9e30KK1JldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIGtleS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W1BLZXlde2dlbmVyYXRlX2tleX17dHlwZSwgYml0c30KK0dlbmVyYXRlIGEgcHVibGljL3ByaXZhdGUga2V5IHBhaXIgb2YgdGhlIHR5cGUgXHZhcnt0eXBlfSAob25lIG9mCitcY29uc3RhbnR7VFlQRV9SU0F9IGFuZCBcY29uc3RhbnR7VFlQRV9EU0F9KSB3aXRoIHRoZSBzaXplIFx2YXJ7Yml0c30uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtQS2V5XXt0eXBlfXt9CitSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGtleS4KK1xlbmR7bWV0aG9kZGVzY30KKworXHN1YnN1YnNlY3Rpb257UEtDUzcgb2JqZWN0cyBcbGFiZWx7b3BlbnNzbC1wa2NzN319CisKK1BLQ1M3IG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKK1xiZWdpbnttZXRob2RkZXNjfVtQS0NTN117dHlwZV9pc19zaWduZWR9e30KK0ZJWE1FCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtQS0NTN117dHlwZV9pc19lbnZlbG9wZWR9e30KK0ZJWE1FCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtQS0NTN117dHlwZV9pc19zaWduZWRBbmRFbnZlbG9wZWR9e30KK0ZJWE1FCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtQS0NTN117dHlwZV9pc19kYXRhfXt9CitGSVhNRQorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bUEtDUzdde2dldF90eXBlX25hbWV9e30KK0dldCB0aGUgdHlwZSBuYW1lIG9mIHRoZSBQS0NTNy4KK1xlbmR7bWV0aG9kZGVzY30KKworXHN1YnN1YnNlY3Rpb257UEtDUzEyIG9iamVjdHMgXGxhYmVse29wZW5zc2wtcGtjczEyfX0KKworUEtDUzEyIG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKK1xiZWdpbnttZXRob2RkZXNjfVtQS0NTMTJde2dldF9jZXJ0aWZpY2F0ZX17fQorUmV0dXJuIGNlcnRpZmljYXRlIHBvcnRpb24gb2YgdGhlIFBLQ1MxMiBzdHJ1Y3R1cmUuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtQS0NTMTJde2dldF9wcml2YXRla2V5fXt9CitSZXR1cm4gcHJpdmF0ZSBrZXkgcG9ydGlvbiBvZiB0aGUgUEtDUzEyIHN0cnVjdHVyZQorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bUEtDUzEyXXtnZXRfY2FfY2VydGlmaWNhdGVzfXt9CitSZXR1cm4gQ0EgY2VydGlmaWNhdGVzIHdpdGhpbiB0aGUgUEtDUzEyIG9iamVjdCBhcyBhIHR1cGxlLiBSZXR1cm5zCitOb25lIGlmIG5vIENBIGNlcnRpZmljYXRlcyBhcmUgcHJlc2VudC4KK1xlbmR7bWV0aG9kZGVzY30KKworXHN1YnN1YnNlY3Rpb257WDUwOUV4dGVuc2lvbiBvYmplY3RzIFxsYWJlbHtvcGVuc3NsLTUwOWV4dH19CisKK1g1MDlFeHRlbnNpb24gb2JqZWN0cyBjdXJyZW50bHkgb25seSBoYXZlIG9uZSBtZXRob2Q6CisKK1xiZWdpbnttZXRob2RkZXNjfVtYNTA5RXh0ZW5zaW9uXXtnZXRfY3JpdGljYWx9e30KK1JldHVybiB0aGUgY3JpdGljYWwgZmllbGQgb2YgdGhlIGV4dGVuc2lvbiBvYmplY3QuCitcZW5ke21ldGhvZGRlc2N9CisKK1xzdWJzdWJzZWN0aW9ue05ldHNjYXBlU1BLSSBvYmplY3RzIFxsYWJlbHtvcGVuc3NsLW5ldHNjYXBlLXNwa2l9fQorCitOZXRzY2FwZVNQS0kgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworXGJlZ2lue21ldGhvZGRlc2N9W05ldHNjYXBlU1BLSV17YjY0X2VuY29kZX17fQorUmV0dXJuIGEgYmFzZTY0LWVuY29kZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtOZXRzY2FwZVNQS0lde2dldF9wdWJrZXl9e30KK1JldHVybiB0aGUgcHVibGljIGtleSBvZiBvYmplY3QuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtOZXRzY2FwZVNQS0lde3NldF9wdWJrZXl9e2tleX0KK1NldCB0aGUgcHVibGljIGtleSBvZiB0aGUgb2JqZWN0IHRvIFx2YXJ7a2V5fS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W05ldHNjYXBlU1BLSV17c2lnbn17a2V5LCBkaWdlc3RfbmFtZX0KK1NpZ24gdGhlIE5ldHNjYXBlU1BLSSBvYmplY3QgdXNpbmcgdGhlIGdpdmVuIFx2YXJ7a2V5fSBhbmQgXHZhcntkaWdlc3RfbmFtZX0uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtOZXRzY2FwZVNQS0lde3ZlcmlmeX17a2V5fQorVmVyaWZ5IHRoZSBOZXRzY2FwZVNQS0kgb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiBcdmFye2tleX0uCitcZW5ke21ldGhvZGRlc2N9CisKKworJSAlICUgcmFuZCBtb2R1bGUKKworXHN1YnNlY3Rpb257XG1vZHVsZXtyYW5kfSAtLS0gQW4gaW50ZXJmYWNlIHRvIHRoZSBPcGVuU1NMIHBzZXVkbyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBcbGFiZWx7b3BlbnNzbC1yYW5kfX0KKworXGRlY2xhcmVtb2R1bGV7ZXh0ZW5zaW9ufXtyYW5kfQorXG1vZHVsZXN5bm9wc2lze0FuIGludGVyZmFjZSB0byB0aGUgT3BlblNTTCBwc2V1ZG8gcmFuZG9tIG51bWJlciBnZW5lcmF0b3J9CisKK1RoaXMgbW9kdWxlIGhhbmRsZXMgdGhlIE9wZW5TU0wgcHNldWRvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIChQUk5HKSBhbmQKK2RlY2xhcmVzIHRoZSBmb2xsb3dpbmc6CisKK1xiZWdpbntmdW5jZGVzY317YWRkfXtzdHJpbmcsIGVudHJvcHl9CitNaXggYnl0ZXMgZnJvbSBcdmFye3N0cmluZ30gaW50byB0aGUgUFJORyBzdGF0ZS4gVGhlIFx2YXJ7ZW50cm9weX0gYXJndW1lbnQgaXMKKyh0aGUgbG93ZXIgYm91bmQgb2YpIGFuIGVzdGltYXRlIG9mIGhvdyBtdWNoIHJhbmRvbW5lc3MgaXMgY29udGFpbmVkIGluCitcdmFye3N0cmluZ30sIG1lYXN1cmVkIGluIGJ5dGVzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGUuZy4gXHJmY3sxNzUwfS4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317ZWdkfXtwYXRoXG9wdGlvbmFseywgYnl0ZXN9fQorUXVlcnkgdGhlIEVudHJvcHkgR2F0aGVyaW5nIERhZW1vblxmb290bm90ZXtTZWUKK1x1cmx7aHR0cDovL3d3dy5sb3RoYXIuY29tL3RlY2gvY3J5cHRvL319IG9uIHNvY2tldCBcdmFye3BhdGh9IGZvciBcdmFye2J5dGVzfQorYnl0ZXMgb2YgcmFuZG9tIGRhdGEgYW5kIGFuZCB1c2VzIFxmdW5jdGlvbnthZGR9IHRvIHNlZWQgdGhlIFBSTkcuIFRoZSBkZWZhdWx0Cit2YWx1ZSBvZiBcdmFye2J5dGVzfSBpcyAyNTUuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e2xvYWRfZmlsZX17cGF0aFxvcHRpb25hbHssIGJ5dGVzfX0KK1JlYWQgXHZhcntieXRlc30gYnl0ZXMgKG9yIGFsbCBvZiBpdCwgaWYgXHZhcntieXRlc30gaXMgbmVnYXRpdmUpIG9mIGRhdGEgZnJvbQordGhlIGZpbGUgXHZhcntwYXRofSB0byBzZWVkIHRoZSBQUk5HLiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBcdmFye2J5dGVzfSBpcyAtMS4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317c2NyZWVufXt9CitBZGQgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIHNjcmVlbiB0byB0aGUgUFJORyBzdGF0ZS4KK0F2YWlsYWJpbGl0eTogV2luZG93cy4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317c2VlZH17c3RyaW5nfQorVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgXGZ1bmN0aW9ue2FkZH0gd2l0aCBcdmFye2VudHJvcHl9IGFzIHRoZSBsZW5ndGgKK29mIHRoZSBzdHJpbmcuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e3N0YXR1c317fQorUmV0dXJucyB0cnVlIGlmIHRoZSBQUk5HIGhhcyBiZWVuIHNlZWRlZCB3aXRoIGVub3VnaCBkYXRhLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXt3cml0ZV9maWxlfXtwYXRofQorV3JpdGUgYSBudW1iZXIgb2YgcmFuZG9tIGJ5dGVzIChjdXJyZW50bHkgMTAyNCkgdG8gdGhlIGZpbGUgXHZhcntwYXRofS4gVGhpcworZmlsZSBjYW4gdGhlbiBiZSB1c2VkIHdpdGggXGZ1bmN0aW9ue2xvYWRfZmlsZX0gdG8gc2VlZCB0aGUgUFJORyBhZ2Fpbi4KK1xlbmR7ZnVuY2Rlc2N9CisKKworCislICUgJSBTU0wgbW9kdWxlCisKK1xzdWJzZWN0aW9ue1xtb2R1bGV7U1NMfSAtLS0gQW4gaW50ZXJmYWNlIHRvIHRoZSBTU0wtc3BlY2lmaWMgcGFydHMgb2YgT3BlblNTTCBcbGFiZWx7b3BlbnNzbC1zc2x9fQorCitcZGVjbGFyZW1vZHVsZXtleHRlbnNpb259e1NTTH0KK1xtb2R1bGVzeW5vcHNpc3tBbiBpbnRlcmZhY2UgdG8gdGhlIFNTTC1zcGVjaWZpYyBwYXJ0cyBvZiBPcGVuU1NMfQorCitUaGlzIG1vZHVsZSBoYW5kbGVzIHRoaW5ncyBzcGVjaWZpYyB0byBTU0wuIFRoZXJlIGFyZSB0d28gb2JqZWN0cyBkZWZpbmVkOgorQ29udGV4dCwgQ29ubmVjdGlvbi4KKworXGJlZ2lue2RhdGFkZXNjfXtTU0x2Ml9NRVRIT0R9CitcZGF0YWxpbmV7U1NMdjNfTUVUSE9EfQorXGRhdGFsaW5le1NTTHYyM19NRVRIT0R9CitcZGF0YWxpbmV7VExTdjFfTUVUSE9EfQorVGhlc2UgY29uc3RhbnRzIHJlcHJlc2VudCB0aGUgZGlmZmVyZW50IFNTTCBtZXRob2RzIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEKK2NvbnRleHQgb2JqZWN0LgorXGVuZHtkYXRhZGVzY30KKworXGJlZ2lue2RhdGFkZXNjfXtWRVJJRllfTk9ORX0KK1xkYXRhbGluZXtWRVJJRllfUEVFUn0KK1xkYXRhbGluZXtWRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlR9CitUaGVzZSBjb25zdGFudHMgcmVwcmVzZW50IHRoZSB2ZXJpZmljYXRpb24gbW9kZSB1c2VkIGJ5IHRoZSBDb250ZXh0CitvYmplY3QncyBcbWV0aG9ke3NldF92ZXJpZnl9IG1ldGhvZC4KK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntkYXRhZGVzY317RklMRVRZUEVfUEVNfQorXGRhdGFsaW5le0ZJTEVUWVBFX0FTTjF9CitGaWxlIHR5cGUgY29uc3RhbnRzIHVzZWQgd2l0aCB0aGUgXG1ldGhvZHt1c2VfY2VydGlmaWNhdGVfZmlsZX0gYW5kCitcbWV0aG9ke3VzZV9wcml2YXRla2V5X2ZpbGV9IG1ldGhvZHMgb2YgQ29udGV4dCBvYmplY3RzLgorXGVuZHtkYXRhZGVzY30KKworXGJlZ2lue2RhdGFkZXNjfXtPUF9TSU5HTEVfREhfVVNFfQorXGRhdGFsaW5le09QX0VQSEVNRVJBTF9SU0F9CitcZGF0YWxpbmV7T1BfTk9fU1NMdjJ9CitcZGF0YWxpbmV7T1BfTk9fU1NMdjN9CitcZGF0YWxpbmV7T1BfTk9fVExTdjF9CitDb25zdGFudHMgdXNlZCB3aXRoIFxtZXRob2R7c2V0X29wdGlvbnN9IG9mIENvbnRleHQgb2JqZWN0cy4KK1xjb25zdGFudHtPUF9TSU5HTEVfREhfVVNFfSBtZWFucyB0byBhbHdheXMgY3JlYXRlIGEgbmV3IGtleSB3aGVuIHVzaW5nIGVwaGVtZXJhbAorRGlmZmllLUhlbGxtYW4uIFxjb25zdGFudHtPUF9FUEhFTUVSQUxfUlNBfSBtZWFucyB0byBhbHdheXMgdXNlIGVwaGVtZXJhbCBSU0Ega2V5cword2hlbiBkb2luZyBSU0Egb3BlcmF0aW9ucy4gXGNvbnN0YW50e09QX05PX1NTTHYyfSwgXGNvbnN0YW50e09QX05PX1NTTHYzfSBhbmQKK1xjb25zdGFudHtPUF9OT19UTFN2MX0gbWVhbnMgdG8gZGlzYWJsZSB0aG9zZSBzcGVjaWZpYyBwcm90b2NvbHMuIFRoaXMgaXMKK2ludGVyZXN0aW5nIGlmIHlvdSdyZSB1c2luZyBlLmcuIFxjb25zdGFudHtTU0x2MjNfTUVUSE9EfSB0byBnZXQgYW4gU1NMdjItY29tcGF0aWJsZQoraGFuZHNoYWtlLCBidXQgZG9uJ3Qgd2FudCB0byB1c2UgU1NMdjIuCitcZW5ke2RhdGFkZXNjfQorCitcYmVnaW57ZGF0YWRlc2N9e0NvbnRleHRUeXBlfQorQSBQeXRob24gdHlwZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBDb250ZXh0IG9iamVjdCB0eXBlLgorXGVuZHtkYXRhZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtDb250ZXh0fXttZXRob2R9CitGYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIG5ldyBDb250ZXh0IG9iamVjdCBnaXZlbiBhbiBTU0wgbWV0aG9kLiBUaGUKK21ldGhvZCBzaG91bGQgYmUgXGNvbnN0YW50e1NTTHYyX01FVEhPRH0sIFxjb25zdGFudHtTU0x2M19NRVRIT0R9LAorXGNvbnN0YW50e1NTTHYyM19NRVRIT0R9IG9yIFxjb25zdGFudHtUTFN2MV9NRVRIT0R9LgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2RhdGFkZXNjfXtDb25uZWN0aW9uVHlwZX0KK0EgUHl0aG9uIHR5cGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgQ29ubmVjdGlvbiBvYmplY3QgdHlwZS4KK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntmdW5jZGVzY317Q29ubmVjdGlvbn17Y29udGV4dCwgc29ja2V0fQorRmFjdG9yeSBmdWNuY3Rpb24gdGhhdCBjcmVhdGVzIGEgbmV3IENvbm5lY3Rpb24gb2JqZWN0IGdpdmVuIGFuIFNTTCBjb250ZXh0IGFuZAorYSBzb2NrZXQgXGZvb3Rub3Rle0FjdHVhbGx5LCBhbGwgdGhhdCBpcyByZXF1aXJlZCBpcyBhbiBvYmplY3QgdGhhdAorXGVtcGh7YmVoYXZlc30gbGlrZSBhIHNvY2tldCwgeW91IGNvdWxkIGV2ZW4gdXNlIGZpbGVzLCBldmVuIHRob3VnaCBpdCdkIGJlCit0cmlja3kgdG8gZ2V0IHRoZSBoYW5kc2hha2VzIHJpZ2h0IX0gb2JqZWN0LgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2V4Y2Rlc2N9e0Vycm9yfQorVGhpcyBleGNlcHRpb24gaXMgdXNlZCBhcyBhIGJhc2UgY2xhc3MgZm9yIHRoZSBvdGhlciBTU0wtcmVsYXRlZAorZXhjZXB0aW9ucywgYnV0IG1heSBhbHNvIGJlIHJhaXNlZCBkaXJlY3RseS4KKworV2hlbmV2ZXIgdGhpcyBleGNlcHRpb24gaXMgcmFpc2VkIGRpcmVjdGx5LCBpdCBoYXMgYSBsaXN0IG9mIGVycm9yIG1lc3NhZ2VzCitmcm9tIHRoZSBPcGVuU1NMIGVycm9yIHF1ZXVlLCB3aGVyZSBlYWNoIGl0ZW0gaXMgYSB0dXBsZSBcY29kZXsoXHZhcntsaWJ9LAorXHZhcntmdW5jdGlvbn0sIFx2YXJ7cmVhc29ufSl9LiBIZXJlIFx2YXJ7bGlifSwgXHZhcntmdW5jdGlvbn0gYW5kIFx2YXJ7cmVhc29ufQorYXJlIGFsbCBzdHJpbmdzLCBkZXNjcmliaW5nIHdoZXJlIGFuZCB3aGF0IHRoZSBwcm9ibGVtIGlzLiBTZWUgXG1hbnBhZ2V7ZXJyfXszfQorZm9yIG1vcmUgaW5mb3JtYXRpb24uCitcZW5ke2V4Y2Rlc2N9CisKK1xiZWdpbntleGNkZXNjfXtaZXJvUmV0dXJuRXJyb3J9CitUaGlzIGV4Y2VwdGlvbiBtYXRjaGVzIHRoZSBlcnJvciByZXR1cm4gY29kZSBcY29kZXtTU0xfRVJST1JfWkVST19SRVRVUk59LCBhbmQKK2lzIHJhaXNlZCB3aGVuIHRoZSBTU0wgQ29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQuIEluIFNTTCAzLjAgYW5kIFRMUyAxLjAsIHRoaXMKK29ubHkgb2NjdXJzIGlmIGEgY2xvc3VyZSBhbGVydCBoYXMgb2NjdXJyZWQgaW4gdGhlIHByb3RvY29sLCBpLmUuIHRoZQorY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQgY2xlYW5seS4gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgbmVjZXNzYXJpbHkKK21lYW4gdGhhdCB0aGUgdHJhbnNwb3J0IGxheWVyIChlLmcuIGEgc29ja2V0KSBoYXMgYmVlbiBjbG9zZWQuCisKK0l0IG1heSBzZWVtIGEgbGl0dGxlIHN0cmFuZ2UgdGhhdCB0aGlzIGlzIGFuIGV4Y2VwdGlvbiwgYnV0IGl0IGRvZXMgbWF0Y2ggYW4KK1xjb2Rle1NTTF9FUlJPUn0gY29kZSwgYW5kIGlzIHZlcnkgY29udmVuaWVudC4KK1xlbmR7ZXhjZGVzY30KKworXGJlZ2lue2V4Y2Rlc2N9e1dhbnRSZWFkRXJyb3J9CitUaGUgb3BlcmF0aW9uIGRpZCBub3QgY29tcGxldGU7IHRoZSBzYW1lIEkvTyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZ2FpbgorbGF0ZXIsIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzLiBBbnkgSS9PIG1ldGhvZCBjYW4gbGVhZCB0byB0aGlzIHNpbmNlIG5ldworaGFuZHNoYWtlcyBjYW4gb2NjdXIgYXQgYW55IHRpbWUuCitcZW5ke2V4Y2Rlc2N9CisKK1xiZWdpbntleGNkZXNjfXtXYW50V3JpdGVFcnJvcn0KK1NlZSBcZXhjZXB0aW9ue1dhbnRSZWFkRXJyb3J9LgorXGVuZHtleGNkZXNjfQorCitcYmVnaW57ZXhjZGVzY317V2FudFg1MDlMb29rdXBFcnJvcn0KK1RoZSBvcGVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZSBiZWNhdXNlIGFuIGFwcGxpY2F0aW9uIGNhbGxiYWNrIGhhcyBhc2tlZCB0byBiZQorY2FsbGVkIGFnYWluLiBUaGUgSS9PIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFnYWluIGxhdGVyLCB3aXRoIHRoZSBzYW1lCithcmd1bWVudHMuIE5vdGU6IFRoaXMgd29uJ3Qgb2NjdXIgaW4gdGhpcyB2ZXJzaW9uLCBhcyB0aGVyZSBhcmUgbm8gc3VjaAorY2FsbGJhY2tzIGluIHRoaXMgdmVyc2lvbi4KK1xlbmR7ZXhjZGVzY30KKworXGJlZ2lue2V4Y2Rlc2N9e1N5c0NhbGxFcnJvcn0KK1RoZSBcZXhjZXB0aW9ue1N5c0NhbGxFcnJvcn0gb2NjdXJzIHdoZW4gdGhlcmUncyBhbiBJL08gZXJyb3IgYW5kIE9wZW5TU0wncworZXJyb3IgcXVldWUgZG9lcyBub3QgY29udGFpbiBhbnkgaW5mb3JtYXRpb24uIFRoaXMgY2FuIG1lYW4gdHdvIHRoaW5nczogQW4KK2Vycm9yIGluIHRoZSB0cmFuc3BvcnQgcHJvdG9jb2wsIG9yIGFuIGVuZCBvZiBmaWxlIHRoYXQgdmlvbGF0ZXMgdGhlIHByb3RvY29sLgorVGhlIHBhcmFtZXRlciB0byB0aGUgZXhjZXB0aW9uIGlzIGFsd2F5cyBhIHBhaXIgXGNvZGV7KFx2YXJ7ZXJybnVtfSwKK1x2YXJ7ZXJyc3RyfSl9LgorXGVuZHtleGNkZXNjfQorCisKK1xzdWJzdWJzZWN0aW9ue0NvbnRleHQgb2JqZWN0cyBcbGFiZWx7b3BlbnNzbC1jb250ZXh0fX0KKworQ29udGV4dCBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorCitcYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17Y2hlY2tfcHJpdmF0ZWtleX17fQorQ2hlY2sgaWYgdGhlIHByaXZhdGUga2V5IChsb2FkZWQgd2l0aCBcbWV0aG9ke3VzZV9wcml2YXRla2V5XG9wdGlvbmFse19maWxlfX0pCittYXRjaGVzIHRoZSBjZXJ0aWZpY2F0ZSAobG9hZGVkIHdpdGggXG1ldGhvZHt1c2VfY2VydGlmaWNhdGVcb3B0aW9uYWx7X2ZpbGV9fSkuCitSZXR1cm5zIHRydWUgaWYgdGhleSBtYXRjaCwgZmFsc2Ugb3RoZXJ3aXNlLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17Z2V0X2FwcF9kYXRhfXt9CitSZXRyaWV2ZSBhcHBsaWNhdGlvbiBkYXRhIGFzIHNldCBieSBcbWV0aG9ke3NldF9hcHBfZGF0YX0uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtnZXRfY2VydF9zdG9yZX17fQorUmV0cmlldmUgdGhlIGNlcnRpZmljYXRlIHN0b3JlIChhIFg1MDlTdG9yZSBvYmplY3QpIHRoYXQgdGhlIGNvbnRleHQgdXNlcy4KK1RoaXMgY2FuIGJlIHVzZWQgdG8gYWRkICJ0cnVzdGVkIiBjZXJ0aWZpY2F0ZXMgd2l0aG91dCB1c2luZyB0aGUuCitcbWV0aG9ke2xvYWRfdmVyaWZ5X2xvY2F0aW9ucygpfSBtZXRob2QuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtnZXRfdGltZW91dH17fQorUmV0cmlldmUgc2Vzc2lvbiB0aW1lb3V0LCBhcyBzZXQgYnkgXG1ldGhvZHtzZXRfdGltZW91dH0uIFRoZSBkZWZhdWx0IGlzIDMwMAorc2Vjb25kcy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde2dldF92ZXJpZnlfZGVwdGh9e30KK1JldHJpZXZlIHRoZSBDb250ZXh0IG9iamVjdCdzIHZlcmlmeSBkZXB0aCwgYXMgc2V0IGJ5CitcbWV0aG9ke3NldF92ZXJpZnlfZGVwdGh9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17Z2V0X3ZlcmlmeV9tb2RlfXt9CitSZXRyaWV2ZSB0aGUgQ29udGV4dCBvYmplY3QncyB2ZXJpZnkgbW9kZSwgYXMgc2V0IGJ5IFxtZXRob2R7c2V0X3ZlcmlmeV9tb2RlfS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde2xvYWRfY2xpZW50X2NhfXtwZW1maWxlfQorUmVhZCBhIGZpbGUgd2l0aCBQRU0tZm9ybWF0dGVkIGNlcnRpZmljYXRlcyB0aGF0IHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50Cit3aGVuIHJlcXVlc3RpbmcgYSBjbGllbnQgY2VydGlmaWNhdGUuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtsb2FkX3ZlcmlmeV9sb2NhdGlvbnN9e3BlbWZpbGV9CitTcGVjaWZ5IHdoZXJlIENBIGNlcnRpZmljYXRlcyBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzIGFyZSBsb2NhdGVkLiBUaGVzZSBhcmUKK3RydXN0ZWQgY2VydGlmaWNhdGVzLiBOb3RlIHRoYXQgdGhlIGNlcnRpZmljYXRlcyBoYXZlIHRvIGJlIGluIFBFTSBmb3JtYXQuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtsb2FkX3RtcF9kaH17ZGhmaWxlfQorTG9hZCBwYXJhbWV0ZXJzIGZvciBFcGhlbWVyYWwgRGlmZmllLUhlbGxtYW4gZnJvbSBcdmFye2RoZmlsZX0uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtzZXRfYXBwX2RhdGF9e2RhdGF9CitBc3NvY2lhdGUgXHZhcntkYXRhfSB3aXRoIHRoaXMgQ29udGV4dCBvYmplY3QuIFx2YXJ7ZGF0YX0gY2FuIGJlIHJldHJpZXZlZAorbGF0ZXIgdXNpbmcgdGhlIFxtZXRob2R7Z2V0X2FwcF9kYXRhfSBtZXRob2QuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtzZXRfY2lwaGVyX2xpc3R9e2NpcGhlcnN9CitTZXQgdGhlIGxpc3Qgb2YgY2lwaGVycyB0byBiZSB1c2VkIGluIHRoaXMgY29udGV4dC4gU2VlIHRoZSBPcGVuU1NMIG1hbnVhbCBmb3IKK21vcmUgaW5mb3JtYXRpb24gKGUuZy4gY2lwaGVycygxKSkKK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde3NldF9pbmZvX2NhbGxiYWNrfXtjYWxsYmFja30KK1NldCB0aGUgaW5mb3JtYXRpb24gY2FsbGJhY2sgdG8gXHZhcntjYWxsYmFja30uIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKK2Zyb20gdGltZSB0byB0aW1lIGR1cmluZyBTU0wgaGFuZHNoYWtlcy4KKworXHZhcntjYWxsYmFja30gc2hvdWxkIHRha2UgdGhyZWUgYXJndW1lbnRzOiBhIENvbm5lY3Rpb24gb2JqZWN0IGFuZCB0d28KK2ludGVnZXJzLiBUaGUgZmlyc3QgaW50ZWdlciBzcGVjaWZpZXMgd2hlcmUgaW4gdGhlIFNTTCBoYW5kc2hha2UgdGhlIGZ1bmN0aW9uCit3YXMgY2FsbGVkLCBhbmQgdGhlIG90aGVyIHRoZSByZXR1cm4gY29kZSBmcm9tIGEgKHBvc3NpYmx5IGZhaWxlZCkgaW50ZXJuYWwKK2Z1bmN0aW9uIGNhbGwuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtzZXRfb3B0aW9uc317b3B0aW9uc30KK0FkZCBTU0wgb3B0aW9ucy4gT3B0aW9ucyB5b3UgaGF2ZSBzZXQgYmVmb3JlIGFyZSBub3QgY2xlYXJlZCEKKworVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgd2l0aCB0aGUgXGNvbnN0YW50e09QXyp9IGNvbnN0YW50cy4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde3NldF9wYXNzd2RfY2J9e2NhbGxiYWNrXG9wdGlvbmFseywgdXNlcmRhdGF9fQorU2V0IHRoZSBwYXNzcGhyYXNlIGNhbGxiYWNrIHRvIFx2YXJ7Y2FsbGJhY2t9LiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCit3aGVuIGEgcHJpdmF0ZSBrZXkgd2l0aCBhIHBhc3NwaHJhc2UgaXMgbG9hZGVkLgorCitcdmFye2NhbGxiYWNrfSBzaG91bGQgdGFrZSBhIGJvb2xlYW4gYXJndW1lbnQgXHZhcntyZXBlYXR9IGFuZCBhbiBhcmJpdHJhcnkKK2FyZ3VtZW50IFx2YXJ7ZGF0YX0gYW5kIHJldHVybiB0aGUgcGFzc3BocmFzZSBlbnRlcmVkIGJ5IHRoZSB1c2VyLiBJZgorXHZhcntyZXBlYXR9IGlzIHRydWUgdGhlbiBcdmFye2NhbGxiYWNrfSBzaG91bGQgYXNrIGZvciB0aGUgcGFzc3BocmFzZSB0d2ljZQorYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSB0d28gZW50cmllcyBhcmUgZXF1YWwuIFRoZSBcdmFye2RhdGF9IGFyZ3VtZW50IGlzIHRoZQorXHZhcnt1c2VyZGF0YX0gdmFyaWFibGUgcGFzc2VkIHRvIHRoZSBcbWV0aG9ke3NldF9wYXNzd2RfY2J9IG1ldGhvZC4gSWYgYW4KK2Vycm9yIG9jY3VycywgXHZhcntjYWxsYmFja30gc2hvdWxkIHJldHVybiBhIGZhbHNlIHZhbHVlIChlLmcuIGFuIGVtcHR5CitzdHJpbmcpLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17c2V0X3Nlc3Npb25faWR9e25hbWV9CitTZXQgdGhlIGNvbnRleHQgXHZhcntuYW1lfSB3aXRoaW4gd2hpY2ggYSBzZXNzaW9uIGNhbiBiZSByZXVzZWQgZm9yIHRoaXMKK0NvbnRleHQgb2JqZWN0LiBUaGlzIGlzIG5lZWRlZCB3aGVuIGRvaW5nIHNlc3Npb24gcmVzdW1wdGlvbiwgYmVjYXVzZSB0aGVyZSBpcworbm8gd2F5IGZvciBhIHN0b3JlZCBzZXNzaW9uIHRvIGtub3cgd2hpY2ggQ29udGV4dCBvYmplY3QgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLgorXHZhcntuYW1lfSBtYXkgYmUgYW55IGJpbmFyeSBkYXRhLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17c2V0X3RpbWVvdXR9e3RpbWVvdXR9CitTZXQgdGhlIHRpbWVvdXQgZm9yIG5ld2x5IGNyZWF0ZWQgc2Vzc2lvbnMgZm9yIHRoaXMgQ29udGV4dCBvYmplY3QgdG8KK1x2YXJ7dGltZW91dH0uIFx2YXJ7dGltZW91dH0gbXVzdCBiZSBnaXZlbiBpbiAod2hvbGUpIHNlY29uZHMuIFRoZSBkZWZhdWx0Cit2YWx1ZSBpcyAzMDAgc2Vjb25kcy4gU2VlIHRoZSBPcGVuU1NMIG1hbnVhbCBmb3IgbW9yZSBpbmZvcm1hdGlvbiAoZS5nLgorU1NMX0NUWF9zZXRfdGltZW91dCgzKSkuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXtzZXRfdmVyaWZ5fXttb2RlLCBjYWxsYmFja30KK1NldCB0aGUgdmVyaWZpY2F0aW9uIGZsYWdzIGZvciB0aGlzIENvbnRleHQgb2JqZWN0IHRvIFx2YXJ7bW9kZX0gYW5kIHNwZWNpZnkKK3RoYXQgXHZhcntjYWxsYmFja30gc2hvdWxkIGJlIHVzZWQgZm9yIHZlcmlmaWNhdGlvbiBjYWxsYmFja3MuIFx2YXJ7bW9kZX0KK3Nob3VsZCBiZSBvbmUgb2YgXGNvbnN0YW50e1ZFUklGWV9OT05FfSBhbmQgXGNvbnN0YW50e1ZFUklGWV9QRUVSfS4gSWYKK1xjb25zdGFudHtWRVJJRllfUEVFUn0gaXMgdXNlZCwgXHZhcnttb2RlfSBjYW4gYmUgT1I6ZWQgd2l0aAorXGNvbnN0YW50e1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVH0gYW5kIFxjb25zdGFudHtWRVJJRllfQ0xJRU5UX09OQ0V9IHRvCitmdXJ0aGVyIGNvbnRyb2wgdGhlIGJlaGF2aW91ci4KKworXHZhcntjYWxsYmFja30gc2hvdWxkIHRha2UgZml2ZSBhcmd1bWVudHM6IEEgQ29ubmVjdGlvbiBvYmplY3QsIGFuIFg1MDkgb2JqZWN0LAorYW5kIHRocmVlIGludGVnZXIgdmFyaWFibGVzLCB3aGljaCBhcmUgaW4gdHVybiBwb3RlbnRpYWwgZXJyb3IgbnVtYmVyLCBlcnJvcgorZGVwdGggYW5kIHJldHVybiBjb2RlLiBcdmFye2NhbGxiYWNrfSBzaG91bGQgcmV0dXJuIHRydWUgaWYgdmVyaWZpY2F0aW9uIHBhc3NlcworYW5kIGZhbHNlIG90aGVyd2lzZS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde3NldF92ZXJpZnlfZGVwdGh9e2RlcHRofQorU2V0IHRoZSBtYXhpbXVtIGRlcHRoIGZvciB0aGUgY2VydGlmaWNhdGUgY2hhaW4gdmVyaWZpY2F0aW9uIHRoYXQgc2hhbGwgYmUKK2FsbG93ZWQgZm9yIHRoaXMgQ29udGV4dCBvYmplY3QuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXt1c2VfY2VydGlmaWNhdGV9e2NlcnR9CitVc2UgdGhlIGNlcnRpZmljYXRlIFx2YXJ7Y2VydH0gd2hpY2ggaGFzIHRvIGJlIGEgWDUwOSBvYmplY3QuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb250ZXh0XXt1c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZX17ZmlsZX0KK0xvYWQgYSBjZXJ0aWZpY2F0ZSBjaGFpbiBmcm9tIFx2YXJ7ZmlsZX0gd2hpY2ggbXVzdCBiZSBQRU0gZW5jb2RlZC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0NvbnRleHRde3VzZV9wcml2YXRla2V5fXtwa2V5fQorVXNlIHRoZSBwcml2YXRlIGtleSBcdmFye3BrZXl9IHdoaWNoIGhhcyB0byBiZSBhIFBLZXkgb2JqZWN0LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17dXNlX2NlcnRpZmljYXRlX2ZpbGV9e2ZpbGVcb3B0aW9uYWx7LCBmb3JtYXR9fQorTG9hZCB0aGUgZmlyc3QgY2VydGlmaWNhdGUgZm91bmQgaW4gXHZhcntmaWxlfS4gVGhlIGNlcnRpZmljYXRlIG11c3QgYmUgaW4gdGhlCitmb3JtYXQgc3BlY2lmaWVkIGJ5IFx2YXJ7Zm9ybWF0fSwgd2hpY2ggaXMgZWl0aGVyIFxjb25zdGFudHtGSUxFVFlQRV9QRU19IG9yCitcY29uc3RhbnR7RklMRVRZUEVfQVNOMX0uIFRoZSBkZWZhdWx0IGlzIFxjb25zdGFudHtGSUxFVFlQRV9QRU19LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bQ29udGV4dF17dXNlX3ByaXZhdGVrZXlfZmlsZX17ZmlsZVxvcHRpb25hbHssIGZvcm1hdH19CitMb2FkIHRoZSBmaXJzdCBwcml2YXRlIGtleSBmb3VuZCBpbiBcdmFye2ZpbGV9LiBUaGUgcHJpdmF0ZSBrZXkgbXVzdCBiZSBpbiB0aGUKK2Zvcm1hdCBzcGVjaWZpZWQgYnkgXHZhcntmb3JtYXR9LCB3aGljaCBpcyBlaXRoZXIgXGNvbnN0YW50e0ZJTEVUWVBFX1BFTX0gb3IKK1xjb25zdGFudHtGSUxFVFlQRV9BU04xfS4gVGhlIGRlZmF1bHQgaXMgXGNvbnN0YW50e0ZJTEVUWVBFX1BFTX0uCitcZW5ke21ldGhvZGRlc2N9CisKKworXHN1YnN1YnNlY3Rpb257Q29ubmVjdGlvbiBvYmplY3RzIFxsYWJlbHtvcGVuc3NsLWNvbm5lY3Rpb259fQorCitDb25uZWN0aW9uIG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXthY2NlcHR9e30KK0NhbGwgdGhlIFxtZXRob2R7YWNjZXB0fSBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0IGFuZCBzZXQgdXAgU1NMIG9uIHRoZQorcmV0dXJuZWQgc29ja2V0LCB1c2luZyB0aGUgQ29udGV4dCBvYmplY3Qgc3VwcGxpZWQgdG8gdGhpcyBDb25uZWN0aW9uIG9iamVjdCBhdAorY3JlYXRpb24uIFJldHVybnMgYSBwYWlyIFxjb2RleyhcdmFye2Nvbm59LCBcdmFye2FkZHJlc3N9KX0uIHdoZXJlIFx2YXJ7Y29ubn0KK2lzIHRoZSBuZXcgQ29ubmVjdGlvbiBvYmplY3QgY3JlYXRlZCwgYW5kIFx2YXJ7YWRkcmVzc30gaXMgYXMgcmV0dXJuZWQgYnkgdGhlCitzb2NrZXQncyBcbWV0aG9ke2FjY2VwdH0uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtiaW5kfXthZGRyZXNzfQorQ2FsbCB0aGUgXG1ldGhvZHtiaW5kfSBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17Y2xvc2V9e30KK0NhbGwgdGhlIFxtZXRob2R7Y2xvc2V9IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuIE5vdGU6IElmIHlvdSB3YW50Citjb3JyZWN0IFNTTCBjbG9zdXJlLCB5b3UgbmVlZCB0byBjYWxsIHRoZSBcbWV0aG9ke3NodXRkb3dufSBtZXRob2QgZmlyc3QuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtjb25uZWN0fXthZGRyZXNzfQorQ2FsbCB0aGUgXG1ldGhvZHtjb25uZWN0fSBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0IGFuZCBzZXQgdXAgU1NMIG9uIHRoZQorc29ja2V0LCB1c2luZyB0aGUgQ29udGV4dCBvYmplY3Qgc3VwcGxpZWQgdG8gdGhpcyBDb25uZWN0aW9uIG9iamVjdCBhdAorY3JlYXRpb24uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtjb25uZWN0X2V4fXthZGRyZXNzfQorQ2FsbCB0aGUgXG1ldGhvZHtjb25uZWN0X2V4fSBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0IGFuZCBzZXQgdXAgU1NMIG9uCit0aGUgc29ja2V0LCB1c2luZyB0aGUgQ29udGV4dCBvYmplY3Qgc3VwcGxpZWQgdG8gdGhpcyBDb25uZWN0aW9uIG9iamVjdCBhdAorY3JlYXRpb24uIE5vdGUgdGhhdCBpZiB0aGUgXG1ldGhvZHtjb25uZWN0X2V4fSBtZXRob2Qgb2YgdGhlIHNvY2tldCBkb2Vzbid0CityZXR1cm4gMCwgU1NMIHdvbid0IGJlIGluaXRpYWxpemVkLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17ZG9faGFuZHNoYWtlfXt9CitQZXJmb3JtIGFuIFNTTCBoYW5kc2hha2UgKHVzdWFsbHkgY2FsbGVkIGFmdGVyIFxtZXRob2R7cmVuZWdvdGlhdGV9IG9yIG9uZSBvZgorXG1ldGhvZHtzZXRfYWNjZXB0X3N0YXRlfSBvciBcbWV0aG9ke3NldF9hY2NlcHRfc3RhdGV9KS4gVGhpcyBjYW4gcmFpc2UgdGhlCitzYW1lIGV4Y2VwdGlvbnMgYXMgXG1ldGhvZHtzZW5kfSBhbmQgXG1ldGhvZHtyZWN2fS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2ZpbGVub317fQorUmV0cmlldmUgdGhlIGZpbGUgZGVzY3JpcHRvciBudW1iZXIgZm9yIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2xpc3Rlbn17YmFja2xvZ30KK0NhbGwgdGhlIFxtZXRob2R7bGlzdGVufSBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17Z2V0X2FwcF9kYXRhfXt9CitSZXRyaWV2ZSBhcHBsaWNhdGlvbiBkYXRhIGFzIHNldCBieSBcbWV0aG9ke3NldF9hcHBfZGF0YX0uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtnZXRfY2lwaGVyX2xpc3R9e30KK1JldHJpZXZlIHRoZSBsaXN0IG9mIGNpcGhlcnMgdXNlZCBieSB0aGUgQ29ubmVjdGlvbiBvYmplY3QuIFdBUk5JTkc6IFRoaXMgQVBJCitoYXMgY2hhbmdlZC4gSXQgdXNlZCB0byB0YWtlIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBhbmQganVzdCByZXR1cm4gYSBzdHJpbmcsCitidXQgbm90IGl0IHJldHVybnMgdGhlIGVudGlyZSBsaXN0IGluIG9uZSBnby4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2dldF9jb250ZXh0fXt9CitSZXRyaWV2ZSB0aGUgQ29udGV4dCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29ubmVjdGlvbi4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2dldF9wZWVyX2NlcnRpZmljYXRlfXt9CitSZXRyaWV2ZSB0aGUgb3RoZXIgc2lkZSdzIGNlcnRpZmljYXRlIChpZiBhbnkpCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtnZXRwZWVybmFtZX17fQorQ2FsbCB0aGUgXG1ldGhvZHtnZXRwZWVybmFtZX0gbWV0aG9kIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de2dldHNvY2tuYW1lfXt9CitDYWxsIHRoZSBcbWV0aG9ke2dldHNvY2tuYW1lfSBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17Z2V0c29ja29wdH17bGV2ZWwsIG9wdG5hbWVcb3B0aW9uYWx7LCBidWZsZW59fQorQ2FsbCB0aGUgXG1ldGhvZHtnZXRzb2Nrb3B0fSBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17cGVuZGluZ317fQorUmV0cmlldmUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSBzYWZlbHkgcmVhZCBmcm9tIHRoZSBTU0wgYnVmZmVyLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17cmVjdn17YnVmc2l6ZX0KK1JlY2VpdmUgZGF0YSBmcm9tIHRoZSBDb25uZWN0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUKK2RhdGEgcmVjZWl2ZWQuIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkIGF0IG9uY2UsIGlzIHNwZWNpZmllZAorYnkgXHZhcntidWZzaXplfS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de3JlbmVnb3RpYXRlfXt9CitSZW5lZ290aWF0ZSB0aGUgU1NMIHNlc3Npb24uIENhbGwgdGhpcyBpZiB5b3Ugd2lzaCB0byBjaGFuZ2UgY2lwaGVyIHN1aXRlcyBvcgorYW55dGhpbmcgbGlrZSB0aGF0LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17c2VuZH17c3RyaW5nfQorU2VuZCB0aGUgXHZhcntzdHJpbmd9IGRhdGEgdG8gdGhlIENvbm5lY3Rpb24uCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtzZW5kYWxsfXtzdHJpbmd9CitTZW5kIGFsbCBvZiB0aGUgXHZhcntzdHJpbmd9IGRhdGEgdG8gdGhlIENvbm5lY3Rpb24uIFRoaXMgY2FsbHMgXG1ldGhvZHtzZW5kfQorcmVwZWF0ZWRseSB1bnRpbCBhbGwgZGF0YSBpcyBzZW50LiBJZiBhbiBlcnJvciBvY2N1cnMsIGl0J3MgaW1wb3NzaWJsZSB0byB0ZWxsCitob3cgbXVjaCBkYXRhIGhhcyBiZWVuIHNlbnQuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfVtDb25uZWN0aW9uXXtzZXRfYWNjZXB0X3N0YXRlfXt9CitTZXQgdGhlIGNvbm5lY3Rpb24gdG8gd29yayBpbiBzZXJ2ZXIgbW9kZS4gVGhlIGhhbmRzaGFrZSB3aWxsIGJlIGhhbmRsZWQKK2F1dG9tYXRpY2FsbHkgYnkgcmVhZC93cml0ZS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de3NldF9hcHBfZGF0YX17ZGF0YX0KK0Fzc29jaWF0ZSBcdmFye2RhdGF9IHdpdGggdGhpcyBDb25uZWN0aW9uIG9iamVjdC4gXHZhcntkYXRhfSBjYW4gYmUgcmV0cmlldmVkCitsYXRlciB1c2luZyB0aGUgXG1ldGhvZHtnZXRfYXBwX2RhdGF9IG1ldGhvZC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de3NldF9jb25uZWN0X3N0YXRlfXt9CitTZXQgdGhlIGNvbm5lY3Rpb24gdG8gd29yayBpbiBjbGllbnQgbW9kZS4gVGhlIGhhbmRzaGFrZSB3aWxsIGJlIGhhbmRsZWQKK2F1dG9tYXRpY2FsbHkgYnkgcmVhZC93cml0ZS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de3NldGJsb2NraW5nfXtmbGFnfQorQ2FsbCB0aGUgXG1ldGhvZHtzZXRibG9ja2luZ30gbWV0aG9kIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de3NldHNvY2tvcHR9e2xldmVsLCBvcHRuYW1lLCB2YWx1ZX0KK0NhbGwgdGhlIFxtZXRob2R7c2V0c29ja29wdH0gbWV0aG9kIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de3NodXRkb3dufXt9CitTZW5kIHRoZSBzaHV0ZG93biBtZXNzYWdlIHRvIHRoZSBDb25uZWN0aW9uLiBSZXR1cm5zIHRydWUgaWYgdGhlIHNodXRkb3duCittZXNzYWdlIGV4Y2hhbmdlIGlzIGNvbXBsZXRlZCBhbmQgZmFsc2Ugb3RoZXJ3aXNlIChpbiB3aGljaCBjYXNlIHlvdSBjYWxsCitcbWV0aG9ke3JlY3YoKX0gb3IgXG1ldGhvZHtzZW5kKCl9IHdoZW4gdGhlIGNvbm5lY3Rpb24gYmVjb21lcworcmVhZGFibGUvd3JpdGVhYmxlLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17c29ja19zaHV0ZG93bn17aG93fQorQ2FsbCB0aGUgXG1ldGhvZHtzaHV0ZG93bn0gbWV0aG9kIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9W0Nvbm5lY3Rpb25de3N0YXRlX3N0cmluZ317fQorUmV0cmlldmUgYSB2ZXJib3NlIHN0cmluZyBkZXRhaWxpbmcgdGhlIHN0YXRlIG9mIHRoZSBDb25uZWN0aW9uLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17d2FudF9yZWFkfXt9CitDaGVja3MgaWYgbW9yZSBkYXRhIGhhcyB0byBiZSByZWFkIGZyb20gdGhlIHRyYW5zcG9ydCBsYXllciB0byBjb21wbGV0ZSBhbgorb3BlcmF0aW9uLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bQ29ubmVjdGlvbl17d2FudF93cml0ZX17fQorQ2hlY2tzIGlmIHRoZXJlIGlzIGRhdGEgdG8gd3JpdGUgdG8gdGhlIHRyYW5zcG9ydCBsYXllciB0byBjb21wbGV0ZSBhbgorb3BlcmF0aW9uLgorXGVuZHttZXRob2RkZXNjfQorCisKKworXHNlY3Rpb257SW50ZXJuYWxzIFxsYWJlbHtpbnRlcm5hbHN9fQorCitXZSByYW4gaW50byB0aHJlZSBtYWluIHByb2JsZW1zIGRldmVsb3BpbmcgdGhpczogRXhjZXB0aW9ucywgY2FsbGJhY2tzIGFuZAorYWNjZXNzaW5nIHNvY2tldCBtZXRob2RzLiBUaGlzIGlzIHdoYXQgdGhpcyBjaGFwdGVyIGlzIGFib3V0LgorCitcc3Vic2VjdGlvbntFeGNlcHRpb25zIFxsYWJlbHtleGNlcHRpb25zfX0KKworV2UgcmVhbGl6ZWQgZWFybHkgdGhhdCBtb3N0IG9mIHRoZSBleGNlcHRpb25zIHdvdWxkIGJlIHJhaXNlZCBieSB0aGUgSS9PCitmdW5jdGlvbnMgb2YgT3BlblNTTCwgc28gaXQgZmVsdCBuYXR1cmFsIHRvIG1pbWljIE9wZW5TU0wncyBlcnJvciBjb2RlIHN5c3RlbSwKK3RyYW5zbGF0aW5nIHRoZW0gaW50byBQeXRob24gZXhjZXB0aW9ucy4gVGhpcyBuYXR1cmFsbHkgZ2l2ZXMgdXMgdGhlIGV4Y2VwdGlvbnMKK1xleGNlcHRpb257U1NMLlplcm9SZXR1cm5FcnJvcn0sIFxleGNlcHRpb257U1NMLldhbnRSZWFkRXJyb3J9LAorXGV4Y2VwdGlvbntTU0wuV2FudFdyaXRlRXJyb3J9LCBcZXhjZXB0aW9ue1NTTC5XYW50WDUwOUxvb2t1cEVycm9yfSBhbmQKK1xleGNlcHRpb257U1NMLlN5c0NhbGxFcnJvcn0uCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMsIHNlZSBzZWN0aW9uIFxyZWZ7b3BlbnNzbC1zc2x9LgorCisKK1xzdWJzZWN0aW9ue0NhbGxiYWNrcyBcbGFiZWx7Y2FsbGJhY2tzfX0KKworVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHByb2JsZW1zIHdpdGggY2FsbGJhY2tzLiBGaXJzdCBvZiBhbGwsIE9wZW5TU0wgaXMgd3JpdHRlbgorYXMgYSBDIGxpYnJhcnksIGl0J3Mgbm90IG1lYW50IHRvIGhhdmUgUHl0aG9uIGNhbGxiYWNrcywgc28gYSB3YXkgYXJvdW5kIHRoYXQKK2lzIG5lZWRlZC4gQW5vdGhlciBwcm9ibGVtIGlzIHRocmVhZCBzdXBwb3J0LiBBIGxvdCBvZiB0aGUgT3BlblNTTCBJL08KK2Z1bmN0aW9ucyBjYW4gYmxvY2sgaWYgdGhlIHNvY2tldCBpcyBpbiBibG9ja2luZyBtb2RlLCBhbmQgdGhlbiB5b3Ugd2FudCBvdGhlcgorUHl0aG9uIHRocmVhZHMgdG8gYmUgYWJsZSB0byBkbyBvdGhlciB0aGluZ3MuIFRoZSByZWFsIHRyb3VibGUgaXMgaWYgeW91J3ZlCityZWxlYXNlZCB0aGUgdGhyZWFkIGxvY2sgdG8gZG8gYSBwb3RlbnRpYWxseSBibG9ja2luZyBvcGVyYXRpb24sIGFuZCB0aGUKK29wZXJhdGlvbiBjYWxscyBhIGNhbGxiYWNrLiBUaGVuIHdlIG11c3QgdGFrZSB0aGUgdGhyZWFkIGxvY2sgYmFja1xmb290bm90ZXtJJ20KK25vdCBzdXJlIHdoeSB0aGlzIGlzIG5lY2Vzc2FyeSwgYnV0IG90aGVyd2lzZSBJIGdldCBhIHNlZ21lbnRhdGlvbiB2aW9sYXRpb24gb24KK1xjZnVuY3Rpb257UHlFdmFsX0NhbGxPYmplY3R9fS4KKworVGhlcmUgYXJlIHR3byBzb2x1dGlvbnMgdG8gdGhlIGZpcnN0IHByb2JsZW0sIGJvdGggb2Ygd2hpY2ggYXJlIG5lY2Vzc2FyeS4gVGhlCitmaXJzdCBzb2x1dGlvbiB0byB1c2UgaXMgaWYgdGhlIEMgY2FsbGJhY2sgYWxsb3dzICcndXNlcmRhdGEnJyB0byBiZSBwYXNzZWQgdG8KK2l0IChhbiBhcmJpdHJhcnkgcG9pbnRlciBub3JtYWxseSkuIFRoaXMgaXMgZ3JlYXQhIFdlIGNhbiBzZXQgb3VyIFB5dGhvbgorZnVuY3Rpb24gb2JqZWN0IGFzIHRoZSByZWFsIHVzZXJkYXRhIGFuZCBlbXVsYXRlIHVzZXJkYXRhIGZvciB0aGUgUHl0aG9uCitmdW5jdGlvbiBpbiBhbm90aGVyIHdheS4gVGhlIG90aGVyIHNvbHV0aW9uIGNhbiBiZSB1c2VkIGlmIGFuIG9iamVjdCB3aXRoIGFuCisnJ2FwcF9kYXRhJycgc3lzdGVtIGFsd2F5cyBpcyBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLiBGb3IgZXhhbXBsZSwgdGhlIFNTTAorb2JqZWN0IGluIE9wZW5TU0wgaGFzIGFwcF9kYXRhIGZ1bmN0aW9ucyBhbmQgaW4gZS5nLiB0aGUgdmVyaWZpY2F0aW9uCitjYWxsYmFja3MsIHlvdSBjYW4gcmV0cmlldmUgdGhlIHJlbGF0ZWQgU1NMIG9iamVjdC4gV2hhdCB3ZSBkbyBpcyB0byBzZXQgb3VyCit3cmFwcGVyIFxjbGFzc3tDb25uZWN0aW9ufSBvYmplY3QgYXMgYXBwX2RhdGEgZm9yIHRoZSBTU0wgb2JqZWN0LCBhbmQgd2UgY2FuCitlYXNpbHkgZmluZCB0aGUgUHl0aG9uIGNhbGxiYWNrLgorCitUaGUgb3RoZXIgcHJvYmxlbSBpcyBhbHNvIHBhcnRpYWxseSBzb2x2ZWQgYnkgYXBwX2RhdGEuIFNpbmNlIHdlJ3JlIGFzc29jaWF0aW5nCitvdXIgd3JhcHBlciBvYmplY3RzIHdpdGggdGhlICcncmVhbCcnIG9iamVjdHMsIHdlIGNhbiBlYXNpbHkgYWNjZXNzIGRhdGEgZnJvbQordGhlIFxjbGFzc3tDb25uZWN0aW9ufSBvYmplY3QuIFRoZSBzb2x1dGlvbiB0aGVuIGlzIHRvIHNpbXBseSBpbmNsdWRlIGEKK1xjdHlwZXtQeVRocmVhZFN0YXRlfSB2YXJpYWJsZSBpbiB0aGUgXGNsYXNze0Nvbm5lY3Rpb259IGRlY2xhcmF0aW9uLCBhbmQgd3JpdGUKK21hY3JvcyBzaW1pbGFyIHRvIFxjZnVuY3Rpb257UHlfQkVHSU5fQUxMT1dfVEhSRUFEU30gYW5kCitcY2Z1bmN0aW9ue1B5X0VORF9BTExPV19USFJFQURTfSB0aGF0IGFsbG93cyBzcGVjaWZ5aW5nIG9mIHRoZQorXGN0eXBle1B5VGhyZWFkU3RhdGV9IHZhcmlhYmxlIHRvIHVzZS4gTm93IHdlIGNhbiBzaW1wbHkgJydiZWdpbiBhbGxvdwordGhyZWFkcycnIGJlZm9yZSBhIHBvdGVudGlhbGx5IGJsb2NraW5nIG9wZXJhdGlvbiwgYW5kICcnZW5kIGFsbG93IHRocmVhZHMnJworYmVmb3JlIGNhbGxpbmcgYSBjYWxsYmFjay4KKworCitcc3Vic2VjdGlvbntBY2Vzc2luZyBTb2NrZXQgTWV0aG9kcyBcbGFiZWx7c29ja2V0LW1ldGhvZHN9fQorCitXZSBxdWlja2x5IHNhdyB0aGUgYmVuZWZpdCBvZiB3cmFwcGluZyBzb2NrZXQgbWV0aG9kcyBpbiB0aGUKK1xjbGFzc3tTU0wuQ29ubmVjdGlvbn0gY2xhc3MsIGZvciBhbiBlYXN5IHRyYW5zaXRpb24gaW50byB1c2luZyBTU0wuIFRoZQorcHJvYmxlbSBoZXJlIGlzIHRoYXQgdGhlIFxtb2R1bGV7c29ja2V0fSBtb2R1bGUgbGFja3MgYSBDIEFQSSwgYW5kIGFsbCB0aGUKK21ldGhvZHMgYXJlIGRlY2xhcmVkIHN0YXRpYy4gT25lIGFwcHJvYWNoIHdvdWxkIGJlIHRvIGhhdmUgXG1vZHVsZXtPcGVuU1NMfSBhcworYSBzdWJtb2R1bGUgdG8gdGhlIFxtb2R1bGV7c29ja2V0fSBtb2R1bGUsIHBsYWNpbmcgYWxsIHRoZSBjb2RlIGluCitcZmlsZXtzb2NrZXRtb2R1bGUuY30sIGJ1dCB0aGlzIGlzIG9idmlvdXNseSBub3QgYSBnb29kIHNvbHV0aW9uLCBzaW5jZSB5b3UKK21pZ2h0IG5vdCB3YW50IHRvIGltcG9ydCB0b25uZXMgb2YgZXh0cmEgc3R1ZmYgeW91J3JlIG5vdCBnb2luZyB0byB1c2Ugd2hlbgoraW1wb3J0aW5nIHRoZSBcbW9kdWxle3NvY2tldH0gbW9kdWxlLiBUaGUgb3RoZXIgYXBwcm9hY2ggaXMgdG8gc29tZWhvdyBnZXQgYQorcG9pbnRlciB0byB0aGUgbWV0aG9kIHRvIGJlIGNhbGxlZCwgZWl0aGVyIHRoZSBDIGZ1bmN0aW9uLCBvciBhIGNhbGxhYmxlIFB5dGhvbgorb2JqZWN0LiBUaGlzIGlzIG5vdCByZWFsbHkgYSBnb29kIHNvbHV0aW9uIGVpdGhlciwgc2luY2UgdGhlcmUncyBhIGxvdCBvZgorbG9va3VwcyBpbnZvbHZlZC4KKworVGhlIHdheSBpdCB3b3JrcyBpcyB0aGF0IHlvdSBoYXZlIHRvIHN1cHBseSBhIGBgXGNsYXNze3NvY2tldH0tbGlrZScnIHRyYW5zcG9ydAorb2JqZWN0IHRvIHRoZSBcY2xhc3N7U1NMLkNvbm5lY3Rpb259LiBUaGUgb25seSByZXF1aXJlbWVudCBvZiB0aGlzIG9iamVjdCBpcwordGhhdCBpdCBoYXMgYSBcbWV0aG9ke2ZpbGVubygpfSBtZXRob2QgdGhhdCByZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIHRoYXQncwordmFsaWQgYXQgdGhlIEMgbGV2ZWwgKGkuZS4geW91IGNhbiB1c2UgdGhlIHN5c3RlbSBjYWxscyByZWFkIGFuZCB3cml0ZSkuIElmIHlvdQord2FudCB0byB1c2UgdGhlIFxtZXRob2R7Y29ubmVjdCgpfSBvciBcbWV0aG9ke2FjY2VwdCgpfSBtZXRob2RzIG9mIHRoZQorXGNsYXNze1NTTC5Db25uZWN0aW9ufSBvYmplY3QsIHRoZSB0cmFuc3BvcnQgb2JqZWN0IGhhcyB0byBzdXBwbHkgc3VjaAorbWV0aG9kcyB0b28uIEFwYXJ0IGZyb20gdGhlbSwgYW55IG1ldGhvZCBsb29rdXBzIGluIHRoZSBcY2xhc3N7U1NMLkNvbm5lY3Rpb259CitvYmplY3QgdGhhdCBmYWlsIGFyZSBwYXNzZWQgb24gdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IG9iamVjdC4KKworRnV0dXJlIGNoYW5nZXMgbWlnaHQgYmUgdG8gYWxsb3cgUHl0aG9uLWxldmVsIHRyYW5zcG9ydCBvYmplY3RzLCB0aGF0IGluc3RlYWQKK29mIGhhdmluZyBcbWV0aG9ke2ZpbGVubygpfSBtZXRob2RzLCBoYXZlIFxtZXRob2R7cmVhZCgpfSBhbmQgXG1ldGhvZHt3cml0ZSgpfQorbWV0aG9kcywgc28gbW9yZSBhZHZhbmNlZCBmZWF0dXJlcyBvZiBQeXRob24gY2FuIGJlIHVzZWQuIFRoaXMgd291bGQgcHJvYmFibHkKK2VudGFpbCBzb21lIHNvcnQgb2YgT3BlblNTTCBgYEJJT3MnJywgYnV0IGNvbnZlcnRpbmcgUHl0aG9uIHN0cmluZ3MgYmFjayBhbmQKK2ZvcnRoIGlzIGV4cGVuc2l2ZSwgc28gdGhpcyBzaG91bGRuJ3QgYmUgdXNlZCB1bmxlc3MgbmVjZXNzYXJ5LiBPdGhlciBuaWNlCit0aGluZ3Mgd291bGQgYmUgdG8gYmUgYWJsZSB0byBwYXNzIGluIGRpZmZlcmVudCB0cmFuc3BvcnQgb2JqZWN0cyBmb3IgcmVhZGluZworYW5kIHdyaXRpbmcsIGJ1dCB0aGVuIHRoZSBcbWV0aG9ke2ZpbGVubygpfSBtZXRob2Qgb2YgXGNsYXNze1NTTC5Db25uZWN0aW9ufQorYmVjb21lcyB2aXJ0dWFsbHkgdXNlbGVzcy4gQWxzbywgc2hvdWxkIHRoZSBtZXRob2QgcmVzb2x1dGlvbiBiZSB1c2VkIG9uIHRoZQorcmVhZC10cmFuc3BvcnQgb3IgdGhlIHdyaXRlLXRyYW5zcG9ydD8KKworCitcZW5ke2RvY3VtZW50fQpkaWZmIC0tZ2l0IGEvZG9jL3B5T3BlblNTTC50eHQgYi9kb2MvcHlPcGVuU1NMLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmQwZmZhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3B5T3BlblNTTC50eHQKQEAgLTAsMCArMSw5NzAgQEAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgUHl0aG9uIE9wZW5TU0wgTWFudWFsCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5dGhvbiBPcGVuU1NMIE1hbnVhbAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFydGluIFNq9mdyZW4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJ0aW5Ac3RyYWt0LmNvbQorCisgIEFic3RyYWN0OgorCisgICBUaGlzIG1vZHVsZSBpcyBhIHJhdGhlciB0aGluIHdyYXBwZXIgYXJvdW5kIChhIHN1YnNldCBvZikgdGhlIE9wZW5TU0wKKyAgIGxpYnJhcnkuIFdpdGggdGhpbiB3cmFwcGVyIEkgbWVhbiB0aGF0IGEgbG90IG9mIHRoZSBvYmplY3QgbWV0aG9kcyBkbworICAgbm90aGluZyBtb3JlIHRoYW4gY2FsbGluZyBhIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24gaW4gdGhlIE9wZW5TU0wKKyAgIGxpYnJhcnkuCisKK0NvbnRlbnRzCisKKyAgICAgKiAxIEludHJvZHVjdGlvbiAKKyAgICAgKiAyIEJ1aWxkaW5nIGFuZCBJbnN0YWxsaW5nIAorICAgICAgICAgICsgMi4xIEJ1aWxkaW5nIHRoZSBNb2R1bGUgb24gYSBVbml4IFN5c3RlbSAKKyAgICAgICAgICArIDIuMiBCdWlsZGluZyB0aGUgTW9kdWxlIG9uIGEgV2luZG93cyBTeXN0ZW0gCisgICAgICogMyBPcGVuU1NMIC0tIFB5dGhvbiBpbnRlcmZhY2UgdG8gT3BlblNTTCAKKyAgICAgICAgICArIDMuMSBjcnlwdG8gLS0gR2VuZXJpYyBjcnlwdG9ncmFwaGljIG1vZHVsZSAKKyAgICAgICAgICArIDMuMiByYW5kIC0tIEFuIGludGVyZmFjZSB0byB0aGUgT3BlblNTTCBwc2V1ZG8gcmFuZG9tIG51bWJlcgorICAgICAgICAgICAgZ2VuZXJhdG9yIAorICAgICAgICAgICsgMy4zIFNTTCAtLSBBbiBpbnRlcmZhY2UgdG8gdGhlIFNTTC1zcGVjaWZpYyBwYXJ0cyBvZiBPcGVuU1NMIAorICAgICAqIDQgSW50ZXJuYWxzIAorICAgICAgICAgICsgNC4xIEV4Y2VwdGlvbnMgCisgICAgICAgICAgKyA0LjIgQ2FsbGJhY2tzIAorICAgICAgICAgICsgNC4zIEFjZXNzaW5nIFNvY2tldCBNZXRob2RzIAorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBJbnRyb2R1Y3Rpb24KKworICAgVGhlIHJlYXNvbiB0aGlzIG1vZHVsZSBleGlzdHMgYXQgYWxsIGlzIHRoYXQgdGhlIFNTTCBzdXBwb3J0IGluIHRoZQorICAgc29ja2V0IG1vZHVsZSBpbiB0aGUgUHl0aG9uIDIuMSBkaXN0cmlidXRpb24gKHdoaWNoIGlzIHdoYXQgd2UgdXNlZCwKKyAgIG9mIGNvdXJzZSBJIGNhbm5vdCBzcGVhayBmb3IgbGF0ZXIgdmVyc2lvbnMpIGlzIHNldmVyZWx5IGxpbWl0ZWQuCisKKyAgIFdoZW4gYXNraW5nIGFib3V0IFNTTCBvbiB0aGUgY29tcC5sYW5nLnB5dGhvbiBuZXdzZ3JvdXAgKG9yIG9uCisgICBweXRob24tbGlzdEBweXRob24ub3JnKSBwZW9wbGUgdXN1YWxseSBwb2ludGVkIHlvdSB0byB0aGUgTTJDcnlwdG8KKyAgIHBhY2thZ2UuIFRoZSBNMkNyeXB0by5TU0wgbW9kdWxlIGRvZXMgaW1wbGVtZW50IGEgbG90IG9mIE9wZW5TU0wncworICAgZnVuY3Rpb25hbGl0eSBidXQgdW5mb3J0dW5hdGVseSBpdHMgZXJyb3IgaGFuZGxpbmcgc3lzdGVtIGRvZXMgbm90CisgICBzZWVtIHRvIGJlIGZpbmlzaGVkLCBlc3BlY2lhbGx5IGZvciBub24tYmxvY2tpbmcgSS9PLiBJIHRoaW5rIHRoYXQKKyAgIG11Y2ggb2YgdGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IE0yQ3J5cHRvXjEgaXMgZGV2ZWxvcGVkIHVzaW5nCisgICBTV0lHXjIuIFRoaXMgbWFrZXMgaXQgYXdrd2FyZCB0byBjcmVhdGUgZnVuY3Rpb25zIHRoYXQgZS5nLiBjYW4gcmV0dXJuCisgICBib3RoIGFuIGludGVnZXIgYW5kIE5VTEwgc2luY2UgKGFzIGZhciBhcyBJIGtub3cpIHlvdSBiYXNpY2FsbHkgd3JpdGUKKyAgIEMgZnVuY3Rpb25zIGFuZCBTV0lHIG1ha2VzIHdyYXBwZXIgZnVuY3Rpb25zIHRoYXQgcGFyc2VzIHRoZSBQeXRob24KKyAgIGFyZ3VtZW50IGxpc3QgYW5kIGNhbGxzIHlvdXIgQyBmdW5jdGlvbiwgYW5kIGZpbmFsbHkgdHJhbnNmb3JtcyB5b3VyCisgICByZXR1cm4gdmFsdWUgdG8gYSBQeXRob24gb2JqZWN0LgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgQnVpbGRpbmcgYW5kIEluc3RhbGxpbmcKKworICAgVGhlc2UgaW5zdHJ1Y3Rpb25zIGNhbiBhbHNvIGJlIGZvdW5kIGluIHRoZSBmaWxlIElOU1RBTEwuCisKKyAgIEkgaGF2ZSB0ZXN0ZWQgdGhpcyBvbiBEZWJpYW4gTGludXggc3lzdGVtcyAod29vZHkgYW5kIHNpZCksIFNvbGFyaXMKKyAgIDIuNiBhbmQgMi43LiBPdGhlcnMgaGF2ZSBzdWNjZXNzZnVsbHkgY29tcGlsZWQgaXQgb24gV2luZG93cyBhbmQgTlQuCisKKworMi4xIEJ1aWxkaW5nIHRoZSBNb2R1bGUgb24gYSBVbml4IFN5c3RlbQorCisgICBweU9wZW5TU0wgdXNlcyBkaXN0dXRpbHMsIHNvIHRoZXJlIHJlYWxseSBzaG91bGRuJ3QgYmUgYW55IHByb2JsZW1zLgorICAgVG8gYnVpbGQgdGhlIGxpYnJhcnk6CisKK3B5dGhvbiBzZXR1cC5weSBidWlsZAorCisgICBJZiB5b3VyIE9wZW5TU0wgaGVhZGVyIGZpbGVzIGFyZW4ndCBpbiAvdXNyL2luY2x1ZGUsIHlvdSBtYXkgbmVlZCB0bworICAgc3VwcGx5IHRoZSAtSSBmbGFnIHRvIGxldCB0aGUgc2V0dXAgc2NyaXB0IGtub3cgd2hlcmUgdG8gbG9vay4gVGhlCisgICBzYW1lIGdvZXMgZm9yIHRoZSBsaWJyYXJpZXMgb2YgY291cnNlLCB1c2UgdGhlIC1MIGZsYWcuIE5vdGUgdGhhdAorICAgYnVpbGQgd29uJ3QgYWNjZXB0IHRoZXNlIGZsYWdzLCBzbyB5b3UgaGF2ZSB0byBydW4gZmlyc3QgYnVpbGRfZXh0IGFuZAorICAgdGhlbiBidWlsZCEgRXhhbXBsZToKKworcHl0aG9uIHNldHVwLnB5IGJ1aWxkX2V4dCAtSS91c3IvbG9jYWwvc3NsL2luY2x1ZGUgLUwvdXNyL2xvY2FsL3NzbC9saWIKK3B5dGhvbiBzZXR1cC5weSBidWlsZAorCisgICBOb3cgeW91IHNob3VsZCBoYXZlIGEgZGlyZWN0b3J5IGNhbGxlZCBPcGVuU1NMIHRoYXQgY29udGFpbnMgZS5nLgorICAgU1NMLnNvIGFuZCBfX2luaXRfXy5weSBzb21ld2hlcmUgaW4gdGhlIGJ1aWxkIGRpY3JlY3RvcnksIHNvIGp1c3Q6CisKK3B5dGhvbiBzZXR1cC5weSBpbnN0YWxsCisKKyAgIElmIHlvdSwgZm9yIHNvbWUgYXJjYW5lIHJlYXNvbiwgZG9uJ3Qgd2FudCB0aGUgbW9kdWxlIHRvIGFwcGVhciBpbiB0aGUKKyAgIHNpdGUtcGFja2FnZXMgZGlyZWN0b3J5LCB1c2UgdGhlIC0tcHJlZml4IG9wdGlvbi4KKworICAgWW91IGNhbiwgb2YgY291cnNlLCBkbworCitweXRob24gc2V0dXAucHkgLS1oZWxwCisKKyAgIHRvIGZpbmQgb3V0IG1vcmUgYWJvdXQgaG93IHRvIHVzZSB0aGUgc2NyaXB0LgorCisKKzIuMiBCdWlsZGluZyB0aGUgTW9kdWxlIG9uIGEgV2luZG93cyBTeXN0ZW0KKworICAgQmlnIHRoYW5rcyB0byBJdGFtYXIgU2h0dWxsLVRyYXVyaW5nIGFuZCBPbGVnIE9ybG92IGZvciB0aGVpciBoZWxwCisgICB3aXRoIFdpbmRvd3MgYnVpbGQgaW5zdHJ1Y3Rpb25zLiBTYW1lIGFzIGZvciBVbml4IHN5c3RlbXMsIHdlIGhhdmUgdG8KKyAgIHNlcGFyYXRlIHRoZSBidWlsZF9leHQgYW5kIHRoZSBidWlsZC4KKworICAgQnVpbGRpbmcgdGhlIGxpYnJhcnk6CisKK3NldHVwLnB5IGJ1aWxkX2V4dCAtSSAuLi5cb3BlbnNzbFxpbmMzMiAtTCAuLi5cb3BlbnNzbFxvdXQzMmRsbAorc2V0dXAucHkgYnVpbGQKKworICAgV2hlcmUgLi4uXG9wZW5zc2wgaXMgb2YgY291cnNlIHRoZSBsb2NhdGlvbiBvZiB5b3VyIE9wZW5TU0wKKyAgIGluc3RhbGxhdGlvbi4KKworICAgSW5zdGFsbGF0aW9uIGlzIHRoZSBzYW1lIGFzIGZvciBVbml4IHN5c3RlbXM6CisKK3NldHVwLnB5IGluc3RhbGwKKworICAgQW5kIHNpbWlsYXJpbHksIHlvdSBjYW4gZG8KKworc2V0dXAucHkgLS1oZWxwCisKKyAgIHRvIGdldCBtb3JlIGluZm9ybWF0aW9uLgorCisKKyAgICAgICAgICAgICAgICAgICAzIE9wZW5TU0wgLS0gUHl0aG9uIGludGVyZmFjZSB0byBPcGVuU1NMCisKKyAgIFRoaXMgcGFja2FnZSBwcm92aWRlcyBhIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBmdW5jdGlvbnMgaW4gdGhlCisgICBPcGVuU1NMIGxpYnJhcnkuIFRoZSBmb2xsb3dpbmcgbW9kdWxlcyBhcmUgZGVmaW5lZDoKKworICAgY3J5cHRvCisgICAgICAgICAgR2VuZXJpYyBjcnlwdG9ncmFwaGljIG1vZHVsZS4gTm90ZSB0aGF0IGlmIGFueXRoaW5nIGlzCisgICAgICAgICAgaW5jb21wbGV0ZSwgdGhpcyBtb2R1bGUgaXMhCisKKyAgIHJhbmQKKyAgICAgICAgICBBbiBpbnRlcmZhY2UgdG8gdGhlIE9wZW5TU0wgcHNldWRvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorCisgICBTU0wKKyAgICAgICAgICBBbiBpbnRlcmZhY2UgdG8gdGhlIFNTTC1zcGVjaWZpYyBwYXJ0cyBvZiBPcGVuU1NMLgorCisKKzMuMSBjcnlwdG8gLS0gR2VuZXJpYyBjcnlwdG9ncmFwaGljIG1vZHVsZQorCisgICBYNTA5VHlwZQorICAgICAgICAgIEEgUHl0aG9uIHR5cGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgWDUwOSBvYmplY3QgdHlwZS4KKworICAgWDUwOSgpCisgICAgICAgICAgRmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gWDUwOSBvYmplY3QuCisKKyAgIFg1MDlOYW1lVHlwZQorICAgICAgICAgIEEgUHl0aG9uIHR5cGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgWDUwOU5hbWUgb2JqZWN0IHR5cGUuCisKKyAgIFg1MDlOYW1lKHg1MDluYW1lKQorICAgICAgICAgIEZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgY29weSBvZiB4NTA5bmFtZS4KKworICAgWDUwOVJlcVR5cGUKKyAgICAgICAgICBBIFB5dGhvbiB0eXBlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIFg1MDlSZXEgb2JqZWN0IHR5cGUuCisKKyAgIFg1MDlSZXEoKQorICAgICAgICAgIEZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIFg1MDlSZXEgb2JqZWN0LgorCisgICBYNTA5U3RvcmVUeXBlCisgICAgICAgICAgQSBQeXRob24gdHlwZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBYNTA5U3RvcmUgb2JqZWN0IHR5cGUuCisKKyAgIFBLZXlUeXBlCisgICAgICAgICAgQSBQeXRob24gdHlwZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBQS2V5IG9iamVjdCB0eXBlLgorCisgICBQS2V5KCkKKyAgICAgICAgICBGYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIFBLZXkgb2JqZWN0LgorCisgICBQS0NTN1R5cGUKKyAgICAgICAgICBBIFB5dGhvbiB0eXBlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIFBLQ1M3IG9iamVjdCB0eXBlLgorCisgICBQS0NTMTJUeXBlCisgICAgICAgICAgQSBQeXRob24gdHlwZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBQS0NTMTIgb2JqZWN0IHR5cGUuCisKKyAgIFg1MDlFeHRlbnNpb25UeXBlCisgICAgICAgICAgQSBQeXRob24gdHlwZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBYNTA5RXh0ZW5zaW9uIG9iamVjdAorICAgICAgICAgIHR5cGUuCisKKyAgIFg1MDlFeHRlbnNpb24odHlwZW5hbWUsIGNyaXRpY2FsLCB2YWx1ZSkKKyAgICAgICAgICBGYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIFg1MDlFeHRlbnNpb24gb2JqZWN0LgorCisgICBOZXRzY2FwZVNQS0lUeXBlCisgICAgICAgICAgQSBQeXRob24gdHlwZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBOZXRzY2FwZVNQS0kgb2JqZWN0IHR5cGUuCisKKyAgIE5ldHNjYXBlU1BLSShbZW5jXSkKKyAgICAgICAgICBGYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIE5ldHNjYXBlU1BLSSBvYmplY3QuIElmIHRoZSBlbmMKKyAgICAgICAgICBhcmd1bWVudCBpcyBwcmVzZW50LCBpdCBzaG91bGQgYmUgYSBiYXNlNjQtZW5jb2RlZCBzdHJpbmcKKyAgICAgICAgICByZXByZXNlbnRpbmcgYSBOZXRzY2FwZVNQS0kgb2JqZWN0LCBhcyByZXR1cm5lZCBieSB0aGUKKyAgICAgICAgICBiNjRfZW5jb2RlIG1ldGhvZC4KKworICAgRklMRVRZUEVfUEVNCisKKyAgIEZJTEVUWVBFX0FTTjEKKyAgICAgICAgICBGaWxlIHR5cGUgY29uc3RhbnRzLgorCisgICBUWVBFX1JTQQorCisgICBUWVBFX0RTQQorICAgICAgICAgIEtleSB0eXBlIGNvbnN0YW50cy4KKworICAgZXhjZXB0aW9uIEVycm9yCisgICAgICAgICAgR2VuZXJpYyBleGNlcHRpb24gdXNlZCBpbiB0aGUgY3J5cHRvIG1vZHVsZS4KKworICAgZHVtcF9jZXJ0aWZpY2F0ZSh0eXBlLCBjZXJ0KQorICAgICAgICAgIER1bXAgdGhlIGNlcnRpZmljYXRlIGNlcnQgaW50byBhIGJ1ZmZlciBzdHJpbmcgZW5jb2RlZCB3aXRoIHRoZQorICAgICAgICAgIHR5cGUgdHlwZS4KKworICAgZHVtcF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0KHR5cGUsIHJlcSkKKyAgICAgICAgICBEdW1wIHRoZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IHJlcSBpbnRvIGEgYnVmZmVyIHN0cmluZyBlbmNvZGVkCisgICAgICAgICAgd2l0aCB0aGUgdHlwZSB0eXBlLgorCisgICBkdW1wX3ByaXZhdGVrZXkodHlwZSwgcGtleVssIGNpcGhlciwgcGFzc3BocmFzZV0pCisgICAgICAgICAgRHVtcCB0aGUgcHJpdmF0ZSBrZXkgcGtleSBpbnRvIGEgYnVmZmVyIHN0cmluZyBlbmNvZGVkIHdpdGggdGhlCisgICAgICAgICAgdHlwZSB0eXBlLCBvcHRpb25hbGx5IChpZiB0eXBlIGlzIEZJTEVUWVBFX1BFTSkgZW5jcnlwdGluZyBpdAorICAgICAgICAgIHVzaW5nIGNpcGhlciBhbmQgcGFzc3BocmFzZS4KKworICAgICAgICAgIHBhc3NwaHJhc2UgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYSBjYWxsYmFjayBmb3IgcHJvdmlkaW5nCisgICAgICAgICAgdGhlIHBhc3MgcGhyYXNlLgorCisgICBsb2FkX2NlcnRpZmljYXRlKHR5cGUsIGJ1ZmZlcikKKyAgICAgICAgICBMb2FkIGEgY2VydGlmaWNhdGUgKFg1MDkpIGZyb20gdGhlIHN0cmluZyBidWZmZXIgZW5jb2RlZCB3aXRoCisgICAgICAgICAgdGhlIHR5cGUgdHlwZS4KKworICAgbG9hZF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0KHR5cGUsIGJ1ZmZlcikKKyAgICAgICAgICBMb2FkIGEgY2VydGlmaWNhdGUgcmVxdWVzdCAoWDUwOVJlcSkgZnJvbSB0aGUgc3RyaW5nIGJ1ZmZlcgorICAgICAgICAgIGVuY29kZWQgd2l0aCB0aGUgdHlwZSB0eXBlLgorCisgICBsb2FkX3ByaXZhdGVrZXkodHlwZSwgYnVmZmVyWywgcGFzc3BocmFzZV0pCisgICAgICAgICAgTG9hZCBhIHByaXZhdGUga2V5IChQS2V5KSBmcm9tIHRoZSBzdHJpbmcgYnVmZmVyIGVuY29kZWQgd2l0aAorICAgICAgICAgIHRoZSB0eXBlIHR5cGUgKG11c3QgYmUgb25lIG9mIEZJTEVUWVBFX1BFTSBhbmQgRklMRVRZUEVfQVNOMSkuCisKKyAgICAgICAgICBwYXNzcGhyYXNlIG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGEgY2FsbGJhY2sgZm9yIHByb3ZpZGluZworICAgICAgICAgIHRoZSBwYXNzIHBocmFzZS4KKworICAgbG9hZF9wa2NzN19kYXRhKHR5cGUsIGJ1ZmZlcikKKyAgICAgICAgICBMb2FkIHBrY3M3IGRhdGEgZnJvbSB0aGUgc3RyaW5nIGJ1ZmZlciBlbmNvZGVkIHdpdGggdGhlIHR5cGUKKyAgICAgICAgICB0eXBlLgorCisgICBsb2FkX3BrY3MxMihidWZmZXJbLCBwYXNzcGhyYXNlXSkKKyAgICAgICAgICBMb2FkIHBrY3MxMiBkYXRhIGZyb20gdGhlIHN0cmluZyBidWZmZXIuIElmIHRoZSBwa2NzMTIKKyAgICAgICAgICBzdHJ1Y3R1cmUgaXMgZW5jcnlwdGVkLCBhIHBhc3NwaHJhc2UgbXVzdCBiZSBpbmNsdWRlZC4KKworCisgIDMuMS4xIFg1MDkgb2JqZWN0cworCisgICBYNTA5IG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKKyAgIGdldF9pc3N1ZXIoKQorICAgICAgICAgIFJldHVybiBhIGJvcnJvd2VkIHJlZmVyZW5jZSB0byBhIFg1MDlOYW1lIG9iamVjdCByZXByZXNlbnRpbmcKKyAgICAgICAgICB0aGUgaXNzdWVyIG9mIHRoZSBjZXJ0aWZpY2F0ZS4gV2hlbiB0aGUgY29ycmVzcG9uZGluZyBYNTA5IG9yCisgICAgICAgICAgWDUwOVJlcSBvYmplY3QgaXMgZGVzdHJveWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIGludmFsaWQhIAorCisgICBnZXRfcHVia2V5KCkKKyAgICAgICAgICBSZXR1cm4gYSBQS2V5IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHB1YmxpYyBrZXkgb2YgdGhlCisgICAgICAgICAgY2VydGlmaWNhdGUuCisKKyAgIGdldF9zZXJpYWxfbnVtYmVyKCkKKyAgICAgICAgICBSZXR1cm4gdGhlIGNlcnRpZmljYXRlIHNlcmlhbCBudW1iZXIuCisKKyAgIGdldF9zdWJqZWN0KCkKKyAgICAgICAgICBSZXR1cm4gYSBib3Jyb3dlZCByZWZlcmVuY2UgdG8gYSBYNTA5TmFtZSBvYmplY3QgcmVwcmVzZW50aW5nCisgICAgICAgICAgdGhlIHN1YmplY3Qgb2YgdGhlIGNlcnRpZmljYXRlLiBXaGVuIHRoZSBjb3JyZXNwb25kaW5nIFg1MDkgb3IKKyAgICAgICAgICBYNTA5UmVxIG9iamVjdCBpcyBkZXN0cm95ZWQsIHRoaXMgb2JqZWN0IHdpbGwgYmUgaW52YWxpZCEgCisKKyAgIGdldF92ZXJzaW9uKCkKKyAgICAgICAgICBSZXR1cm4gdGhlIGNlcnRpZmljYXRlIHZlcnNpb24uCisKKyAgIGdtdGltZV9hZGpfbm90QmVmb3JlKHRpbWUpCisgICAgICAgICAgQWRqdXN0IHRoZSB0aW1lc3RhbXAgKGluIEdNVCkgd2hlbiB0aGUgY2VydGlmaWNhdGUgc3RhcnRzIGJlaW5nCisgICAgICAgICAgdmFsaWQuCisKKyAgIGdtdGltZV9hZGpfbm90QWZ0ZXIodGltZSkKKyAgICAgICAgICBBZGp1c3QgdGhlIHRpbWVzdGFtcCAoaW4gR01UKSB3aGVuIHRoZSBjZXJ0aWZpY2F0ZSBzdG9wcyBiZWluZworICAgICAgICAgIHZhbGlkLgorCisgICBoYXNfZXhwaXJlZCgpCisgICAgICAgICAgQ2hlY2tzIHRoZSBjZXJ0aWZpY2F0ZSdzIHRpbWUgc3RhbXAgYWdhaW5zdCBjdXJyZW50IHRpbWUuCisgICAgICAgICAgUmV0dXJucyB0cnVlIGlmIHRoZSBjZXJ0aWZpY2F0ZSBoYXMgZXhwaXJlZCBhbmQgZmFsc2UKKyAgICAgICAgICBvdGhlcndpc2UuCisKKyAgIHNldF9pc3N1ZXIoaXNzdWVyKQorICAgICAgICAgIFNldCB0aGUgaXNzdWVyIG9mIHRoZSBjZXJ0aWZpY2F0ZSB0byBpc3N1ZXIuCisKKyAgIHNldF9wdWJrZXkocGtleSkKKyAgICAgICAgICBTZXQgdGhlIHB1YmxpYyBrZXkgb2YgdGhlIGNlcnRpZmljYXRlIHRvIHBrZXkuCisKKyAgIHNldF9zZXJpYWxfbnVtYmVyKHNlcmlhbG5vKQorICAgICAgICAgIFNldCB0aGUgc2VyaWFsIG51bWJlciBvZiB0aGUgY2VydGlmaWNhdGUgdG8gc2VyaWFsbm8uCisKKyAgIHNldF9zdWJqZWN0KHN1YmplY3QpCisgICAgICAgICAgU2V0IHRoZSBzdWJqZWN0IG9mIHRoZSBjZXJ0aWZpY2F0ZSB0byBzdWJqZWN0LgorCisgICBzZXRfdmVyc2lvbih2ZXJzaW9uKQorICAgICAgICAgIFNldCB0aGUgY2VydGlmaWNhdGUgdmVyc2lvbiB0byB2ZXJzaW9uLgorCisgICBzaWduKHBrZXksIGRpZ2VzdCkKKyAgICAgICAgICBTaWduIHRoZSBjZXJ0aWZpY2F0ZSwgdXNpbmcgdGhlIGtleSBwa2V5IGFuZCB0aGUgbWVzc2FnZSBkaWdlc3QKKyAgICAgICAgICBhbGdvcml0aG0gaWRlbnRpZmllZCBieSB0aGUgc3RyaW5nIGRpZ2VzdC4KKworICAgc3ViamVjdF9uYW1lX2hhc2goKQorICAgICAgICAgIFJldHVybiB0aGUgaGFzaCBvZiB0aGUgY2VydGlmaWNhdGUgc3ViamVjdC4KKworICAgZGlnZXN0KGRpZ2VzdF9uYW1lKQorICAgICAgICAgIFJldHVybiBhIGRpZ2VzdCBvZiB0aGUgY2VydGlmaWNhdGUsIHVzaW5nIHRoZSBkaWdlc3RfbmFtZQorICAgICAgICAgIG1ldGhvZC4KKworICAgYWRkX2V4dGVuc2lvbnMoZXh0ZW5zaW9ucykKKyAgICAgICAgICBBZGQgdGhlIGV4dGVuc2lvbnMgaW4gdGhlIHNlcXVlbmNlIGV4dGVuc2lvbnMgdG8gdGhlCisgICAgICAgICAgY2VydGlmaWNhdGUuCisKKworICAzLjEuMiBYNTA5TmFtZSBvYmplY3RzCisKKyAgIFg1MDlOYW1lIG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1lbWJlcnM6IAorCisgICBjb3VudHJ5TmFtZQorICAgICAgICAgIFRoZSBjb3VudHJ5IG9mIHRoZSBlbnRpdHkuIEMgbWF5IGJlIHVzZWQgYXMgYW4gYWxpYXMgZm9yCisgICAgICAgICAgY291bnRyeU5hbWUuCisKKyAgIHN0YXRlT3JQcm92aW5jZU5hbWUKKyAgICAgICAgICBUaGUgc3RhdGUgb3IgcHJvdmluY2Ugb2YgdGhlIGVudGl0eS4gU1QgbWF5IGJlIHVzZWQgYXMgYW4gYWxpYXMKKyAgICAgICAgICBmb3Igc3RhdGVPclByb3ZpbmNlTmFtZbcKKworICAgbG9jYWxpdHlOYW1lCisgICAgICAgICAgVGhlIGxvY2FsaXR5IG9mIHRoZSBlbnRpdHkuIEwgbWF5IGJlIHVzZWQgYXMgYW4gYWxpYXMgZm9yCisgICAgICAgICAgbG9jYWxpdHlOYW1lLgorCisgICBvcmdhbml6YXRpb25OYW1lCisgICAgICAgICAgVGhlIG9yZ2FuaXphdGlvbiBuYW1lIG9mIHRoZSBlbnRpdHkuIE8gbWF5IGJlIHVzZWQgYXMgYW4gYWxpYXMKKyAgICAgICAgICBmb3Igb3JnYW5pemF0aW9uTmFtZS4KKworICAgb3JnYW5pemF0aW9uYWxVbml0TmFtZQorICAgICAgICAgIFRoZSBvcmdhbml6YXRpb25hbCB1bml0IG9mIHRoZSBlbnRpdHkuIE9VIG1heSBiZSB1c2VkIGFzIGFuCisgICAgICAgICAgYWxpYXMgZm9yIG9yZ2FuaXphdGlvbmFsVW5pdE5hbWUuCisKKyAgIGNvbW1vbk5hbWUKKyAgICAgICAgICBUaGUgY29tbW9uIG5hbWUgb2YgdGhlIGVudGl0eS4gQ04gbWF5IGJlIHVzZWQgYXMgYW4gYWxpYXMgZm9yCisgICAgICAgICAgY29tbW9uTmFtZS4KKworICAgZW1haWxBZGRyZXNzCisgICAgICAgICAgVGhlIGUtbWFpbCBhZGRyZXNzIG9mIHRoZSBlbnRpdHkuCisKKworICAzLjEuMyBYNTA5UmVxIG9iamVjdHMKKworICAgWDUwOVJlcSBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOiAKKworICAgZ2V0X3B1YmtleSgpCisgICAgICAgICAgUmV0dXJuIGEgUEtleSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwdWJsaWMga2V5IG9mIHRoZQorICAgICAgICAgIGNlcnRpZmljYXRlIHJlcXVlc3QuCisKKyAgIGdldF9zdWJqZWN0KCkKKyAgICAgICAgICBSZXR1cm4gYSBib3Jyb3dlZCByZWZlcmVuY2UgdG8gYSBYNTA5TmFtZSBvYmplY3QgcmVwcmVzZW50aW5nCisgICAgICAgICAgdGhlIHN1YmplY3Qgb2YgdGhlIGNlcnRpZmljYXRlLiBXaGVuIHRoZSBjb3JyZXNwb25kaW5nIFg1MDkgb3IKKyAgICAgICAgICBYNTA5UmVxIG9iamVjdCBpcyBkZXN0cm95ZWQsIHRoaXMgb2JqZWN0IHdpbGwgYmUgaW52YWxpZCEgCisKKyAgIHNldF9wdWJrZXkocGtleSkKKyAgICAgICAgICBTZXQgdGhlIHB1YmxpYyBrZXkgb2YgdGhlIGNlcnRpZmljYXRlIHJlcXVlc3QgdG8gcGtleS4KKworICAgc2lnbihwa2V5LCBkaWdlc3QpCisgICAgICAgICAgU2lnbiB0aGUgY2VydGlmaWNhdGUgcmVxdWVzdCwgdXNpbmcgdGhlIGtleSBwa2V5IGFuZCB0aGUKKyAgICAgICAgICBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gaWRlbnRpZmllZCBieSB0aGUgc3RyaW5nIGRpZ2VzdC4KKworICAgdmVyaWZ5KHBrZXkpCisgICAgICAgICAgVmVyaWZ5IGEgY2VydGlmaWNhdGUgcmVxdWVzdCB1c2luZyB0aGUgcHVibGljIGtleSBwa2V5LgorCisKKyAgMy4xLjQgWDUwOVN0b3JlIG9iamVjdHMKKworICAgVGhlIFg1MDlTdG9yZSBvYmplY3QgaGFzIGN1cnJlbnRseSBqdXN0IG9uZSBtZXRob2Q6IAorCisgICBhZGRfY2VydChjZXJ0KQorICAgICAgICAgIEFkZCB0aGUgY2VydGlmaWNhdGUgY2VydCB0byB0aGUgY2VydGlmaWNhdGUgc3RvcmUuCisKKworICAzLjEuNSBQS2V5IG9iamVjdHMKKworICAgVGhlIFBLZXkgb2JqZWN0IGhhcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6IAorCisgICBiaXRzKCkKKyAgICAgICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIG9mIHRoZSBrZXkuCisKKyAgIGdlbmVyYXRlX2tleSh0eXBlLCBiaXRzKQorICAgICAgICAgIEdlbmVyYXRlIGEgcHVibGljL3ByaXZhdGUga2V5IHBhaXIgb2YgdGhlIHR5cGUgdHlwZSAob25lIG9mCisgICAgICAgICAgVFlQRV9SU0EgYW5kIFRZUEVfRFNBKSB3aXRoIHRoZSBzaXplIGJpdHMuCisKKyAgIHR5cGUoKQorICAgICAgICAgIFJldHVybiB0aGUgdHlwZSBvZiB0aGUga2V5LgorCisKKyAgMy4xLjYgUEtDUzcgb2JqZWN0cworCisgICBQS0NTNyBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOiAKKworICAgdHlwZV9pc19zaWduZWQoKQorICAgICAgICAgIEZJWE1FCisKKyAgIHR5cGVfaXNfZW52ZWxvcGVkKCkKKyAgICAgICAgICBGSVhNRQorCisgICB0eXBlX2lzX3NpZ25lZEFuZEVudmVsb3BlZCgpCisgICAgICAgICAgRklYTUUKKworICAgdHlwZV9pc19kYXRhKCkKKyAgICAgICAgICBGSVhNRQorCisgICBnZXRfdHlwZV9uYW1lKCkKKyAgICAgICAgICBHZXQgdGhlIHR5cGUgbmFtZSBvZiB0aGUgUEtDUzcuCisKKworICAzLjEuNyBQS0NTMTIgb2JqZWN0cworCisgICBQS0NTMTIgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczogCisKKyAgIGdldF9jZXJ0aWZpY2F0ZSgpCisgICAgICAgICAgUmV0dXJuIGNlcnRpZmljYXRlIHBvcnRpb24gb2YgdGhlIFBLQ1MxMiBzdHJ1Y3R1cmUuCisKKyAgIGdldF9wcml2YXRla2V5KCkKKyAgICAgICAgICBSZXR1cm4gcHJpdmF0ZSBrZXkgcG9ydGlvbiBvZiB0aGUgUEtDUzEyIHN0cnVjdHVyZQorCisgICBnZXRfY2FfY2VydGlmaWNhdGVzKCkKKyAgICAgICAgICBSZXR1cm4gQ0EgY2VydGlmaWNhdGVzIHdpdGhpbiB0aGUgUEtDUzEyIG9iamVjdCBhcyBhIHR1cGxlLgorICAgICAgICAgIFJldHVybnMgTm9uZSBpZiBubyBDQSBjZXJ0aWZpY2F0ZXMgYXJlIHByZXNlbnQuCisKKworICAzLjEuOCBYNTA5RXh0ZW5zaW9uIG9iamVjdHMKKworICAgWDUwOUV4dGVuc2lvbiBvYmplY3RzIGN1cnJlbnRseSBvbmx5IGhhdmUgb25lIG1ldGhvZDogCisKKyAgIGdldF9jcml0aWNhbCgpCisgICAgICAgICAgUmV0dXJuIHRoZSBjcml0aWNhbCBmaWVsZCBvZiB0aGUgZXh0ZW5zaW9uIG9iamVjdC4KKworCisgIDMuMS45IE5ldHNjYXBlU1BLSSBvYmplY3RzCisKKyAgIE5ldHNjYXBlU1BLSSBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOiAKKworICAgYjY0X2VuY29kZSgpCisgICAgICAgICAgUmV0dXJuIGEgYmFzZTY0LWVuY29kZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuCisKKyAgIGdldF9wdWJrZXkoKQorICAgICAgICAgIFJldHVybiB0aGUgcHVibGljIGtleSBvZiBvYmplY3QuCisKKyAgIHNldF9wdWJrZXkoa2V5KQorICAgICAgICAgIFNldCB0aGUgcHVibGljIGtleSBvZiB0aGUgb2JqZWN0IHRvIGtleS4KKworICAgc2lnbihrZXksIGRpZ2VzdF9uYW1lKQorICAgICAgICAgIFNpZ24gdGhlIE5ldHNjYXBlU1BLSSBvYmplY3QgdXNpbmcgdGhlIGdpdmVuIGtleSBhbmQKKyAgICAgICAgICBkaWdlc3RfbmFtZS4KKworICAgdmVyaWZ5KGtleSkKKyAgICAgICAgICBWZXJpZnkgdGhlIE5ldHNjYXBlU1BLSSBvYmplY3QgdXNpbmcgdGhlIGdpdmVuIGtleS4KKworCiszLjIgcmFuZCAtLSBBbiBpbnRlcmZhY2UgdG8gdGhlIE9wZW5TU0wgcHNldWRvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisKKyAgIFRoaXMgbW9kdWxlIGhhbmRsZXMgdGhlIE9wZW5TU0wgcHNldWRvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIChQUk5HKQorICAgYW5kIGRlY2xhcmVzIHRoZSBmb2xsb3dpbmc6IAorCisgICBhZGQoc3RyaW5nLCBlbnRyb3B5KQorICAgICAgICAgIE1peCBieXRlcyBmcm9tIHN0cmluZyBpbnRvIHRoZSBQUk5HIHN0YXRlLiBUaGUgZW50cm9weSBhcmd1bWVudAorICAgICAgICAgIGlzICh0aGUgbG93ZXIgYm91bmQgb2YpIGFuIGVzdGltYXRlIG9mIGhvdyBtdWNoIHJhbmRvbW5lc3MgaXMKKyAgICAgICAgICBjb250YWluZWQgaW4gc3RyaW5nLCBtZWFzdXJlZCBpbiBieXRlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sCisgICAgICAgICAgc2VlIGUuZy4gUkZDIDE3NTAuCisKKyAgIGVnZChwYXRoWywgYnl0ZXNdKQorICAgICAgICAgIFF1ZXJ5IHRoZSBFbnRyb3B5IEdhdGhlcmluZyBEYWVtb25eMyBvbiBzb2NrZXQgcGF0aCBmb3IgYnl0ZXMKKyAgICAgICAgICBieXRlcyBvZiByYW5kb20gZGF0YSBhbmQgYW5kIHVzZXMgYWRkIHRvIHNlZWQgdGhlIFBSTkcuIFRoZQorICAgICAgICAgIGRlZmF1bHQgdmFsdWUgb2YgYnl0ZXMgaXMgMjU1LgorCisgICBsb2FkX2ZpbGUocGF0aFssIGJ5dGVzXSkKKyAgICAgICAgICBSZWFkIGJ5dGVzIGJ5dGVzIChvciBhbGwgb2YgaXQsIGlmIGJ5dGVzIGlzIG5lZ2F0aXZlKSBvZiBkYXRhCisgICAgICAgICAgZnJvbSB0aGUgZmlsZSBwYXRoIHRvIHNlZWQgdGhlIFBSTkcuIFRoZSBkZWZhdWx0IHZhbHVlIG9mIGJ5dGVzCisgICAgICAgICAgaXMgLTEuCisKKyAgIHNjcmVlbigpCisgICAgICAgICAgQWRkIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBzY3JlZW4gdG8gdGhlIFBSTkcgc3RhdGUuCisgICAgICAgICAgQXZhaWxhYmlsaXR5OiBXaW5kb3dzLgorCisgICBzZWVkKHN0cmluZykKKyAgICAgICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBhZGQgd2l0aCBlbnRyb3B5IGFzIHRoZSBsZW5ndGggb2YKKyAgICAgICAgICB0aGUgc3RyaW5nLgorCisgICBzdGF0dXMoKQorICAgICAgICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgUFJORyBoYXMgYmVlbiBzZWVkZWQgd2l0aCBlbm91Z2ggZGF0YSwgYW5kCisgICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorCisgICB3cml0ZV9maWxlKHBhdGgpCisgICAgICAgICAgV3JpdGUgYSBudW1iZXIgb2YgcmFuZG9tIGJ5dGVzIChjdXJyZW50bHkgMTAyNCkgdG8gdGhlIGZpbGUKKyAgICAgICAgICBwYXRoLiBUaGlzIGZpbGUgY2FuIHRoZW4gYmUgdXNlZCB3aXRoIGxvYWRfZmlsZSB0byBzZWVkIHRoZQorICAgICAgICAgIFBSTkcgYWdhaW4uCisKKworMy4zIFNTTCAtLSBBbiBpbnRlcmZhY2UgdG8gdGhlIFNTTC1zcGVjaWZpYyBwYXJ0cyBvZiBPcGVuU1NMCisKKyAgIFRoaXMgbW9kdWxlIGhhbmRsZXMgdGhpbmdzIHNwZWNpZmljIHRvIFNTTC4gVGhlcmUgYXJlIHR3byBvYmplY3RzCisgICBkZWZpbmVkOiBDb250ZXh0LCBDb25uZWN0aW9uLiAKKworICAgU1NMdjJfTUVUSE9ECisKKyAgIFNTTHYzX01FVEhPRAorCisgICBTU0x2MjNfTUVUSE9ECisKKyAgIFRMU3YxX01FVEhPRAorICAgICAgICAgIFRoZXNlIGNvbnN0YW50cyByZXByZXNlbnQgdGhlIGRpZmZlcmVudCBTU0wgbWV0aG9kcyB0byB1c2Ugd2hlbgorICAgICAgICAgIGNyZWF0aW5nIGEgY29udGV4dCBvYmplY3QuCisKKyAgIFZFUklGWV9OT05FCisKKyAgIFZFUklGWV9QRUVSCisKKyAgIFZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVAorICAgICAgICAgIFRoZXNlIGNvbnN0YW50cyByZXByZXNlbnQgdGhlIHZlcmlmaWNhdGlvbiBtb2RlIHVzZWQgYnkgdGhlCisgICAgICAgICAgQ29udGV4dCBvYmplY3QncyBzZXRfdmVyaWZ5IG1ldGhvZC4KKworICAgRklMRVRZUEVfUEVNCisKKyAgIEZJTEVUWVBFX0FTTjEKKyAgICAgICAgICBGaWxlIHR5cGUgY29uc3RhbnRzIHVzZWQgd2l0aCB0aGUgdXNlX2NlcnRpZmljYXRlX2ZpbGUgYW5kCisgICAgICAgICAgdXNlX3ByaXZhdGVrZXlfZmlsZSBtZXRob2RzIG9mIENvbnRleHQgb2JqZWN0cy4KKworICAgT1BfU0lOR0xFX0RIX1VTRQorCisgICBPUF9FUEhFTUVSQUxfUlNBCisKKyAgIE9QX05PX1NTTHYyCisKKyAgIE9QX05PX1NTTHYzCisKKyAgIE9QX05PX1RMU3YxCisgICAgICAgICAgQ29uc3RhbnRzIHVzZWQgd2l0aCBzZXRfb3B0aW9ucyBvZiBDb250ZXh0IG9iamVjdHMuCisgICAgICAgICAgT1BfU0lOR0xFX0RIX1VTRSBtZWFucyB0byBhbHdheXMgY3JlYXRlIGEgbmV3IGtleSB3aGVuIHVzaW5nCisgICAgICAgICAgZXBoZW1lcmFsIERpZmZpZS1IZWxsbWFuLiBPUF9FUEhFTUVSQUxfUlNBIG1lYW5zIHRvIGFsd2F5cyB1c2UKKyAgICAgICAgICBlcGhlbWVyYWwgUlNBIGtleXMgd2hlbiBkb2luZyBSU0Egb3BlcmF0aW9ucy4gT1BfTk9fU1NMdjIsCisgICAgICAgICAgT1BfTk9fU1NMdjMgYW5kIE9QX05PX1RMU3YxIG1lYW5zIHRvIGRpc2FibGUgdGhvc2Ugc3BlY2lmaWMKKyAgICAgICAgICBwcm90b2NvbHMuIFRoaXMgaXMgaW50ZXJlc3RpbmcgaWYgeW91J3JlIHVzaW5nIGUuZy4KKyAgICAgICAgICBTU0x2MjNfTUVUSE9EIHRvIGdldCBhbiBTU0x2Mi1jb21wYXRpYmxlIGhhbmRzaGFrZSwgYnV0IGRvbid0CisgICAgICAgICAgd2FudCB0byB1c2UgU1NMdjIuCisKKyAgIENvbnRleHRUeXBlCisgICAgICAgICAgQSBQeXRob24gdHlwZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBDb250ZXh0IG9iamVjdCB0eXBlLgorCisgICBDb250ZXh0KG1ldGhvZCkKKyAgICAgICAgICBGYWN0b3J5IGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIG5ldyBDb250ZXh0IG9iamVjdCBnaXZlbiBhbiBTU0wKKyAgICAgICAgICBtZXRob2QuIFRoZSBtZXRob2Qgc2hvdWxkIGJlIFNTTHYyX01FVEhPRCwgU1NMdjNfTUVUSE9ELAorICAgICAgICAgIFNTTHYyM19NRVRIT0Qgb3IgVExTdjFfTUVUSE9ELgorCisgICBDb25uZWN0aW9uVHlwZQorICAgICAgICAgIEEgUHl0aG9uIHR5cGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgQ29ubmVjdGlvbiBvYmplY3QgdHlwZS4KKworICAgQ29ubmVjdGlvbihjb250ZXh0LCBzb2NrZXQpCisgICAgICAgICAgRmFjdG9yeSBmdWNuY3Rpb24gdGhhdCBjcmVhdGVzIGEgbmV3IENvbm5lY3Rpb24gb2JqZWN0IGdpdmVuIGFuCisgICAgICAgICAgU1NMIGNvbnRleHQgYW5kIGEgc29ja2V0IF40IG9iamVjdC4KKworICAgZXhjZXB0aW9uIEVycm9yCisgICAgICAgICAgVGhpcyBleGNlcHRpb24gaXMgdXNlZCBhcyBhIGJhc2UgY2xhc3MgZm9yIHRoZSBvdGhlcgorICAgICAgICAgIFNTTC1yZWxhdGVkIGV4Y2VwdGlvbnMsIGJ1dCBtYXkgYWxzbyBiZSByYWlzZWQgZGlyZWN0bHkuCisKKyAgICAgICAgICBXaGVuZXZlciB0aGlzIGV4Y2VwdGlvbiBpcyByYWlzZWQgZGlyZWN0bHksIGl0IGhhcyBhIGxpc3Qgb2YKKyAgICAgICAgICBlcnJvciBtZXNzYWdlcyBmcm9tIHRoZSBPcGVuU1NMIGVycm9yIHF1ZXVlLCB3aGVyZSBlYWNoIGl0ZW0gaXMKKyAgICAgICAgICBhIHR1cGxlIChsaWIsIGZ1bmN0aW9uLCByZWFzb24pLiBIZXJlIGxpYiwgZnVuY3Rpb24gYW5kIHJlYXNvbgorICAgICAgICAgIGFyZSBhbGwgc3RyaW5ncywgZGVzY3JpYmluZyB3aGVyZSBhbmQgd2hhdCB0aGUgcHJvYmxlbSBpcy4gU2VlCisgICAgICAgICAgZXJyKDMpIGZvciBtb3JlIGluZm9ybWF0aW9uLiAKKworICAgZXhjZXB0aW9uIFplcm9SZXR1cm5FcnJvcgorICAgICAgICAgIFRoaXMgZXhjZXB0aW9uIG1hdGNoZXMgdGhlIGVycm9yIHJldHVybiBjb2RlCisgICAgICAgICAgU1NMX0VSUk9SX1pFUk9fUkVUVVJOLCBhbmQgaXMgcmFpc2VkIHdoZW4gdGhlIFNTTCBDb25uZWN0aW9uCisgICAgICAgICAgaGFzIGJlZW4gY2xvc2VkLiBJbiBTU0wgMy4wIGFuZCBUTFMgMS4wLCB0aGlzIG9ubHkgb2NjdXJzIGlmIGEKKyAgICAgICAgICBjbG9zdXJlIGFsZXJ0IGhhcyBvY2N1cnJlZCBpbiB0aGUgcHJvdG9jb2wsIGkuZS4gdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgICBoYXMgYmVlbiBjbG9zZWQgY2xlYW5seS4gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgbmVjZXNzYXJpbHkKKyAgICAgICAgICBtZWFuIHRoYXQgdGhlIHRyYW5zcG9ydCBsYXllciAoZS5nLiBhIHNvY2tldCkgaGFzIGJlZW4gY2xvc2VkLgorCisgICAgICAgICAgSXQgbWF5IHNlZW0gYSBsaXR0bGUgc3RyYW5nZSB0aGF0IHRoaXMgaXMgYW4gZXhjZXB0aW9uLCBidXQgaXQKKyAgICAgICAgICBkb2VzIG1hdGNoIGFuIFNTTF9FUlJPUiBjb2RlLCBhbmQgaXMgdmVyeSBjb252ZW5pZW50LiAKKworICAgZXhjZXB0aW9uIFdhbnRSZWFkRXJyb3IKKyAgICAgICAgICBUaGUgb3BlcmF0aW9uIGRpZCBub3QgY29tcGxldGU7IHRoZSBzYW1lIEkvTyBtZXRob2Qgc2hvdWxkIGJlCisgICAgICAgICAgY2FsbGVkIGFnYWluIGxhdGVyLCB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cy4gQW55IEkvTyBtZXRob2QgY2FuCisgICAgICAgICAgbGVhZCB0byB0aGlzIHNpbmNlIG5ldyBoYW5kc2hha2VzIGNhbiBvY2N1ciBhdCBhbnkgdGltZS4KKworICAgZXhjZXB0aW9uIFdhbnRXcml0ZUVycm9yCisgICAgICAgICAgU2VlIFdhbnRSZWFkRXJyb3IuCisKKyAgIGV4Y2VwdGlvbiBXYW50WDUwOUxvb2t1cEVycm9yCisgICAgICAgICAgVGhlIG9wZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlIGJlY2F1c2UgYW4gYXBwbGljYXRpb24gY2FsbGJhY2sKKyAgICAgICAgICBoYXMgYXNrZWQgdG8gYmUgY2FsbGVkIGFnYWluLiBUaGUgSS9PIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkCisgICAgICAgICAgYWdhaW4gbGF0ZXIsIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzLiBOb3RlOiBUaGlzIHdvbid0IG9jY3VyIGluCisgICAgICAgICAgdGhpcyB2ZXJzaW9uLCBhcyB0aGVyZSBhcmUgbm8gc3VjaCBjYWxsYmFja3MgaW4gdGhpcyB2ZXJzaW9uLgorCisgICBleGNlcHRpb24gU3lzQ2FsbEVycm9yCisgICAgICAgICAgVGhlIFN5c0NhbGxFcnJvciBvY2N1cnMgd2hlbiB0aGVyZSdzIGFuIEkvTyBlcnJvciBhbmQgT3BlblNTTCdzCisgICAgICAgICAgZXJyb3IgcXVldWUgZG9lcyBub3QgY29udGFpbiBhbnkgaW5mb3JtYXRpb24uIFRoaXMgY2FuIG1lYW4gdHdvCisgICAgICAgICAgdGhpbmdzOiBBbiBlcnJvciBpbiB0aGUgdHJhbnNwb3J0IHByb3RvY29sLCBvciBhbiBlbmQgb2YgZmlsZQorICAgICAgICAgIHRoYXQgdmlvbGF0ZXMgdGhlIHByb3RvY29sLiBUaGUgcGFyYW1ldGVyIHRvIHRoZSBleGNlcHRpb24gaXMKKyAgICAgICAgICBhbHdheXMgYSBwYWlyIChlcnJudW0sIGVycnN0cikuCisKKworICAzLjMuMSBDb250ZXh0IG9iamVjdHMKKworICAgQ29udGV4dCBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOiAKKworICAgY2hlY2tfcHJpdmF0ZWtleSgpCisgICAgICAgICAgQ2hlY2sgaWYgdGhlIHByaXZhdGUga2V5IChsb2FkZWQgd2l0aCB1c2VfcHJpdmF0ZWtleVtfZmlsZV0pCisgICAgICAgICAgbWF0Y2hlcyB0aGUgY2VydGlmaWNhdGUgKGxvYWRlZCB3aXRoIHVzZV9jZXJ0aWZpY2F0ZVtfZmlsZV0pLgorICAgICAgICAgIFJldHVybnMgdHJ1ZSBpZiB0aGV5IG1hdGNoLCBmYWxzZSBvdGhlcndpc2UuCisKKyAgIGdldF9hcHBfZGF0YSgpCisgICAgICAgICAgUmV0cmlldmUgYXBwbGljYXRpb24gZGF0YSBhcyBzZXQgYnkgc2V0X2FwcF9kYXRhLgorCisgICBnZXRfY2VydF9zdG9yZSgpCisgICAgICAgICAgUmV0cmlldmUgdGhlIGNlcnRpZmljYXRlIHN0b3JlIChhIFg1MDlTdG9yZSBvYmplY3QpIHRoYXQgdGhlCisgICAgICAgICAgY29udGV4dCB1c2VzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCAidHJ1c3RlZCIgY2VydGlmaWNhdGVzCisgICAgICAgICAgd2l0aG91dCB1c2luZyB0aGUuIGxvYWRfdmVyaWZ5X2xvY2F0aW9ucygpIG1ldGhvZC4KKworICAgZ2V0X3RpbWVvdXQoKQorICAgICAgICAgIFJldHJpZXZlIHNlc3Npb24gdGltZW91dCwgYXMgc2V0IGJ5IHNldF90aW1lb3V0LiBUaGUgZGVmYXVsdCBpcworICAgICAgICAgIDMwMCBzZWNvbmRzLgorCisgICBnZXRfdmVyaWZ5X2RlcHRoKCkKKyAgICAgICAgICBSZXRyaWV2ZSB0aGUgQ29udGV4dCBvYmplY3QncyB2ZXJpZnkgZGVwdGgsIGFzIHNldCBieQorICAgICAgICAgIHNldF92ZXJpZnlfZGVwdGguCisKKyAgIGdldF92ZXJpZnlfbW9kZSgpCisgICAgICAgICAgUmV0cmlldmUgdGhlIENvbnRleHQgb2JqZWN0J3MgdmVyaWZ5IG1vZGUsIGFzIHNldCBieQorICAgICAgICAgIHNldF92ZXJpZnlfbW9kZS4KKworICAgbG9hZF9jbGllbnRfY2EocGVtZmlsZSkKKyAgICAgICAgICBSZWFkIGEgZmlsZSB3aXRoIFBFTS1mb3JtYXR0ZWQgY2VydGlmaWNhdGVzIHRoYXQgd2lsbCBiZSBzZW50CisgICAgICAgICAgdG8gdGhlIGNsaWVudCB3aGVuIHJlcXVlc3RpbmcgYSBjbGllbnQgY2VydGlmaWNhdGUuCisKKyAgIGxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhwZW1maWxlKQorICAgICAgICAgIFNwZWNpZnkgd2hlcmUgQ0EgY2VydGlmaWNhdGVzIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMgYXJlCisgICAgICAgICAgbG9jYXRlZC4gVGhlc2UgYXJlIHRydXN0ZWQgY2VydGlmaWNhdGVzLiBOb3RlIHRoYXQgdGhlCisgICAgICAgICAgY2VydGlmaWNhdGVzIGhhdmUgdG8gYmUgaW4gUEVNIGZvcm1hdC4KKworICAgbG9hZF90bXBfZGgoZGhmaWxlKQorICAgICAgICAgIExvYWQgcGFyYW1ldGVycyBmb3IgRXBoZW1lcmFsIERpZmZpZS1IZWxsbWFuIGZyb20gZGhmaWxlLgorCisgICBzZXRfYXBwX2RhdGEoZGF0YSkKKyAgICAgICAgICBBc3NvY2lhdGUgZGF0YSB3aXRoIHRoaXMgQ29udGV4dCBvYmplY3QuIGRhdGEgY2FuIGJlIHJldHJpZXZlZAorICAgICAgICAgIGxhdGVyIHVzaW5nIHRoZSBnZXRfYXBwX2RhdGEgbWV0aG9kLgorCisgICBzZXRfY2lwaGVyX2xpc3QoY2lwaGVycykKKyAgICAgICAgICBTZXQgdGhlIGxpc3Qgb2YgY2lwaGVycyB0byBiZSB1c2VkIGluIHRoaXMgY29udGV4dC4gU2VlIHRoZQorICAgICAgICAgIE9wZW5TU0wgbWFudWFsIGZvciBtb3JlIGluZm9ybWF0aW9uIChlLmcuIGNpcGhlcnMoMSkpCisKKyAgIHNldF9pbmZvX2NhbGxiYWNrKGNhbGxiYWNrKQorICAgICAgICAgIFNldCB0aGUgaW5mb3JtYXRpb24gY2FsbGJhY2sgdG8gY2FsbGJhY2suIFRoaXMgZnVuY3Rpb24gd2lsbCBiZQorICAgICAgICAgIGNhbGxlZCBmcm9tIHRpbWUgdG8gdGltZSBkdXJpbmcgU1NMIGhhbmRzaGFrZXMuCisKKyAgICAgICAgICBjYWxsYmFjayBzaG91bGQgdGFrZSB0aHJlZSBhcmd1bWVudHM6IGEgQ29ubmVjdGlvbiBvYmplY3QgYW5kCisgICAgICAgICAgdHdvIGludGVnZXJzLiBUaGUgZmlyc3QgaW50ZWdlciBzcGVjaWZpZXMgd2hlcmUgaW4gdGhlIFNTTAorICAgICAgICAgIGhhbmRzaGFrZSB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZCwgYW5kIHRoZSBvdGhlciB0aGUgcmV0dXJuCisgICAgICAgICAgY29kZSBmcm9tIGEgKHBvc3NpYmx5IGZhaWxlZCkgaW50ZXJuYWwgZnVuY3Rpb24gY2FsbC4gCisKKyAgIHNldF9vcHRpb25zKG9wdGlvbnMpCisgICAgICAgICAgQWRkIFNTTCBvcHRpb25zLiBPcHRpb25zIHlvdSBoYXZlIHNldCBiZWZvcmUgYXJlIG5vdCBjbGVhcmVkIQorCisgICAgICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgd2l0aCB0aGUgT1BfKiBjb25zdGFudHMuIAorCisgICBzZXRfcGFzc3dkX2NiKGNhbGxiYWNrWywgdXNlcmRhdGFdKQorICAgICAgICAgIFNldCB0aGUgcGFzc3BocmFzZSBjYWxsYmFjayB0byBjYWxsYmFjay4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlCisgICAgICAgICAgY2FsbGVkIHdoZW4gYSBwcml2YXRlIGtleSB3aXRoIGEgcGFzc3BocmFzZSBpcyBsb2FkZWQuCisKKyAgICAgICAgICBjYWxsYmFjayBzaG91bGQgdGFrZSBhIGJvb2xlYW4gYXJndW1lbnQgcmVwZWF0IGFuZCBhbiBhcmJpdHJhcnkKKyAgICAgICAgICBhcmd1bWVudCBkYXRhIGFuZCByZXR1cm4gdGhlIHBhc3NwaHJhc2UgZW50ZXJlZCBieSB0aGUgdXNlci4gSWYKKyAgICAgICAgICByZXBlYXQgaXMgdHJ1ZSB0aGVuIGNhbGxiYWNrIHNob3VsZCBhc2sgZm9yIHRoZSBwYXNzcGhyYXNlCisgICAgICAgICAgdHdpY2UgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSB0d28gZW50cmllcyBhcmUgZXF1YWwuIFRoZSBkYXRhCisgICAgICAgICAgYXJndW1lbnQgaXMgdGhlIHVzZXJkYXRhIHZhcmlhYmxlIHBhc3NlZCB0byB0aGUgc2V0X3Bhc3N3ZF9jYgorICAgICAgICAgIG1ldGhvZC4gSWYgYW4gZXJyb3Igb2NjdXJzLCBjYWxsYmFjayBzaG91bGQgcmV0dXJuIGEgZmFsc2UKKyAgICAgICAgICB2YWx1ZSAoZS5nLiBhbiBlbXB0eSBzdHJpbmcpLiAKKworICAgc2V0X3Nlc3Npb25faWQobmFtZSkKKyAgICAgICAgICBTZXQgdGhlIGNvbnRleHQgbmFtZSB3aXRoaW4gd2hpY2ggYSBzZXNzaW9uIGNhbiBiZSByZXVzZWQgZm9yCisgICAgICAgICAgdGhpcyBDb250ZXh0IG9iamVjdC4gVGhpcyBpcyBuZWVkZWQgd2hlbiBkb2luZyBzZXNzaW9uCisgICAgICAgICAgcmVzdW1wdGlvbiwgYmVjYXVzZSB0aGVyZSBpcyBubyB3YXkgZm9yIGEgc3RvcmVkIHNlc3Npb24gdG8KKyAgICAgICAgICBrbm93IHdoaWNoIENvbnRleHQgb2JqZWN0IGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gbmFtZSBtYXkgYmUKKyAgICAgICAgICBhbnkgYmluYXJ5IGRhdGEuCisKKyAgIHNldF90aW1lb3V0KHRpbWVvdXQpCisgICAgICAgICAgU2V0IHRoZSB0aW1lb3V0IGZvciBuZXdseSBjcmVhdGVkIHNlc3Npb25zIGZvciB0aGlzIENvbnRleHQKKyAgICAgICAgICBvYmplY3QgdG8gdGltZW91dC4gdGltZW91dCBtdXN0IGJlIGdpdmVuIGluICh3aG9sZSkgc2Vjb25kcy4KKyAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAzMDAgc2Vjb25kcy4gU2VlIHRoZSBPcGVuU1NMIG1hbnVhbCBmb3IKKyAgICAgICAgICBtb3JlIGluZm9ybWF0aW9uIChlLmcuIFNTTF9DVFhfc2V0X3RpbWVvdXQoMykpLgorCisgICBzZXRfdmVyaWZ5KG1vZGUsIGNhbGxiYWNrKQorICAgICAgICAgIFNldCB0aGUgdmVyaWZpY2F0aW9uIGZsYWdzIGZvciB0aGlzIENvbnRleHQgb2JqZWN0IHRvIG1vZGUgYW5kCisgICAgICAgICAgc3BlY2lmeSB0aGF0IGNhbGxiYWNrIHNob3VsZCBiZSB1c2VkIGZvciB2ZXJpZmljYXRpb24KKyAgICAgICAgICBjYWxsYmFja3MuIG1vZGUgc2hvdWxkIGJlIG9uZSBvZiBWRVJJRllfTk9ORSBhbmQgVkVSSUZZX1BFRVIuCisgICAgICAgICAgSWYgVkVSSUZZX1BFRVIgaXMgdXNlZCwgbW9kZSBjYW4gYmUgT1I6ZWQgd2l0aAorICAgICAgICAgIFZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCBhbmQgVkVSSUZZX0NMSUVOVF9PTkNFIHRvIGZ1cnRoZXIKKyAgICAgICAgICBjb250cm9sIHRoZSBiZWhhdmlvdXIuCisKKyAgICAgICAgICBjYWxsYmFjayBzaG91bGQgdGFrZSBmaXZlIGFyZ3VtZW50czogQSBDb25uZWN0aW9uIG9iamVjdCwgYW4KKyAgICAgICAgICBYNTA5IG9iamVjdCwgYW5kIHRocmVlIGludGVnZXIgdmFyaWFibGVzLCB3aGljaCBhcmUgaW4gdHVybgorICAgICAgICAgIHBvdGVudGlhbCBlcnJvciBudW1iZXIsIGVycm9yIGRlcHRoIGFuZCByZXR1cm4gY29kZS4gY2FsbGJhY2sKKyAgICAgICAgICBzaG91bGQgcmV0dXJuIHRydWUgaWYgdmVyaWZpY2F0aW9uIHBhc3NlcyBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiAKKworICAgc2V0X3ZlcmlmeV9kZXB0aChkZXB0aCkKKyAgICAgICAgICBTZXQgdGhlIG1heGltdW0gZGVwdGggZm9yIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiB2ZXJpZmljYXRpb24KKyAgICAgICAgICB0aGF0IHNoYWxsIGJlIGFsbG93ZWQgZm9yIHRoaXMgQ29udGV4dCBvYmplY3QuCisKKyAgIHVzZV9jZXJ0aWZpY2F0ZShjZXJ0KQorICAgICAgICAgIFVzZSB0aGUgY2VydGlmaWNhdGUgY2VydCB3aGljaCBoYXMgdG8gYmUgYSBYNTA5IG9iamVjdC4KKworICAgdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoZmlsZSkKKyAgICAgICAgICBMb2FkIGEgY2VydGlmaWNhdGUgY2hhaW4gZnJvbSBmaWxlIHdoaWNoIG11c3QgYmUgUEVNIGVuY29kZWQuCisKKyAgIHVzZV9wcml2YXRla2V5KHBrZXkpCisgICAgICAgICAgVXNlIHRoZSBwcml2YXRlIGtleSBwa2V5IHdoaWNoIGhhcyB0byBiZSBhIFBLZXkgb2JqZWN0LgorCisgICB1c2VfY2VydGlmaWNhdGVfZmlsZShmaWxlWywgZm9ybWF0XSkKKyAgICAgICAgICBMb2FkIHRoZSBmaXJzdCBjZXJ0aWZpY2F0ZSBmb3VuZCBpbiBmaWxlLiBUaGUgY2VydGlmaWNhdGUgbXVzdAorICAgICAgICAgIGJlIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IGZvcm1hdCwgd2hpY2ggaXMgZWl0aGVyCisgICAgICAgICAgRklMRVRZUEVfUEVNIG9yIEZJTEVUWVBFX0FTTjEuIFRoZSBkZWZhdWx0IGlzIEZJTEVUWVBFX1BFTS4KKworICAgdXNlX3ByaXZhdGVrZXlfZmlsZShmaWxlWywgZm9ybWF0XSkKKyAgICAgICAgICBMb2FkIHRoZSBmaXJzdCBwcml2YXRlIGtleSBmb3VuZCBpbiBmaWxlLiBUaGUgcHJpdmF0ZSBrZXkgbXVzdAorICAgICAgICAgIGJlIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGJ5IGZvcm1hdCwgd2hpY2ggaXMgZWl0aGVyCisgICAgICAgICAgRklMRVRZUEVfUEVNIG9yIEZJTEVUWVBFX0FTTjEuIFRoZSBkZWZhdWx0IGlzIEZJTEVUWVBFX1BFTS4KKworCisgIDMuMy4yIENvbm5lY3Rpb24gb2JqZWN0cworCisgICBDb25uZWN0aW9uIG9iamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6IAorCisgICBhY2NlcHQoKQorICAgICAgICAgIENhbGwgdGhlIGFjY2VwdCBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0IGFuZCBzZXQgdXAgU1NMCisgICAgICAgICAgb24gdGhlIHJldHVybmVkIHNvY2tldCwgdXNpbmcgdGhlIENvbnRleHQgb2JqZWN0IHN1cHBsaWVkIHRvCisgICAgICAgICAgdGhpcyBDb25uZWN0aW9uIG9iamVjdCBhdCBjcmVhdGlvbi4gUmV0dXJucyBhIHBhaXIgKGNvbm4sCisgICAgICAgICAgYWRkcmVzcykuIHdoZXJlIGNvbm4gaXMgdGhlIG5ldyBDb25uZWN0aW9uIG9iamVjdCBjcmVhdGVkLCBhbmQKKyAgICAgICAgICBhZGRyZXNzIGlzIGFzIHJldHVybmVkIGJ5IHRoZSBzb2NrZXQncyBhY2NlcHQuCisKKyAgIGJpbmQoYWRkcmVzcykKKyAgICAgICAgICBDYWxsIHRoZSBiaW5kIG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuCisKKyAgIGNsb3NlKCkKKyAgICAgICAgICBDYWxsIHRoZSBjbG9zZSBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LiBOb3RlOiBJZiB5b3UKKyAgICAgICAgICB3YW50IGNvcnJlY3QgU1NMIGNsb3N1cmUsIHlvdSBuZWVkIHRvIGNhbGwgdGhlIHNodXRkb3duIG1ldGhvZAorICAgICAgICAgIGZpcnN0LgorCisgICBjb25uZWN0KGFkZHJlc3MpCisgICAgICAgICAgQ2FsbCB0aGUgY29ubmVjdCBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0IGFuZCBzZXQgdXAgU1NMCisgICAgICAgICAgb24gdGhlIHNvY2tldCwgdXNpbmcgdGhlIENvbnRleHQgb2JqZWN0IHN1cHBsaWVkIHRvIHRoaXMKKyAgICAgICAgICBDb25uZWN0aW9uIG9iamVjdCBhdCBjcmVhdGlvbi4KKworICAgY29ubmVjdF9leChhZGRyZXNzKQorICAgICAgICAgIENhbGwgdGhlIGNvbm5lY3RfZXggbWV0aG9kIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBhbmQgc2V0IHVwCisgICAgICAgICAgU1NMIG9uIHRoZSBzb2NrZXQsIHVzaW5nIHRoZSBDb250ZXh0IG9iamVjdCBzdXBwbGllZCB0byB0aGlzCisgICAgICAgICAgQ29ubmVjdGlvbiBvYmplY3QgYXQgY3JlYXRpb24uIE5vdGUgdGhhdCBpZiB0aGUgY29ubmVjdF9leAorICAgICAgICAgIG1ldGhvZCBvZiB0aGUgc29ja2V0IGRvZXNuJ3QgcmV0dXJuIDAsIFNTTCB3b24ndCBiZQorICAgICAgICAgIGluaXRpYWxpemVkLgorCisgICBkb19oYW5kc2hha2UoKQorICAgICAgICAgIFBlcmZvcm0gYW4gU1NMIGhhbmRzaGFrZSAodXN1YWxseSBjYWxsZWQgYWZ0ZXIgcmVuZWdvdGlhdGUgb3IKKyAgICAgICAgICBvbmUgb2Ygc2V0X2FjY2VwdF9zdGF0ZSBvciBzZXRfYWNjZXB0X3N0YXRlKS4gVGhpcyBjYW4gcmFpc2UKKyAgICAgICAgICB0aGUgc2FtZSBleGNlcHRpb25zIGFzIHNlbmQgYW5kIHJlY3YuCisKKyAgIGZpbGVubygpCisgICAgICAgICAgUmV0cmlldmUgdGhlIGZpbGUgZGVzY3JpcHRvciBudW1iZXIgZm9yIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KKworICAgbGlzdGVuKGJhY2tsb2cpCisgICAgICAgICAgQ2FsbCB0aGUgbGlzdGVuIG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuCisKKyAgIGdldF9hcHBfZGF0YSgpCisgICAgICAgICAgUmV0cmlldmUgYXBwbGljYXRpb24gZGF0YSBhcyBzZXQgYnkgc2V0X2FwcF9kYXRhLgorCisgICBnZXRfY2lwaGVyX2xpc3QoKQorICAgICAgICAgIFJldHJpZXZlIHRoZSBsaXN0IG9mIGNpcGhlcnMgdXNlZCBieSB0aGUgQ29ubmVjdGlvbiBvYmplY3QuCisgICAgICAgICAgV0FSTklORzogVGhpcyBBUEkgaGFzIGNoYW5nZWQuIEl0IHVzZWQgdG8gdGFrZSBhbiBvcHRpb25hbAorICAgICAgICAgIHBhcmFtZXRlciBhbmQganVzdCByZXR1cm4gYSBzdHJpbmcsIGJ1dCBub3QgaXQgcmV0dXJucyB0aGUKKyAgICAgICAgICBlbnRpcmUgbGlzdCBpbiBvbmUgZ28uCisKKyAgIGdldF9jb250ZXh0KCkKKyAgICAgICAgICBSZXRyaWV2ZSB0aGUgQ29udGV4dCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29ubmVjdGlvbi4KKworICAgZ2V0X3BlZXJfY2VydGlmaWNhdGUoKQorICAgICAgICAgIFJldHJpZXZlIHRoZSBvdGhlciBzaWRlJ3MgY2VydGlmaWNhdGUgKGlmIGFueSkKKworICAgZ2V0cGVlcm5hbWUoKQorICAgICAgICAgIENhbGwgdGhlIGdldHBlZXJuYW1lIG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuCisKKyAgIGdldHNvY2tuYW1lKCkKKyAgICAgICAgICBDYWxsIHRoZSBnZXRzb2NrbmFtZSBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgorCisgICBnZXRzb2Nrb3B0KGxldmVsLCBvcHRuYW1lWywgYnVmbGVuXSkKKyAgICAgICAgICBDYWxsIHRoZSBnZXRzb2Nrb3B0IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZyBzb2NrZXQuCisKKyAgIHBlbmRpbmcoKQorICAgICAgICAgIFJldHJpZXZlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgc2FmZWx5IHJlYWQgZnJvbSB0aGUKKyAgICAgICAgICBTU0wgYnVmZmVyLgorCisgICByZWN2KGJ1ZnNpemUpCisgICAgICAgICAgUmVjZWl2ZSBkYXRhIGZyb20gdGhlIENvbm5lY3Rpb24uIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJpbmcKKyAgICAgICAgICByZXByZXNlbnRpbmcgdGhlIGRhdGEgcmVjZWl2ZWQuIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBkYXRhIHRvCisgICAgICAgICAgYmUgcmVjZWl2ZWQgYXQgb25jZSwgaXMgc3BlY2lmaWVkIGJ5IGJ1ZnNpemUuCisKKyAgIHJlbmVnb3RpYXRlKCkKKyAgICAgICAgICBSZW5lZ290aWF0ZSB0aGUgU1NMIHNlc3Npb24uIENhbGwgdGhpcyBpZiB5b3Ugd2lzaCB0byBjaGFuZ2UKKyAgICAgICAgICBjaXBoZXIgc3VpdGVzIG9yIGFueXRoaW5nIGxpa2UgdGhhdC4KKworICAgc2VuZChzdHJpbmcpCisgICAgICAgICAgU2VuZCB0aGUgc3RyaW5nIGRhdGEgdG8gdGhlIENvbm5lY3Rpb24uCisKKyAgIHNlbmRhbGwoc3RyaW5nKQorICAgICAgICAgIFNlbmQgYWxsIG9mIHRoZSBzdHJpbmcgZGF0YSB0byB0aGUgQ29ubmVjdGlvbi4gVGhpcyBjYWxscyBzZW5kCisgICAgICAgICAgcmVwZWF0ZWRseSB1bnRpbCBhbGwgZGF0YSBpcyBzZW50LiBJZiBhbiBlcnJvciBvY2N1cnMsIGl0J3MKKyAgICAgICAgICBpbXBvc3NpYmxlIHRvIHRlbGwgaG93IG11Y2ggZGF0YSBoYXMgYmVlbiBzZW50LgorCisgICBzZXRfYWNjZXB0X3N0YXRlKCkKKyAgICAgICAgICBTZXQgdGhlIGNvbm5lY3Rpb24gdG8gd29yayBpbiBzZXJ2ZXIgbW9kZS4gVGhlIGhhbmRzaGFrZSB3aWxsCisgICAgICAgICAgYmUgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHJlYWQvd3JpdGUuCisKKyAgIHNldF9hcHBfZGF0YShkYXRhKQorICAgICAgICAgIEFzc29jaWF0ZSBkYXRhIHdpdGggdGhpcyBDb25uZWN0aW9uIG9iamVjdC4gZGF0YSBjYW4gYmUKKyAgICAgICAgICByZXRyaWV2ZWQgbGF0ZXIgdXNpbmcgdGhlIGdldF9hcHBfZGF0YSBtZXRob2QuCisKKyAgIHNldF9jb25uZWN0X3N0YXRlKCkKKyAgICAgICAgICBTZXQgdGhlIGNvbm5lY3Rpb24gdG8gd29yayBpbiBjbGllbnQgbW9kZS4gVGhlIGhhbmRzaGFrZSB3aWxsCisgICAgICAgICAgYmUgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHJlYWQvd3JpdGUuCisKKyAgIHNldGJsb2NraW5nKGZsYWcpCisgICAgICAgICAgQ2FsbCB0aGUgc2V0YmxvY2tpbmcgbWV0aG9kIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KKworICAgc2V0c29ja29wdChsZXZlbCwgb3B0bmFtZSwgdmFsdWUpCisgICAgICAgICAgQ2FsbCB0aGUgc2V0c29ja29wdCBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmcgc29ja2V0LgorCisgICBzaHV0ZG93bigpCisgICAgICAgICAgU2VuZCB0aGUgc2h1dGRvd24gbWVzc2FnZSB0byB0aGUgQ29ubmVjdGlvbi4gUmV0dXJucyB0cnVlIGlmCisgICAgICAgICAgdGhlIHNodXRkb3duIG1lc3NhZ2UgZXhjaGFuZ2UgaXMgY29tcGxldGVkIGFuZCBmYWxzZSBvdGhlcndpc2UKKyAgICAgICAgICAoaW4gd2hpY2ggY2FzZSB5b3UgY2FsbCByZWN2KCkgb3Igc2VuZCgpIHdoZW4gdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgICBiZWNvbWVzIHJlYWRhYmxlL3dyaXRlYWJsZS4KKworICAgc29ja19zaHV0ZG93bihob3cpCisgICAgICAgICAgQ2FsbCB0aGUgc2h1dGRvd24gbWV0aG9kIG9mIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4KKworICAgc3RhdGVfc3RyaW5nKCkKKyAgICAgICAgICBSZXRyaWV2ZSBhIHZlcmJvc2Ugc3RyaW5nIGRldGFpbGluZyB0aGUgc3RhdGUgb2YgdGhlCisgICAgICAgICAgQ29ubmVjdGlvbi4KKworICAgd2FudF9yZWFkKCkKKyAgICAgICAgICBDaGVja3MgaWYgbW9yZSBkYXRhIGhhcyB0byBiZSByZWFkIGZyb20gdGhlIHRyYW5zcG9ydCBsYXllciB0bworICAgICAgICAgIGNvbXBsZXRlIGFuIG9wZXJhdGlvbi4KKworICAgd2FudF93cml0ZSgpCisgICAgICAgICAgQ2hlY2tzIGlmIHRoZXJlIGlzIGRhdGEgdG8gd3JpdGUgdG8gdGhlIHRyYW5zcG9ydCBsYXllciB0bworICAgICAgICAgIGNvbXBsZXRlIGFuIG9wZXJhdGlvbi4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCBJbnRlcm5hbHMKKworICAgV2UgcmFuIGludG8gdGhyZWUgbWFpbiBwcm9ibGVtcyBkZXZlbG9waW5nIHRoaXM6IEV4Y2VwdGlvbnMsIGNhbGxiYWNrcworICAgYW5kIGFjY2Vzc2luZyBzb2NrZXQgbWV0aG9kcy4gVGhpcyBpcyB3aGF0IHRoaXMgY2hhcHRlciBpcyBhYm91dC4gCisKKworNC4xIEV4Y2VwdGlvbnMKKworICAgV2UgcmVhbGl6ZWQgZWFybHkgdGhhdCBtb3N0IG9mIHRoZSBleGNlcHRpb25zIHdvdWxkIGJlIHJhaXNlZCBieSB0aGUKKyAgIEkvTyBmdW5jdGlvbnMgb2YgT3BlblNTTCwgc28gaXQgZmVsdCBuYXR1cmFsIHRvIG1pbWljIE9wZW5TU0wncyBlcnJvcgorICAgY29kZSBzeXN0ZW0sIHRyYW5zbGF0aW5nIHRoZW0gaW50byBQeXRob24gZXhjZXB0aW9ucy4gVGhpcyBuYXR1cmFsbHkKKyAgIGdpdmVzIHVzIHRoZSBleGNlcHRpb25zIFNTTC5aZXJvUmV0dXJuRXJyb3IsIFNTTC5XYW50UmVhZEVycm9yLAorICAgU1NMLldhbnRXcml0ZUVycm9yLCBTU0wuV2FudFg1MDlMb29rdXBFcnJvciBhbmQgU1NMLlN5c0NhbGxFcnJvci4gCisKKyAgIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMsIHNlZSBzZWN0aW9uIDMuMy4gCisKKworNC4yIENhbGxiYWNrcworCisgICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgcHJvYmxlbXMgd2l0aCBjYWxsYmFja3MuIEZpcnN0IG9mIGFsbCwgT3BlblNTTAorICAgaXMgd3JpdHRlbiBhcyBhIEMgbGlicmFyeSwgaXQncyBub3QgbWVhbnQgdG8gaGF2ZSBQeXRob24gY2FsbGJhY2tzLCBzbworICAgYSB3YXkgYXJvdW5kIHRoYXQgaXMgbmVlZGVkLiBBbm90aGVyIHByb2JsZW0gaXMgdGhyZWFkIHN1cHBvcnQuIEEgbG90CisgICBvZiB0aGUgT3BlblNTTCBJL08gZnVuY3Rpb25zIGNhbiBibG9jayBpZiB0aGUgc29ja2V0IGlzIGluIGJsb2NraW5nCisgICBtb2RlLCBhbmQgdGhlbiB5b3Ugd2FudCBvdGhlciBQeXRob24gdGhyZWFkcyB0byBiZSBhYmxlIHRvIGRvIG90aGVyCisgICB0aGluZ3MuIFRoZSByZWFsIHRyb3VibGUgaXMgaWYgeW91J3ZlIHJlbGVhc2VkIHRoZSB0aHJlYWQgbG9jayB0byBkbyBhCisgICBwb3RlbnRpYWxseSBibG9ja2luZyBvcGVyYXRpb24sIGFuZCB0aGUgb3BlcmF0aW9uIGNhbGxzIGEgY2FsbGJhY2suCisgICBUaGVuIHdlIG11c3QgdGFrZSB0aGUgdGhyZWFkIGxvY2sgYmFja141LiAKKworICAgVGhlcmUgYXJlIHR3byBzb2x1dGlvbnMgdG8gdGhlIGZpcnN0IHByb2JsZW0sIGJvdGggb2Ygd2hpY2ggYXJlCisgICBuZWNlc3NhcnkuIFRoZSBmaXJzdCBzb2x1dGlvbiB0byB1c2UgaXMgaWYgdGhlIEMgY2FsbGJhY2sgYWxsb3dzCisgICAnJ3VzZXJkYXRhJycgdG8gYmUgcGFzc2VkIHRvIGl0IChhbiBhcmJpdHJhcnkgcG9pbnRlciBub3JtYWxseSkuIFRoaXMKKyAgIGlzIGdyZWF0ISBXZSBjYW4gc2V0IG91ciBQeXRob24gZnVuY3Rpb24gb2JqZWN0IGFzIHRoZSByZWFsIHVzZXJkYXRhCisgICBhbmQgZW11bGF0ZSB1c2VyZGF0YSBmb3IgdGhlIFB5dGhvbiBmdW5jdGlvbiBpbiBhbm90aGVyIHdheS4gVGhlIG90aGVyCisgICBzb2x1dGlvbiBjYW4gYmUgdXNlZCBpZiBhbiBvYmplY3Qgd2l0aCBhbiAnJ2FwcF9kYXRhJycgc3lzdGVtIGFsd2F5cworICAgaXMgcGFzc2VkIHRvIHRoZSBjYWxsYmFjay4gRm9yIGV4YW1wbGUsIHRoZSBTU0wgb2JqZWN0IGluIE9wZW5TU0wgaGFzCisgICBhcHBfZGF0YSBmdW5jdGlvbnMgYW5kIGluIGUuZy4gdGhlIHZlcmlmaWNhdGlvbiBjYWxsYmFja3MsIHlvdSBjYW4KKyAgIHJldHJpZXZlIHRoZSByZWxhdGVkIFNTTCBvYmplY3QuIFdoYXQgd2UgZG8gaXMgdG8gc2V0IG91ciB3cmFwcGVyCisgICBDb25uZWN0aW9uIG9iamVjdCBhcyBhcHBfZGF0YSBmb3IgdGhlIFNTTCBvYmplY3QsIGFuZCB3ZSBjYW4gZWFzaWx5CisgICBmaW5kIHRoZSBQeXRob24gY2FsbGJhY2suIAorCisgICBUaGUgb3RoZXIgcHJvYmxlbSBpcyBhbHNvIHBhcnRpYWxseSBzb2x2ZWQgYnkgYXBwX2RhdGEuIFNpbmNlIHdlJ3JlCisgICBhc3NvY2lhdGluZyBvdXIgd3JhcHBlciBvYmplY3RzIHdpdGggdGhlICcncmVhbCcnIG9iamVjdHMsIHdlIGNhbgorICAgZWFzaWx5IGFjY2VzcyBkYXRhIGZyb20gdGhlIENvbm5lY3Rpb24gb2JqZWN0LiBUaGUgc29sdXRpb24gdGhlbiBpcyB0bworICAgc2ltcGx5IGluY2x1ZGUgYSBQeVRocmVhZFN0YXRlIHZhcmlhYmxlIGluIHRoZSBDb25uZWN0aW9uIGRlY2xhcmF0aW9uLAorICAgYW5kIHdyaXRlIG1hY3JvcyBzaW1pbGFyIHRvIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMgYW5kCisgICBQeV9FTkRfQUxMT1dfVEhSRUFEUyB0aGF0IGFsbG93cyBzcGVjaWZ5aW5nIG9mIHRoZSBQeVRocmVhZFN0YXRlCisgICB2YXJpYWJsZSB0byB1c2UuIE5vdyB3ZSBjYW4gc2ltcGx5ICcnYmVnaW4gYWxsb3cgdGhyZWFkcycnIGJlZm9yZSBhCisgICBwb3RlbnRpYWxseSBibG9ja2luZyBvcGVyYXRpb24sIGFuZCAnJ2VuZCBhbGxvdyB0aHJlYWRzJycgYmVmb3JlCisgICBjYWxsaW5nIGEgY2FsbGJhY2suIAorCisKKzQuMyBBY2Vzc2luZyBTb2NrZXQgTWV0aG9kcworCisgICBXZSBxdWlja2x5IHNhdyB0aGUgYmVuZWZpdCBvZiB3cmFwcGluZyBzb2NrZXQgbWV0aG9kcyBpbiB0aGUKKyAgIFNTTC5Db25uZWN0aW9uIGNsYXNzLCBmb3IgYW4gZWFzeSB0cmFuc2l0aW9uIGludG8gdXNpbmcgU1NMLiBUaGUKKyAgIHByb2JsZW0gaGVyZSBpcyB0aGF0IHRoZSBzb2NrZXQgbW9kdWxlIGxhY2tzIGEgQyBBUEksIGFuZCBhbGwgdGhlCisgICBtZXRob2RzIGFyZSBkZWNsYXJlZCBzdGF0aWMuIE9uZSBhcHByb2FjaCB3b3VsZCBiZSB0byBoYXZlIE9wZW5TU0wgYXMKKyAgIGEgc3VibW9kdWxlIHRvIHRoZSBzb2NrZXQgbW9kdWxlLCBwbGFjaW5nIGFsbCB0aGUgY29kZSBpbgorICAgc29ja2V0bW9kdWxlLmMsIGJ1dCB0aGlzIGlzIG9idmlvdXNseSBub3QgYSBnb29kIHNvbHV0aW9uLCBzaW5jZSB5b3UKKyAgIG1pZ2h0IG5vdCB3YW50IHRvIGltcG9ydCB0b25uZXMgb2YgZXh0cmEgc3R1ZmYgeW91J3JlIG5vdCBnb2luZyB0byB1c2UKKyAgIHdoZW4gaW1wb3J0aW5nIHRoZSBzb2NrZXQgbW9kdWxlLiBUaGUgb3RoZXIgYXBwcm9hY2ggaXMgdG8gc29tZWhvdyBnZXQKKyAgIGEgcG9pbnRlciB0byB0aGUgbWV0aG9kIHRvIGJlIGNhbGxlZCwgZWl0aGVyIHRoZSBDIGZ1bmN0aW9uLCBvciBhCisgICBjYWxsYWJsZSBQeXRob24gb2JqZWN0LiBUaGlzIGlzIG5vdCByZWFsbHkgYSBnb29kIHNvbHV0aW9uIGVpdGhlciwKKyAgIHNpbmNlIHRoZXJlJ3MgYSBsb3Qgb2YgbG9va3VwcyBpbnZvbHZlZC4gCisKKyAgIFRoZSB3YXkgaXQgd29ya3MgaXMgdGhhdCB5b3UgaGF2ZSB0byBzdXBwbHkgYSBgYHNvY2tldC1saWtlJycKKyAgIHRyYW5zcG9ydCBvYmplY3QgdG8gdGhlIFNTTC5Db25uZWN0aW9uLiBUaGUgb25seSByZXF1aXJlbWVudCBvZiB0aGlzCisgICBvYmplY3QgaXMgdGhhdCBpdCBoYXMgYSBmaWxlbm8oKSBtZXRob2QgdGhhdCByZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yCisgICB0aGF0J3MgdmFsaWQgYXQgdGhlIEMgbGV2ZWwgKGkuZS4geW91IGNhbiB1c2UgdGhlIHN5c3RlbSBjYWxscyByZWFkCisgICBhbmQgd3JpdGUpLiBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIGNvbm5lY3QoKSBvciBhY2NlcHQoKSBtZXRob2RzIG9mCisgICB0aGUgU1NMLkNvbm5lY3Rpb24gb2JqZWN0LCB0aGUgdHJhbnNwb3J0IG9iamVjdCBoYXMgdG8gc3VwcGx5IHN1Y2gKKyAgIG1ldGhvZHMgdG9vLiBBcGFydCBmcm9tIHRoZW0sIGFueSBtZXRob2QgbG9va3VwcyBpbiB0aGUgU1NMLkNvbm5lY3Rpb24KKyAgIG9iamVjdCB0aGF0IGZhaWwgYXJlIHBhc3NlZCBvbiB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgb2JqZWN0LiAKKworICAgRnV0dXJlIGNoYW5nZXMgbWlnaHQgYmUgdG8gYWxsb3cgUHl0aG9uLWxldmVsIHRyYW5zcG9ydCBvYmplY3RzLCB0aGF0CisgICBpbnN0ZWFkIG9mIGhhdmluZyBmaWxlbm8oKSBtZXRob2RzLCBoYXZlIHJlYWQoKSBhbmQgd3JpdGUoKSBtZXRob2RzLAorICAgc28gbW9yZSBhZHZhbmNlZCBmZWF0dXJlcyBvZiBQeXRob24gY2FuIGJlIHVzZWQuIFRoaXMgd291bGQgcHJvYmFibHkKKyAgIGVudGFpbCBzb21lIHNvcnQgb2YgT3BlblNTTCBgYEJJT3MnJywgYnV0IGNvbnZlcnRpbmcgUHl0aG9uIHN0cmluZ3MKKyAgIGJhY2sgYW5kIGZvcnRoIGlzIGV4cGVuc2l2ZSwgc28gdGhpcyBzaG91bGRuJ3QgYmUgdXNlZCB1bmxlc3MKKyAgIG5lY2Vzc2FyeS4gT3RoZXIgbmljZSB0aGluZ3Mgd291bGQgYmUgdG8gYmUgYWJsZSB0byBwYXNzIGluIGRpZmZlcmVudAorICAgdHJhbnNwb3J0IG9iamVjdHMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcsIGJ1dCB0aGVuIHRoZSBmaWxlbm8oKQorICAgbWV0aG9kIG9mIFNTTC5Db25uZWN0aW9uIGJlY29tZXMgdmlydHVhbGx5IHVzZWxlc3MuIEFsc28sIHNob3VsZCB0aGUKKyAgIG1ldGhvZCByZXNvbHV0aW9uIGJlIHVzZWQgb24gdGhlIHJlYWQtdHJhbnNwb3J0IG9yIHRoZQorICAgd3JpdGUtdHJhbnNwb3J0PyAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFib3V0IHRoaXMgZG9jdW1lbnQgLi4uCisKKyAgIFB5dGhvbiBPcGVuU1NMIE1hbnVhbAorCisgICBUaGlzIGRvY3VtZW50IHdhcyBnZW5lcmF0ZWQgdXNpbmcgdGhlIExhVGVYMkhUTUwgdHJhbnNsYXRvci4KKworICAgTGFUZVgySFRNTCBpcyBDb3B5cmlnaHQgqSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCBOaWtvcyBEcmFrb3MsCisgICBDb21wdXRlciBCYXNlZCBMZWFybmluZyBVbml0LCBVbml2ZXJzaXR5IG9mIExlZWRzLCBhbmQgQ29weXJpZ2h0IKkKKyAgIDE5OTcsIDE5OTgsIFJvc3MgTW9vcmUsIE1hdGhlbWF0aWNzIERlcGFydG1lbnQsIE1hY3F1YXJpZSBVbml2ZXJzaXR5LAorICAgU3lkbmV5LgorCisgICBUaGUgYXBwbGljYXRpb24gb2YgTGFUZVgySFRNTCB0byB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24gaGFzIGJlZW4KKyAgIGhlYXZpbHkgdGFpbG9yZWQgYnkgRnJlZCBMLiBEcmFrZSwgSnIuIE9yaWdpbmFsIG5hdmlnYXRpb24gaWNvbnMgd2VyZQorICAgY29udHJpYnV0ZWQgYnkgQ2hyaXN0b3BoZXIgUGV0cmlsbGkuCisgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgICBGb290bm90ZXMKKworICAgLi4uIE0yQ3J5cHRvXjEKKyAgICAgICAgICBTZWUgaHR0cDovL3d3dy5wb3N0MS5jb20vaG9tZS9uZ3BzL20yLworCisgICAuLi4gU1dJR14yCisgICAgICAgICAgU2VlIGh0dHA6Ly9zd2lnLnNvdXJjZWZvcmdlLm5ldC8KKworICAgLi4uIERhZW1vbl4zCisgICAgICAgICAgU2VlIGh0dHA6Ly93d3cubG90aGFyLmNvbS90ZWNoL2NyeXB0by8KKworICAgLi4uIHNvY2tldF40CisgICAgICAgICAgQWN0dWFsbHksIGFsbCB0aGF0IGlzIHJlcXVpcmVkIGlzIGFuIG9iamVjdCB0aGF0IGJlaGF2ZXMgbGlrZSBhCisgICAgICAgICAgc29ja2V0LCB5b3UgY291bGQgZXZlbiB1c2UgZmlsZXMsIGV2ZW4gdGhvdWdoIGl0J2QgYmUgdHJpY2t5IHRvCisgICAgICAgICAgZ2V0IHRoZSBoYW5kc2hha2VzIHJpZ2h0IQorCisgICAuLi4gYmFja141CisgICAgICAgICAgSSdtIG5vdCBzdXJlIHdoeSB0aGlzIGlzIG5lY2Vzc2FyeSwgYnV0IG90aGVyd2lzZSBJIGdldCBhCisgICAgICAgICAgc2VnbWVudGF0aW9uIHZpb2xhdGlvbiBvbiBQeUV2YWxfQ2FsbE9iamVjdAorICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeXRob24gT3BlblNTTCBNYW51YWwKKyAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworICAgUmVsZWFzZSAwLjYuCmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvYW5uby1hcGkucHkgYi9kb2MvdG9vbHMvYW5uby1hcGkucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGQzNTVkMgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy9hbm5vLWFwaS5weQpAQCAtMCwwICsxLDcxIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisiIiJBZGQgcmVmZXJlbmNlIGNvdW50IGFubm90YXRpb25zIHRvIHRoZSBQeXRob24vQyBBUEkgUmVmZXJlbmNlLiIiIgorX192ZXJzaW9uX18gPSAnJFJldmlzaW9uOiAxLjEuMS4xICQnCisKK2ltcG9ydCBnZXRvcHQKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitpbXBvcnQgcmVmY291bnRzCisKKworUFJFRklYXzEgPSByIlxiZWdpbntjZnVuY2Rlc2N9e1B5T2JqZWN0Kn17IgorUFJFRklYXzIgPSByIlxiZWdpbntjZnVuY2Rlc2N9e1B5VmFyT2JqZWN0Kn17IgorCisKK2RlZiBtYWluKCk6CisgICAgcmNmaWxlID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShyZWZjb3VudHMuX19maWxlX18pLCBvcy5wYXJkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhcGkiLCAicmVmY291bnRzLmRhdCIpCisgICAgb3V0ZmlsZSA9ICItIgorICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgIm86cjoiLCBbIm91dHB1dD0iLCAicmVmY291bnRzPSJdKQorICAgIGZvciBvcHQsIGFyZyBpbiBvcHRzOgorICAgICAgICBpZiBvcHQgaW4gKCItbyIsICItLW91dHB1dCIpOgorICAgICAgICAgICAgb3V0ZmlsZSA9IGFyZworICAgICAgICBlbGlmIG9wdCBpbiAoIi1yIiwgIi0tcmVmY291bnRzIik6CisgICAgICAgICAgICByY2ZpbGUgPSBhcmcKKyAgICByY2RpY3QgPSByZWZjb3VudHMubG9hZChyY2ZpbGUpCisgICAgaWYgb3V0ZmlsZSA9PSAiLSI6CisgICAgICAgIG91dHB1dCA9IHN5cy5zdGRvdXQKKyAgICBlbHNlOgorICAgICAgICBvdXRwdXQgPSBvcGVuKG91dGZpbGUsICJ3IikKKyAgICBpZiBub3QgYXJnczoKKyAgICAgICAgYXJncyA9IFsiLSJdCisgICAgZm9yIGluZmlsZSBpbiBhcmdzOgorICAgICAgICBpZiBpbmZpbGUgPT0gIi0iOgorICAgICAgICAgICAgaW5wdXQgPSBzeXMuc3RkaW4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlucHV0ID0gb3BlbihpbmZpbGUpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gaW5wdXQucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHByZWZpeCA9IE5vbmUKKyAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aChQUkVGSVhfMSk6CisgICAgICAgICAgICAgICAgcHJlZml4ID0gUFJFRklYXzEKKyAgICAgICAgICAgIGVsaWYgbGluZS5zdGFydHN3aXRoKFBSRUZJWF8yKToKKyAgICAgICAgICAgICAgICBwcmVmaXggPSBQUkVGSVhfMgorICAgICAgICAgICAgaWYgcHJlZml4OgorICAgICAgICAgICAgICAgIHMgPSBsaW5lW2xlbihwcmVmaXgpOl0uc3BsaXQoJ30nLCAxKVswXQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9IHJjZGljdFtzXQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiTm8gcmVmY291bnQgZGF0YSBmb3IgJXNcbiIgJSBzKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIGluZm8ucmVzdWx0X3R5cGUgaW4gKCJQeU9iamVjdCoiLCAiUHlWYXJPYmplY3QqIik6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpbmZvLnJlc3VsdF9yZWZzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAiQWx3YXlzIFxOVUxMe30iCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gaW5mby5yZXN1bHRfcmVmcyBhbmQgIk5ldyIgb3IgIkJvcnJvd2VkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gcmMgKyAiIHJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSAociJcYmVnaW57Y2Z1bmNkZXNjfVslc117JXN9eyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAocmMsIGluZm8ucmVzdWx0X3R5cGUpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGluZVtsZW4ocHJlZml4KTpdCisgICAgICAgICAgICBvdXRwdXQud3JpdGUobGluZSkKKyAgICAgICAgaWYgaW5maWxlICE9ICItIjoKKyAgICAgICAgICAgIGlucHV0LmNsb3NlKCkKKyAgICBpZiBvdXRmaWxlICE9ICItIjoKKyAgICAgICAgb3V0cHV0LmNsb3NlKCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2J1aWxkaW5kZXgucHkgYi9kb2MvdG9vbHMvYnVpbGRpbmRleC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YTQxYzBlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL2J1aWxkaW5kZXgucHkKQEAgLTAsMCArMSwzNTMgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworX192ZXJzaW9uX18gPSAnJFJldmlzaW9uOiAxLjEuMS4xICQnCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3RyaW5nCitpbXBvcnQgc3lzCisKKworY2xhc3MgTm9kZToKKyAgICBfX3JtanVuayA9IHJlLmNvbXBpbGUoIjwjXGQrIz4iKQorCisgICAgY29udGludWF0aW9uID0gMAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbmssIHN0ciwgc2Vxbm8pOgorICAgICAgICBzZWxmLmxpbmtzID0gW2xpbmtdCisgICAgICAgIHNlbGYuc2Vxbm8gPSBzZXFubworICAgICAgICAjIHJlbW92ZSA8I1xkKyM+IGxlZnQgaW4gYnkgbW92aW5nIHRoZSBkYXRhIG91dCBvZiBMYVRlWDJIVE1MCisgICAgICAgIHN0ciA9IHNlbGYuX19ybWp1bmsuc3ViKCcnLCBzdHIpCisgICAgICAgICMgYnVpbGQgdXAgdGhlIHRleHQKKyAgICAgICAgc2VsZi50ZXh0ID0gc3BsaXRfZW50cnlfdGV4dChzdHIpCisgICAgICAgIHNlbGYua2V5ID0gc3BsaXRfZW50cnlfa2V5KHN0cikKKworICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiQ29tcGFyaXNvbiBvcGVyYXRvciBpbmNsdWRlcyBzZXF1ZW5jZSBudW1iZXIsIGZvciB1c2Ugd2l0aAorICAgICAgICBsaXN0LnNvcnQoKS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuY21wX2VudHJ5KG90aGVyKSBvciBjbXAoc2VsZi5zZXFubywgb3RoZXIuc2Vxbm8pCisKKyAgICBkZWYgY21wX2VudHJ5KHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiQ29tcGFyaXNvbiAnb3BlcmF0b3InIHRoYXQgaWdub3JlcyBzZXF1ZW5jZSBudW1iZXIuIiIiCisgICAgICAgIGMgPSAwCisgICAgICAgIGZvciBpIGluIHJhbmdlKG1pbihsZW4oc2VsZi5rZXkpLCBsZW4ob3RoZXIua2V5KSkpOgorICAgICAgICAgICAgYyA9IChjbXBfcGFydChzZWxmLmtleVtpXSwgb3RoZXIua2V5W2ldKQorICAgICAgICAgICAgICAgICBvciBjbXBfcGFydChzZWxmLnRleHRbaV0sIG90aGVyLnRleHRbaV0pKQorICAgICAgICAgICAgaWYgYzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gYyBvciBjbXAoc2VsZi5rZXksIG90aGVyLmtleSkgb3IgY21wKHNlbGYudGV4dCwgb3RoZXIudGV4dCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICI8Tm9kZSBmb3IgJXMgKCVzKT4iICUgKHN0cmluZy5qb2luKHNlbGYudGV4dCwgJyEnKSwgc2VsZi5zZXFubykKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc3RyaW5nLmpvaW4oc2VsZi5rZXksICchJykKKworICAgIGRlZiBkdW1wKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzXDElcyMjIyVzXG4iIFwKKyAgICAgICAgICAgICAgICUgKHN0cmluZy5qb2luKHNlbGYubGlua3MsICJcMSIpLAorICAgICAgICAgICAgICAgICAgc3RyaW5nLmpvaW4oc2VsZi50ZXh0LCAnIScpLAorICAgICAgICAgICAgICAgICAgc2VsZi5zZXFubykKKworCitkZWYgY21wX3BhcnQoczEsIHMyKToKKyAgICByZXN1bHQgPSBjbXAoczEsIHMyKQorICAgIGlmIHJlc3VsdCA9PSAwOgorICAgICAgICByZXR1cm4gMAorICAgIGwxID0gc3RyaW5nLmxvd2VyKHMxKQorICAgIGwyID0gc3RyaW5nLmxvd2VyKHMyKQorICAgIG1pbmxlbiA9IG1pbihsZW4oczEpLCBsZW4oczIpKQorICAgIGlmIGxlbihzMSkgPCBsZW4oczIpIGFuZCBsMSA9PSBsMls6bGVuKHMxKV06CisgICAgICAgIHJlc3VsdCA9IC0xCisgICAgZWxpZiBsZW4oczIpIDwgbGVuKHMxKSBhbmQgbDIgPT0gbDFbOmxlbihzMildOgorICAgICAgICByZXN1bHQgPSAxCisgICAgZWxzZToKKyAgICAgICAgcmVzdWx0ID0gY21wKGwxLCBsMikgb3IgY21wKHMxLCBzMikKKyAgICByZXR1cm4gcmVzdWx0CisKKworZGVmIHNwbGl0X2VudHJ5KHN0ciwgd2hpY2gpOgorICAgIHN0dWZmID0gW10KKyAgICBwYXJ0cyA9IHN0cmluZy5zcGxpdChzdHIsICchJykKKyAgICBwYXJ0cyA9IG1hcChzdHJpbmcuc3BsaXQsIHBhcnRzLCBbJ0AnXSAqIGxlbihwYXJ0cykpCisgICAgZm9yIGVudHJ5IGluIHBhcnRzOgorICAgICAgICBpZiBsZW4oZW50cnkpICE9IDE6CisgICAgICAgICAgICBrZXkgPSBlbnRyeVt3aGljaF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGtleSA9IGVudHJ5WzBdCisgICAgICAgIHN0dWZmLmFwcGVuZChrZXkpCisgICAgcmV0dXJuIHN0dWZmCisKKworX3JtdHQgPSByZS5jb21waWxlKHIiIiIoLiopPHR0KD86IGNsYXNzPVsnIl1bYS16MC05XStbIiddKT8+KC4qKTwvdHQ+KC4qKSQiIiIsCisgICAgICAgICAgICAgICAgICAgcmUuSUdOT1JFQ0FTRSkKK19ybXBhcmVucyA9IHJlLmNvbXBpbGUociJcKFwpIikKKworZGVmIHNwbGl0X2VudHJ5X2tleShzdHIpOgorICAgIHBhcnRzID0gc3BsaXRfZW50cnkoc3RyLCAxKQorICAgIGZvciBpIGluIHJhbmdlKGxlbihwYXJ0cykpOgorICAgICAgICBtID0gX3JtdHQubWF0Y2gocGFydHNbaV0pCisgICAgICAgIGlmIG06CisgICAgICAgICAgICBwYXJ0c1tpXSA9IHN0cmluZy5qb2luKG0uZ3JvdXAoMSwgMiwgMyksICcnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFydHNbaV0gPSBzdHJpbmcubG93ZXIocGFydHNbaV0pCisgICAgICAgICMgcmVtb3ZlICcoKScgZnJvbSB0aGUga2V5OgorICAgICAgICBwYXJ0c1tpXSA9IF9ybXBhcmVucy5zdWIoJycsIHBhcnRzW2ldKQorICAgIHJldHVybiBtYXAodHJpbV9pZ25vcmVkX2xldHRlcnMsIHBhcnRzKQorCisKK2RlZiBzcGxpdF9lbnRyeV90ZXh0KHN0cik6CisgICAgaWYgJzwnIGluIHN0cjoKKyAgICAgICAgbSA9IF9ybXR0Lm1hdGNoKHN0cikKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIHN0ciA9IHN0cmluZy5qb2luKG0uZ3JvdXAoMSwgMiwgMyksICcnKQorICAgIHJldHVybiBzcGxpdF9lbnRyeShzdHIsIDEpCisKKworZGVmIGxvYWQoZnApOgorICAgIG5vZGVzID0gW10KKyAgICByeCA9IHJlLmNvbXBpbGUoIiguKilcMSguKikjIyMoLiopJCIpCisgICAgd2hpbGUgMToKKyAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICBicmVhaworICAgICAgICBtID0gcngubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIGxpbmssIHN0ciwgc2Vxbm8gPSBtLmdyb3VwKDEsIDIsIDMpCisgICAgICAgICAgICBub2Rlcy5hcHBlbmQoTm9kZShsaW5rLCBzdHIsIHNlcW5vKSkKKyAgICByZXR1cm4gbm9kZXMKKworCitkZWYgdHJpbV9pZ25vcmVkX2xldHRlcnMocyk6CisgICAgIyBpZ25vcmUgJCB0byBrZWVwIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aXRoIHRoZQorICAgICMgbGVhZGluZyBsZXR0ZXIgZnJvbSB0aGUgbmFtZQorICAgIHMgPSBzdHJpbmcubG93ZXIocykKKyAgICBpZiBzWzBdID09ICIkIjoKKyAgICAgICAgcmV0dXJuIHNbMTpdCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHMKKworZGVmIGdldF9maXJzdF9sZXR0ZXIocyk6CisgICAgcmV0dXJuIHN0cmluZy5sb3dlcih0cmltX2lnbm9yZWRfbGV0dGVycyhzKVswXSkKKworCitkZWYgc3BsaXRfbGV0dGVycyhub2Rlcyk6CisgICAgbGV0dGVyX2dyb3VwcyA9IFtdCisgICAgaWYgbm9kZXM6CisgICAgICAgIGdyb3VwID0gW10KKyAgICAgICAgYXBwZW5kID0gZ3JvdXAuYXBwZW5kCisgICAgICAgIGxldHRlciA9IGdldF9maXJzdF9sZXR0ZXIobm9kZXNbMF0udGV4dFswXSkKKyAgICAgICAgbGV0dGVyX2dyb3Vwcy5hcHBlbmQoKGxldHRlciwgZ3JvdXApKQorICAgICAgICBmb3Igbm9kZSBpbiBub2RlczoKKyAgICAgICAgICAgIG5sZXR0ZXIgPSBnZXRfZmlyc3RfbGV0dGVyKG5vZGUudGV4dFswXSkKKyAgICAgICAgICAgIGlmIGxldHRlciAhPSBubGV0dGVyOgorICAgICAgICAgICAgICAgIGxldHRlciA9IG5sZXR0ZXIKKyAgICAgICAgICAgICAgICBncm91cCA9IFtdCisgICAgICAgICAgICAgICAgbGV0dGVyX2dyb3Vwcy5hcHBlbmQoKGxldHRlciwgZ3JvdXApKQorICAgICAgICAgICAgICAgIGFwcGVuZCA9IGdyb3VwLmFwcGVuZAorICAgICAgICAgICAgYXBwZW5kKG5vZGUpCisgICAgcmV0dXJuIGxldHRlcl9ncm91cHMKKworCisjIG5lZWQgYSBmdW5jdGlvbiB0byBzZXBhcmF0ZSB0aGUgbm9kZXMgaW50byBjb2x1bW5zLi4uCitkZWYgc3BsaXRfY29sdW1ucyhub2RlcywgY29sdW1ucz0xKToKKyAgICBpZiBjb2x1bW5zIDw9IDE6CisgICAgICAgIHJldHVybiBbbm9kZXNdCisgICAgIyBUaGlzIGlzIGEgcm91Z2ggaGVpZ2h0OyB3ZSBtYXkgaGF2ZSB0byBpbmNyZWFzZSB0byBhdm9pZCBicmVha3MgYmVmb3JlCisgICAgIyBhIHN1Yml0ZW0uCisgICAgY29saGVpZ2h0ID0gbGVuKG5vZGVzKSAvIGNvbHVtbnMKKyAgICBudW1sb25nID0gbGVuKG5vZGVzKSAlIGNvbHVtbnMKKyAgICBpZiBudW1sb25nOgorICAgICAgICBjb2xoZWlnaHQgPSBjb2xoZWlnaHQgKyAxCisgICAgZWxzZToKKyAgICAgICAgbnVtbG9uZyA9IGNvbHVtbnMKKyAgICBjb2xzID0gW10KKyAgICBmb3IgaSBpbiByYW5nZShudW1sb25nKToKKyAgICAgICAgc3RhcnQgPSBpICogY29saGVpZ2h0CisgICAgICAgIGVuZCA9IHN0YXJ0ICsgY29saGVpZ2h0CisgICAgICAgIGNvbHMuYXBwZW5kKG5vZGVzW3N0YXJ0OmVuZF0pCisgICAgZGVsIG5vZGVzWzplbmRdCisgICAgY29saGVpZ2h0ID0gY29saGVpZ2h0IC0gMQorICAgIHRyeToKKyAgICAgICAgbnVtc2hvcnQgPSBsZW4obm9kZXMpIC8gY29saGVpZ2h0CisgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgICAgICBjb2xzID0gY29scyArIChjb2x1bW5zIC0gbGVuKGNvbHMpKSAqIFtbXV0KKyAgICBlbHNlOgorICAgICAgICBmb3IgaSBpbiByYW5nZShudW1zaG9ydCk6CisgICAgICAgICAgICBzdGFydCA9IGkgKiBjb2xoZWlnaHQKKyAgICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgY29saGVpZ2h0CisgICAgICAgICAgICBjb2xzLmFwcGVuZChub2Rlc1tzdGFydDplbmRdKQorICAgICMKKyAgICAjIElmIGl0ZW1zIGNvbnRpbnVlIGFjcm9zcyBjb2x1bW5zLCBtYWtlIHN1cmUgdGhleSBhcmUgbWFya2VkCisgICAgIyBhcyBjb250aW51YXRpb25zIHNvIHRoZSB1c2VyIGtub3dzIHRvIGxvb2sgYXQgdGhlIHByZXZpb3VzIGNvbHVtbi4KKyAgICAjCisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGNvbHMpIC0gMSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByZXYgPSBjb2xzW2ldWy0xXQorICAgICAgICAgICAgbmV4dCA9IGNvbHNbaSArIDFdWzBdCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgcmV0dXJuIGNvbHMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG4gPSBtaW4obGVuKHByZXYua2V5KSwgbGVuKG5leHQua2V5KSkKKyAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKG4pOgorICAgICAgICAgICAgICAgIGlmIHByZXYua2V5W2pdICE9IG5leHQua2V5W2pdOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIG5leHQuY29udGludWF0aW9uID0gaiArIDEKKyAgICByZXR1cm4gY29scworCisKK0RMX0xFVkVMX0lOREVOVCA9ICIgICIKKworZGVmIGZvcm1hdF9jb2x1bW4obm9kZXMpOgorICAgIHN0cmluZ3MgPSBbIjxkbCBjb21wYWN0PiJdCisgICAgYXBwZW5kID0gc3RyaW5ncy5hcHBlbmQKKyAgICBsZXZlbCA9IDAKKyAgICBwcmV2aW91cyA9IFtdCisgICAgZm9yIG5vZGUgaW4gbm9kZXM6CisgICAgICAgIGN1cnJlbnQgPSBub2RlLnRleHQKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIGZvciBpIGluIHJhbmdlKG1pbihsZW4oY3VycmVudCksIGxlbihwcmV2aW91cykpKToKKyAgICAgICAgICAgIGlmIHByZXZpb3VzW2ldICE9IGN1cnJlbnRbaV06CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGNvdW50ID0gaSArIDEKKyAgICAgICAgaWYgY291bnQgPiBsZXZlbDoKKyAgICAgICAgICAgIGFwcGVuZCgiPGRsIGNvbXBhY3Q+IiAqIChjb3VudCAtIGxldmVsKSArICJcbiIpCisgICAgICAgICAgICBsZXZlbCA9IGNvdW50CisgICAgICAgIGVsaWYgbGV2ZWwgPiBjb3VudDoKKyAgICAgICAgICAgIGFwcGVuZCgiXG4iKQorICAgICAgICAgICAgYXBwZW5kKGxldmVsICogRExfTEVWRUxfSU5ERU5UKQorICAgICAgICAgICAgYXBwZW5kKCI8L2RsPiIgKiAobGV2ZWwgLSBjb3VudCkpCisgICAgICAgICAgICBsZXZlbCA9IGNvdW50CisgICAgICAgICMgZWxzZTogbGV2ZWwgPT0gY291bnQKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoY291bnQsIGxlbihjdXJyZW50KSAtIDEpOgorICAgICAgICAgICAgdGVybSA9IG5vZGUudGV4dFtpXQorICAgICAgICAgICAgbGV2ZWwgPSBsZXZlbCArIDEKKyAgICAgICAgICAgIGlmIG5vZGUuY29udGludWF0aW9uID4gaToKKyAgICAgICAgICAgICAgICBleHRyYSA9ICIgKGNvbnRpbnVlZCkiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGV4dHJhID0gIiIKKyAgICAgICAgICAgIGFwcGVuZCgiXG48ZHQ+JXMlc1xuPGRkPlxuJXM8ZGwgY29tcGFjdD4iCisgICAgICAgICAgICAgICAgICAgJSAodGVybSwgZXh0cmEsIGxldmVsICogRExfTEVWRUxfSU5ERU5UKSkKKyAgICAgICAgYXBwZW5kKCJcbiVzPGR0PiVzJXM8L2E+IgorICAgICAgICAgICAgICAgJSAobGV2ZWwgKiBETF9MRVZFTF9JTkRFTlQsIG5vZGUubGlua3NbMF0sIG5vZGUudGV4dFstMV0pKQorICAgICAgICBmb3IgbGluayBpbiBub2RlLmxpbmtzWzE6XToKKyAgICAgICAgICAgIGFwcGVuZCgiLFxuJXMgICAgJXNbTGlua108L2E+IiAlIChsZXZlbCAqIERMX0xFVkVMX0lOREVOVCwgbGluaykpCisgICAgICAgIHByZXZpb3VzID0gY3VycmVudAorICAgIGFwcGVuZCgiXG4iKQorICAgIGFwcGVuZCgiPC9kbD4iICogKGxldmVsICsgMSkpCisgICAgcmV0dXJuIHN0cmluZy5qb2luKHN0cmluZ3MsICcnKQorCisKK2RlZiBmb3JtYXRfbm9kZXMobm9kZXMsIGNvbHVtbnM9MSk6CisgICAgc3RyaW5ncyA9IFtdCisgICAgYXBwZW5kID0gc3RyaW5ncy5hcHBlbmQKKyAgICBpZiBjb2x1bW5zID4gMToKKyAgICAgICAgY29sbm9zID0gcmFuZ2UoY29sdW1ucykKKyAgICAgICAgY29saGVpZ2h0ID0gbGVuKG5vZGVzKSAvIGNvbHVtbnMKKyAgICAgICAgaWYgbGVuKG5vZGVzKSAlIGNvbHVtbnM6CisgICAgICAgICAgICBjb2xoZWlnaHQgPSBjb2xoZWlnaHQgKyAxCisgICAgICAgIGNvbHdpZHRoID0gMTAwIC8gY29sdW1ucworICAgICAgICBhcHBlbmQoJzx0YWJsZSB3aWR0aD0iMTAwJSI+PHRyIHZhbGlnbj0idG9wIj4nKQorICAgICAgICBmb3IgY29sIGluIHNwbGl0X2NvbHVtbnMobm9kZXMsIGNvbHVtbnMpOgorICAgICAgICAgICAgYXBwZW5kKCc8dGQgd2lkdGg9IiVkJSUiPlxuJyAlIGNvbHdpZHRoKQorICAgICAgICAgICAgYXBwZW5kKGZvcm1hdF9jb2x1bW4oY29sKSkKKyAgICAgICAgICAgIGFwcGVuZCgiXG48L3RkPiIpCisgICAgICAgIGFwcGVuZCgiXG48L3RyPjwvdGFibGU+IikKKyAgICBlbHNlOgorICAgICAgICBhcHBlbmQoZm9ybWF0X2NvbHVtbihub2RlcykpCisgICAgYXBwZW5kKCJcbjxwPlxuIikKKyAgICByZXR1cm4gc3RyaW5nLmpvaW4oc3RyaW5ncywgJycpCisKKworZGVmIGZvcm1hdF9sZXR0ZXIobGV0dGVyKToKKyAgICBpZiBsZXR0ZXIgPT0gJy4nOgorICAgICAgICBsZXR0ZXJuYW1lID0gIi4gKGRvdCkiCisgICAgZWxpZiBsZXR0ZXIgPT0gJ18nOgorICAgICAgICBsZXR0ZXJuYW1lID0gIl8gKHVuZGVyc2NvcmUpIgorICAgIGVsc2U6CisgICAgICAgIGxldHRlcm5hbWUgPSBzdHJpbmcudXBwZXIobGV0dGVyKQorICAgIHJldHVybiAiXG48aHI+XG48aDI+PGEgbmFtZT1cImxldHRlci0lc1wiPiVzPC9hPjwvaDI+XG5cbiIgXAorICAgICAgICAgICAlIChsZXR0ZXIsIGxldHRlcm5hbWUpCisKKworZGVmIGZvcm1hdF9odG1sX2xldHRlcnMobm9kZXMsIGNvbHVtbnM9MSk6CisgICAgbGV0dGVyX2dyb3VwcyA9IHNwbGl0X2xldHRlcnMobm9kZXMpCisgICAgaXRlbXMgPSBbXQorICAgIGZvciBsZXR0ZXIsIG5vZGVzIGluIGxldHRlcl9ncm91cHM6CisgICAgICAgIHMgPSAiPGI+PGEgaHJlZj1cIiNsZXR0ZXItJXNcIj4lczwvYT48L2I+IiAlIChsZXR0ZXIsIGxldHRlcikKKyAgICAgICAgaXRlbXMuYXBwZW5kKHMpCisgICAgcyA9IFsiPGhyPjxjZW50ZXI+XG4lczwvY2VudGVyPlxuIiAlIHN0cmluZy5qb2luKGl0ZW1zLCAiIHxcbiIpXQorICAgIGZvciBsZXR0ZXIsIG5vZGVzIGluIGxldHRlcl9ncm91cHM6CisgICAgICAgIHMuYXBwZW5kKGZvcm1hdF9sZXR0ZXIobGV0dGVyKSkKKyAgICAgICAgcy5hcHBlbmQoZm9ybWF0X25vZGVzKG5vZGVzLCBjb2x1bW5zKSkKKyAgICByZXR1cm4gc3RyaW5nLmpvaW4ocywgJycpCisKK2RlZiBmb3JtYXRfaHRtbChub2RlcywgY29sdW1ucyk6CisgICAgcmV0dXJuIGZvcm1hdF9ub2Rlcyhub2RlcywgY29sdW1ucykKKworCitkZWYgY29sbGFwc2Uobm9kZXMpOgorICAgICIiIkNvbGxhcHNlIHNlcXVlbmNlcyBvZiBub2RlcyB3aXRoIG1hdGNoaW5nIGtleXMgaW50byBhIHNpbmdsZSBub2RlLgorICAgIERlc3RydWN0aXZlLiIiIgorICAgIGlmIGxlbihub2RlcykgPCAyOgorICAgICAgICByZXR1cm4KKyAgICBwcmV2ID0gbm9kZXNbMF0KKyAgICBpID0gMQorICAgIHdoaWxlIGkgPCBsZW4obm9kZXMpOgorICAgICAgICBub2RlID0gbm9kZXNbaV0KKyAgICAgICAgaWYgbm90IG5vZGUuY21wX2VudHJ5KHByZXYpOgorICAgICAgICAgICAgcHJldi5saW5rcy5hcHBlbmQobm9kZS5saW5rc1swXSkKKyAgICAgICAgICAgIGRlbCBub2Rlc1tpXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaSA9IGkgKyAxCisgICAgICAgICAgICBwcmV2ID0gbm9kZQorCisKK2RlZiBkdW1wKG5vZGVzLCBmcCk6CisgICAgZm9yIG5vZGUgaW4gbm9kZXM6CisgICAgICAgIGZwLndyaXRlKG5vZGUuZHVtcCgpKQorCisKK2RlZiBwcm9jZXNzX25vZGVzKG5vZGVzLCBjb2x1bW5zLCBsZXR0ZXJzKToKKyAgICBub2Rlcy5zb3J0KCkKKyAgICBjb2xsYXBzZShub2RlcykKKyAgICBpZiBsZXR0ZXJzOgorICAgICAgICByZXR1cm4gZm9ybWF0X2h0bWxfbGV0dGVycyhub2RlcywgY29sdW1ucykKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gZm9ybWF0X2h0bWwobm9kZXMsIGNvbHVtbnMpCisKKworZGVmIG1haW4oKToKKyAgICBpbXBvcnQgZ2V0b3B0CisgICAgaWZuID0gIi0iCisgICAgb2ZuID0gIi0iCisgICAgY29sdW1ucyA9IDEKKyAgICBsZXR0ZXJzID0gMAorICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgImM6bG86IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImNvbHVtbnM9IiwgImxldHRlcnMiLCAib3V0cHV0PSJdKQorICAgIGZvciBvcHQsIHZhbCBpbiBvcHRzOgorICAgICAgICBpZiBvcHQgaW4gKCItbyIsICItLW91dHB1dCIpOgorICAgICAgICAgICAgb2ZuID0gdmFsCisgICAgICAgIGVsaWYgb3B0IGluICgiLWMiLCAiLS1jb2x1bW5zIik6CisgICAgICAgICAgICBjb2x1bW5zID0gc3RyaW5nLmF0b2kodmFsKQorICAgICAgICBlbGlmIG9wdCBpbiAoIi1sIiwgIi0tbGV0dGVycyIpOgorICAgICAgICAgICAgbGV0dGVycyA9IDEKKyAgICBpZiBub3QgYXJnczoKKyAgICAgICAgYXJncyA9IFtpZm5dCisgICAgbm9kZXMgPSBbXQorICAgIGZvciBmbiBpbiBhcmdzOgorICAgICAgICBub2RlcyA9IG5vZGVzICsgbG9hZChvcGVuKGZuKSkKKyAgICBudW1fbm9kZXMgPSBsZW4obm9kZXMpCisgICAgaHRtbCA9IHByb2Nlc3Nfbm9kZXMobm9kZXMsIGNvbHVtbnMsIGxldHRlcnMpCisgICAgcHJvZ3JhbSA9IG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pCisgICAgaWYgb2ZuID09ICItIjoKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZShodG1sKQorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJcbiVzOiAlZCBpbmRleCBub2RlcyIgJSAocHJvZ3JhbSwgbnVtX25vZGVzKSkKKyAgICBlbHNlOgorICAgICAgICBvcGVuKG9mbiwgInciKS53cml0ZShodG1sKQorICAgICAgICBwcmludAorICAgICAgICBwcmludCAiJXM6ICVkIGluZGV4IG5vZGVzIiAlIChwcm9ncmFtLCBudW1fbm9kZXMpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2RvYy90b29scy9jaGVja2FyZ3MucG0gYi9kb2MvdG9vbHMvY2hlY2thcmdzLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNTJmNjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvY2hlY2thcmdzLnBtCkBAIC0wLDAgKzEsMTEyIEBACisjIS91bnMvYmluL3BlcmwKKworcGFja2FnZSBjaGVja2FyZ3M7CityZXF1aXJlIDUuMDA0OwkJCSMgdXNlcyAiZm9yIG15ICR2YXIiCityZXF1aXJlIEV4cG9ydGVyOworQElTQSA9IHF3KEV4cG9ydGVyKTsKK0BFWFBPUlQgPSBxdyhjaGVja19hcmdzIGNoZWNrX2FyZ3NfcmFuZ2UgY2hlY2tfYXJnc19hdF9sZWFzdCk7Cit1c2Ugc3RyaWN0OwordXNlIENhcnA7CisKKz1oZWFkMSBOQU1FCisKK2NoZWNrYXJncyAtLSBQcm92aWRlIHJ1ZGltZW50YXJ5IGFyZ3VtZW50IGNoZWNraW5nIGZvciBwZXJsNSBmdW5jdGlvbnMKKworPWhlYWQxIFNZTk9QU0lTCisKKyAgY2hlY2tfYXJncyhjQXJnc0V4cGVjdGVkLCBAXykKKyAgY2hlY2tfYXJnc19yYW5nZShjQXJnc01pbiwgY0FyZ3NNYXgsIEBfKQorICBjaGVja19hcmdzX2F0X2xlYXN0KGNBcmdzTWluLCBAXykKK3doZXJlICJAXyIgc2hvdWxkIGJlIHN1cHBsaWVkIGxpdGVyYWxseS4KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK0FzIHRoZSBmaXJzdCBsaW5lIG9mIHVzZXItd3JpdHRlbiBzdWJyb3V0aW5lIGZvbywgZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgbXkgKCRhcmcxLCAkYXJnMikgPSBjaGVja19hcmdzKDIsIEBfKTsKKyAgbXkgKCRhcmcxLCBAcmVzdCkgPSBjaGVja19hcmdzX3JhbmdlKDEsIDQsIEBfKTsKKyAgbXkgKCRhcmcxLCBAcmVzdCkgPSBjaGVja19hcmdzX2F0X2xlYXN0KDEsIEBfKTsKKyAgbXkgQGFyZ3MgPSBjaGVja19hcmdzX2F0X2xlYXN0KDAsIEBfKTsKKworVGhlc2UgZnVuY3Rpb25zIG1heSBhbHNvIGJlIGNhbGxlZCBmb3Igc2lkZSBlZmZlY3QgKHB1dCBhIGNhbGwgdG8gb25lCitvZiB0aGUgZnVuY3Rpb25zIG5lYXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3Vicm91dGluZSksIGJ1dCB1c2luZyB0aGUKK2FyZ3VtZW50IGNoZWNrZXJzIHRvIHNldCB0aGUgYXJndW1lbnQgbGlzdCBpcyB0aGUgcmVjb21tZW5kZWQgdXNhZ2UuCisKK1RoZSBudW1iZXIgb2YgYXJndW1lbnRzIGFuZCB0aGVpciBkZWZpbmVkbmVzcyBhcmUgY2hlY2tlZDsgaWYgdGhlIHdyb25nCitudW1iZXIgYXJlIHJlY2VpdmVkLCB0aGUgcHJvZ3JhbSBleGl0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuCisKKz1oZWFkMSBBVVRIT1IKKworTWljaGFlbCBELiBFcm5zdCA8RjxtZXJuc3RAY3Mud2FzaGluZ3Rvbi5lZHU+PgorCis9Y3V0CisKKyMjIE5lZWQgdG8gY2hlY2sgdGhhdCB1c2Ugb2YgY2FsbGVyKDEpIHJlYWxseSBnaXZlcyBkZXNpcmVkIHJlc3VsdHMuCisjIyBOZWVkIHRvIGdpdmUgaW5wdXQgY2h1bmsgaW5mb3JtYXRpb24uCisjIyBJcyB0aGlzIG9idmlhdGVkIGJ5IFBlcmwgNS4wMDMncyBkZWNsYXJhdGlvbnM/ICBOb3QgZW50aXJlbHksIEkgdGhpbmsuCisKK3N1YiBjaGVja19hcmdzICggJEAgKQoreworICBteSAoJG51bV9mb3JtYWxzLCBAYXJncykgPSBAXzsKKyAgbXkgKCRwYWNrLCAkZmlsZV9hcmcsICRsaW5lX2FyZywgJHN1Ym5hbWUsICRoYXNhcmdzLCAkd2FudGFycikgPSBjYWxsZXIoMSk7CisgIGlmIChAXyA8IDEpIHsgY3JvYWsgImNoZWNrX2FyZ3MgbmVlZHMgYXQgbGVhc3QgNyBhcmdzLCBnb3QgIiwgc2NhbGFyKEBfKSwgIjogQF9cbiAiOyB9CisgIGlmICgoIXdhbnRhcnJheSkgJiYgKCRudW1fZm9ybWFscyAhPSAwKSkKKyAgICB7IGNyb2FrICJjaGVja19hcmdzIGNhbGxlZCBpbiBzY2FsYXIgY29udGV4dCI7IH0KKyAgIyBDYW4ndCB1c2UgY3JvYWsgYmVsb3cgaGVyZTogaXQgd291bGQgb25seSBnbyBvdXQgdG8gY2FsbGVyLCBub3QgaXRzIGNhbGxlcgorICBteSAkbnVtX2FjdHVhbHMgPSBAYXJnczsKKyAgaWYgKCRudW1fYWN0dWFscyAhPSAkbnVtX2Zvcm1hbHMpCisgICAgeyBkaWUgIiRmaWxlX2FyZzokbGluZV9hcmc6IGZ1bmN0aW9uICRzdWJuYW1lIGV4cGVjdGVkICRudW1fZm9ybWFscyBhcmd1bWVudCIsCisgICAgICAoKCRudW1fZm9ybWFscyA9PSAxKSA/ICIiIDogInMiKSwKKyAgICAgICIsIGdvdCAkbnVtX2FjdHVhbHMiLAorICAgICAgKCgkbnVtX2FjdHVhbHMgPT0gMCkgPyAiIiA6ICI6IEBhcmdzIiksCisgICAgICAiXG4iOyB9CisgIGZvciBteSAkaW5kZXggKDAuLiQjYXJncykKKyAgICB7IGlmICghZGVmaW5lZCgkYXJnc1skaW5kZXhdKSkKKwl7IGRpZSAiJGZpbGVfYXJnOiRsaW5lX2FyZzogZnVuY3Rpb24gJHN1Ym5hbWUgdW5kZWZpbmVkIGFyZ3VtZW50ICIsICRpbmRleCsxLCAiOiBAYXJnc1swLi4kaW5kZXgtMV1cbiI7IH0gfQorICByZXR1cm4gQGFyZ3M7Cit9CisKK3N1YiBjaGVja19hcmdzX3JhbmdlICggJCRAICkKK3sKKyAgbXkgKCRtaW5fZm9ybWFscywgJG1heF9mb3JtYWxzLCBAYXJncykgPSBAXzsKKyAgbXkgKCRwYWNrLCAkZmlsZV9hcmcsICRsaW5lX2FyZywgJHN1Ym5hbWUsICRoYXNhcmdzLCAkd2FudGFycikgPSBjYWxsZXIoMSk7CisgIGlmIChAXyA8IDIpIHsgY3JvYWsgImNoZWNrX2FyZ3NfcmFuZ2UgbmVlZHMgYXQgbGVhc3QgOCBhcmdzLCBnb3QgIiwgc2NhbGFyKEBfKSwgIjogQF8iOyB9CisgIGlmICgoIXdhbnRhcnJheSkgJiYgKCRtYXhfZm9ybWFscyAhPSAwKSAmJiAoJG1pbl9mb3JtYWxzICE9MCkgKQorICAgIHsgY3JvYWsgImNoZWNrX2FyZ3NfcmFuZ2UgY2FsbGVkIGluIHNjYWxhciBjb250ZXh0IjsgfQorICAjIENhbid0IHVzZSBjcm9hayBiZWxvdyBoZXJlOiBpdCB3b3VsZCBvbmx5IGdvIG91dCB0byBjYWxsZXIsIG5vdCBpdHMgY2FsbGVyCisgIG15ICRudW1fYWN0dWFscyA9IEBhcmdzOworICBpZiAoKCRudW1fYWN0dWFscyA8ICRtaW5fZm9ybWFscykgfHwgKCRudW1fYWN0dWFscyA+ICRtYXhfZm9ybWFscykpCisgICAgeyBkaWUgIiRmaWxlX2FyZzokbGluZV9hcmc6IGZ1bmN0aW9uICRzdWJuYW1lIGV4cGVjdGVkICRtaW5fZm9ybWFscy0kbWF4X2Zvcm1hbHMgYXJndW1lbnRzLCBnb3QgJG51bV9hY3R1YWxzIiwKKyAgICAgICgkbnVtX2FjdHVhbHMgPT0gMCkgPyAiIiA6ICI6IEBhcmdzIiwgIlxuIjsgfQorICBmb3IgbXkgJGluZGV4ICgwLi4kI2FyZ3MpCisgICAgeyBpZiAoIWRlZmluZWQoJGFyZ3NbJGluZGV4XSkpCisJeyBkaWUgIiRmaWxlX2FyZzokbGluZV9hcmc6IGZ1bmN0aW9uICRzdWJuYW1lIHVuZGVmaW5lZCBhcmd1bWVudCAiLCAkaW5kZXgrMSwgIjogQGFyZ3NbMC4uJGluZGV4LTFdXG4iOyB9IH0KKyAgcmV0dXJuIEBhcmdzOworfQorCitzdWIgY2hlY2tfYXJnc19hdF9sZWFzdCAoICRAICkKK3sKKyAgbXkgKCRtaW5fZm9ybWFscywgQGFyZ3MpID0gQF87CisgIG15ICgkcGFjaywgJGZpbGVfYXJnLCAkbGluZV9hcmcsICRzdWJuYW1lLCAkaGFzYXJncywgJHdhbnRhcnIpID0gY2FsbGVyKDEpOworICAjIERvbid0IGRvIHRoaXMsIGJlY2F1c2Ugd2Ugd2FudCBldmVyeSBzdWIgdG8gc3RhcnQgd2l0aCBhIGNhbGwgdG8gY2hlY2tfYXJncyoKKyAgIyBpZiAoJG1pbl9mb3JtYWxzID09IDApCisgICMgICB7IGRpZSAiSXNuJ3QgaXQgcG9pbnRsZXNzIHRvIGNoZWNrIGZvciBhdCBsZWFzdCB6ZXJvIGFyZ3MgdG8gJHN1Ym5hbWU/XG4iOyB9CisgIGlmIChzY2FsYXIoQF8pIDwgMSkKKyAgICB7IGNyb2FrICJjaGVja19hcmdzX2F0X2xlYXN0IG5lZWRzIGF0IGxlYXN0IDEgYXJnLCBnb3QgIiwgc2NhbGFyKEBfKSwgIjogQF8iOyB9CisgIGlmICgoIXdhbnRhcnJheSkgJiYgKCRtaW5fZm9ybWFscyAhPSAwKSkKKyAgICB7IGNyb2FrICJjaGVja19hcmdzX2F0X2xlYXN0IGNhbGxlZCBpbiBzY2FsYXIgY29udGV4dCI7IH0KKyAgIyBDYW4ndCB1c2UgY3JvYWsgYmVsb3cgaGVyZTogaXQgd291bGQgb25seSBnbyBvdXQgdG8gY2FsbGVyLCBub3QgaXRzIGNhbGxlcgorICBteSAkbnVtX2FjdHVhbHMgPSBAYXJnczsKKyAgaWYgKCRudW1fYWN0dWFscyA8ICRtaW5fZm9ybWFscykKKyAgICB7IGRpZSAiJGZpbGVfYXJnOiRsaW5lX2FyZzogZnVuY3Rpb24gJHN1Ym5hbWUgZXhwZWN0ZWQgYXQgbGVhc3QgJG1pbl9mb3JtYWxzIGFyZ3VtZW50IiwKKyAgICAgICgkbWluX2Zvcm1hbHMgPT0gMSkgPyAiIiA6ICJzIiwKKyAgICAgICIsIGdvdCAkbnVtX2FjdHVhbHMiLAorICAgICAgKCRudW1fYWN0dWFscyA9PSAwKSA/ICIiIDogIjogQGFyZ3MiLCAiXG4iOyB9CisgIGZvciBteSAkaW5kZXggKDAuLiQjYXJncykKKyAgICB7IGlmICghZGVmaW5lZCgkYXJnc1skaW5kZXhdKSkKKwl7IHdhcm4gIiRmaWxlX2FyZzokbGluZV9hcmc6IGZ1bmN0aW9uICRzdWJuYW1lIHVuZGVmaW5lZCBhcmd1bWVudCAiLCAkaW5kZXgrMSwgIjogQGFyZ3NbMC4uJGluZGV4LTFdXG4iOyBsYXN0OyB9IH0KKyAgcmV0dXJuIEBhcmdzOworfQorCisxOwkJCQkjIHN1Y2Nlc3NmdWwgaW1wb3J0CitfX0VORF9fCmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvY2tsYXRleCBiL2RvYy90b29scy9ja2xhdGV4Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM5NmU5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvY2tsYXRleApAQCAtMCwwICsxLDI2IEBACisjISAvYmluL3NoCisjICAtKi0ga3NoIC0qLQorCisjIFRoaXMgc2NyaXB0ICpoZWxwcyogbG9jYXRlIGxpbmVzIG9mIG5vcm1hbCBjb250ZW50IHRoYXQgZW5kIGluICd9JzsKKyMgdGhpcyBpcyB1c2VmdWwgc2luY2UgTGFUZVgySFRNTCAoYXQgbGVhc3QgdGhlIG9sZCB2ZXJzaW9uIHRoYXQgd2UKKyMgdXNlKSBicmVha3Mgb24gbWFueSBsaW5lcyB0aGF0IGVuZCB0aGF0IHdheS4KKyMKKyMgVXNhZ2U6IGNrbGF0ZXggZmlsZXMuLi4gfCBsZXNzCisjCisjICpSZWFkKiB0aGUgb3V0cHV0IGxvb2tpbmcgZm9yIHN1c3BpY2lvdXMgbGluZXMhCisKK2dyZXAgLW4gIlteIAldfVwkIiAkQCB8IFwKKyBncmVwIC12ICdcXGJlZ2lueycgfCBcCisgZ3JlcCAtdiAnXFxlbmR7JyB8IFwKKyBncmVwIC12ICdcXGlucHV0eycgfCBcCisgZ3JlcCAtdiAnXFxkb2N1bWVudGNsYXNzeycgfCBcCisgZ3JlcCAtdiAnXFx0aXRsZXsnIHwgXAorIGdyZXAgLXYgJ1xcY2hhcHRlcnsnIHwgXAorIGdyZXAgLXYgJ1xcY2hhcHRlclwqeycgfCBcCisgZ3JlcCAtdiAnXFxzZWN0aW9ueycgfCBcCisgZ3JlcCAtdiAnXFxzdWJzZWN0aW9ueycgfCBcCisgZ3JlcCAtdiAnXFxzdWJzdWJzZWN0aW9ueycgfCBcCisgZ3JlcCAtdiAnXFxzZWN0aW9uYXV0aG9yeycgfCBcCisgZ3JlcCAtdiAnXFxtb2R1bGVhdXRob3J7JworCitleGl0ICQ/CmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvY3VzdGxpYi5weSBiL2RvYy90b29scy9jdXN0bGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NTg0NTEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvY3VzdGxpYi5weQpAQCAtMCwwICsxLDczIEBACisjIEdlbmVyYXRlIGN1c3RsaWIudGV4LCB3aGljaCBpcyBhIHNpdGUtc3BlY2lmaWMgbGlicmFyeSBkb2N1bWVudC4KKworIyBQaGFzZSBJOiBsaXN0IGFsbCB0aGUgdGhpbmdzIHRoYXQgY2FuIGJlIGltcG9ydGVkCisKK2ltcG9ydCBnbG9iLCBvcywgc3lzLCBzdHJpbmcKK21vZHVsZXM9e30KKworZm9yIG1vZG5hbWUgaW4gc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzOgorICAgIG1vZHVsZXNbbW9kbmFtZV09bW9kbmFtZQorICAgIAorZm9yIGRpciBpbiBzeXMucGF0aDoKKyAgICAjIExvb2sgZm9yICoucHkgZmlsZXMKKyAgICBmaWxlbGlzdD1nbG9iLmdsb2Iob3MucGF0aC5qb2luKGRpciwgJyoucHknKSkKKyAgICBmb3IgZmlsZSBpbiBmaWxlbGlzdDogCisgICAgICAgIHBhdGgsIGZpbGUgPSBvcy5wYXRoLnNwbGl0KGZpbGUpCisgICAgICAgIGJhc2UsIGV4dD1vcy5wYXRoLnNwbGl0ZXh0KGZpbGUpCisgICAgICAgIG1vZHVsZXNbc3RyaW5nLmxvd2VyKGJhc2UpXT1iYXNlCisKKyAgICAjIExvb2sgZm9yIHNoYXJlZCBsaWJyYXJ5IGZpbGVzCisgICAgZmlsZWxpc3Q9KGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oZGlyLCAnKi5zbycpKSArIAorICAgICAgICAgICAgICBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGRpciwgJyouc2wnKSkgKworICAgICAgICAgICAgICBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGRpciwgJyoubycpKSApCisgICAgZm9yIGZpbGUgaW4gZmlsZWxpc3Q6IAorICAgICAgICBwYXRoLCBmaWxlID0gb3MucGF0aC5zcGxpdChmaWxlKQorICAgICAgICBiYXNlLCBleHQ9b3MucGF0aC5zcGxpdGV4dChmaWxlKQorICAgICAgICBpZiBiYXNlWy02Ol09PSdtb2R1bGUnOiBiYXNlPWJhc2VbOi02XQorICAgICAgICBtb2R1bGVzW3N0cmluZy5sb3dlcihiYXNlKV09YmFzZQorCisjIE1pbm9yIG9kZGl0eTogdGhlIHR5cGVzIG1vZHVsZSBpcyBkb2N1bWVudGVkIGluIGxpYnR5cGVzMi50ZXgKK2lmIG1vZHVsZXMuaGFzX2tleSgndHlwZXMnKToKKyAgICBkZWwgbW9kdWxlc1sndHlwZXMnXSA7IG1vZHVsZXNbJ3R5cGVzMiddPU5vbmUKKworIyBQaGFzZSBJSTogZmluZCBhbGwgZG9jdW1lbnRhdGlvbiBmaWxlcyAobGliKi50ZXgpCisjICAgICAgICAgICBhbmQgZWxpbWluYXRlIG1vZHVsZXMgdGhhdCBkb24ndCBoYXZlIG9uZS4KKworZG9jcz17fQorZmlsZWxpc3Q9Z2xvYi5nbG9iKCdsaWIqLnRleCcpCitmb3IgZmlsZSBpbiBmaWxlbGlzdDoKKyAgICBtb2RuYW1lPWZpbGVbMzotNF0KKyAgICBkb2NzW21vZG5hbWVdPW1vZG5hbWUKKworbWxpc3Q9bW9kdWxlcy5rZXlzKCkKK21saXN0PWZpbHRlcihsYW1iZGEgeCwgZG9jcz1kb2NzOiBkb2NzLmhhc19rZXkoeCksIG1saXN0KQorbWxpc3Quc29ydCgpCittbGlzdD1tYXAobGFtYmRhIHgsIGRvY3M9ZG9jczogZG9jc1t4XSwgbWxpc3QpCisKK21vZHVsZXM9bWxpc3QKKworIyBQaGFzZSBJSUk6IHdyaXRlIGN1c3RsaWIudGV4CisKKyMgV3JpdGUgdGhlIGJvaWxlcnBsYXRlCisjIFhYWCBzaG91bGQgYmUgZmFuY2llZCB1cC4gIAorcHJpbnQgIiIiXGRvY3VtZW50c3R5bGVbdHdvc2lkZSwxMXB0LG15Zm9ybWF0XXtyZXBvcnR9CitcXHRpdGxle1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZX0KK1xcaW5wdXR7Ym9pbGVycGxhdGV9CitcXG1ha2VpbmRleCAgICAgICAgICAgICAgICAgICAgICUgdGVsbCBcXGluZGV4IHRvIGFjdHVhbGx5IHdyaXRlIHRoZSAuaWR4IGZpbGUKK1xcYmVnaW57ZG9jdW1lbnR9CitcXHBhZ2VudW1iZXJpbmd7cm9tYW59CitcXG1ha2V0aXRsZQorXFxpbnB1dHtjb3B5cmlnaHR9CitcXGJlZ2lue2Fic3RyYWN0fQorXFxub2luZGVudCBUaGlzIGlzIGEgY3VzdG9taXplZCB2ZXJzaW9uIG9mIHRoZSBQeXRob24gTGlicmFyeSBSZWZlcmVuY2UuCitcXGVuZHthYnN0cmFjdH0KK1xccGFnZWJyZWFrCit7XFxwYXJza2lwID0gMG1tIFxcdGFibGVvZmNvbnRlbnRzfQorXFxwYWdlYnJlYWtcXHBhZ2VudW1iZXJpbmd7YXJhYmljfSIiIgorICAgIAorZm9yIG1vZG5hbWUgaW4gbWxpc3Q6IAorICAgIHByaW50ICJcXGlucHV0e2xpYiVzfSIgJSAobW9kbmFtZSwpCisgICAgCisjIFdyaXRlIHRoZSBlbmQKK3ByaW50ICIiIlxcaW5wdXR7Y3VzdGxpYi5pbmR9ICAgICAgICAgICAgICAgICAgICUgSW5kZXgKK1xcZW5ke2RvY3VtZW50fSIiIgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2N2c2luZm8ucHkgYi9kb2MvdG9vbHMvY3ZzaW5mby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGEzMmMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL2N2c2luZm8ucHkKQEAgLTAsMCArMSw4MSBAQAorIiIiVXRpbGl0eSBjbGFzcyBhbmQgZnVuY3Rpb24gdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBDVlMgcmVwb3NpdG9yeQorYmFzZWQgb24gY2hlY2tlZC1vdXQgZmlsZXMuCisiIiIKKworaW1wb3J0IG9zCisKKworZGVmIGdldF9yZXBvc2l0b3J5X2xpc3QocGF0aHMpOgorICAgIGQgPSB7fQorICAgIGZvciBuYW1lIGluIHBhdGhzOgorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShuYW1lKToKKyAgICAgICAgICAgIGRpciA9IG9zLnBhdGguZGlybmFtZShuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGlyID0gbmFtZQorICAgICAgICByb290ZmlsZSA9IG9zLnBhdGguam9pbihuYW1lLCAiQ1ZTIiwgIlJvb3QiKQorICAgICAgICByb290ID0gb3Blbihyb290ZmlsZSkucmVhZGxpbmUoKS5zdHJpcCgpCisgICAgICAgIGlmIG5vdCBkLmhhc19rZXkocm9vdCk6CisgICAgICAgICAgICBkW3Jvb3RdID0gUmVwb3NpdG9yeUluZm8oZGlyKSwgW25hbWVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkW3Jvb3RdWzFdLmFwcGVuZChuYW1lKQorICAgIHJldHVybiBkLnZhbHVlcygpCisKKworY2xhc3MgUmVwb3NpdG9yeUluZm86CisgICAgIiIiUmVjb3JkIGhvbGRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcG9zaXRvcnkgd2Ugd2FudCB0byB0YWxrIHRvLiIiIgorICAgIGN2c3Jvb3RfcGF0aCA9IE5vbmUKKyAgICBicmFuY2ggPSBOb25lCisKKyAgICAjIHR5cGUgaXMgJycsICc6ZXh0Jywgb3IgJzpwc2VydmVyOicKKyAgICB0eXBlID0gIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXI9Tm9uZSk6CisgICAgICAgIGlmIGRpciBpcyBOb25lOgorICAgICAgICAgICAgZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgZGlyID0gb3MucGF0aC5qb2luKGRpciwgIkNWUyIpCisgICAgICAgIHJvb3QgPSBvcGVuKG9zLnBhdGguam9pbihkaXIsICJSb290IikpLnJlYWRsaW5lKCkuc3RyaXAoKQorICAgICAgICBpZiByb290LnN0YXJ0c3dpdGgoIjpwc2VydmVyOiIpOgorICAgICAgICAgICAgc2VsZi50eXBlID0gIjpwc2VydmVyOiIKKyAgICAgICAgICAgIHJvb3QgPSByb290W2xlbigiOnBzZXJ2ZXI6Iik6XQorICAgICAgICBlbGlmICI6IiBpbiByb290OgorICAgICAgICAgICAgaWYgcm9vdC5zdGFydHN3aXRoKCI6ZXh0OiIpOgorICAgICAgICAgICAgICAgIHJvb3QgPSByb290W2xlbigiOmV4dDoiKTpdCisgICAgICAgICAgICBzZWxmLnR5cGUgPSAiOmV4dDoiCisgICAgICAgIHNlbGYucmVwb3NpdG9yeSA9IHJvb3QKKyAgICAgICAgaWYgIjoiIGluIHJvb3Q6CisgICAgICAgICAgICBob3N0LCBwYXRoID0gcm9vdC5zcGxpdCgiOiIsIDEpCisgICAgICAgICAgICBzZWxmLmN2c3Jvb3RfcGF0aCA9IHBhdGgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY3Zzcm9vdF9wYXRoID0gcm9vdAorICAgICAgICBmbiA9IG9zLnBhdGguam9pbihkaXIsICJUYWciKQorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmbik6CisgICAgICAgICAgICBzZWxmLmJyYW5jaCA9IG9wZW4oZm4pLnJlYWRsaW5lKCkuc3RyaXAoKVsxOl0KKworICAgIGRlZiBnZXRfY3Zzcm9vdChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudHlwZSArIHNlbGYucmVwb3NpdG9yeQorCisgICAgX3JlcG9zaXRvcnlfZGlyX2NhY2hlID0ge30KKworICAgIGRlZiBnZXRfcmVwb3NpdG9yeV9maWxlKHNlbGYsIHBhdGgpOgorICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguYWJzcGF0aChwYXRoKQorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgorICAgICAgICAgICAgZGlyID0gcGF0aAorICAgICAgICAgICAgam9pbiA9IDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRpciA9IG9zLnBhdGguZGlybmFtZShwYXRoKQorICAgICAgICAgICAgam9pbiA9IDEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVwb2RpciA9IHNlbGYuX3JlcG9zaXRvcnlfZGlyX2NhY2hlW2Rpcl0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmVwb2ZuID0gb3MucGF0aC5qb2luKGRpciwgIkNWUyIsICJSZXBvc2l0b3J5IikKKyAgICAgICAgICAgIHJlcG9kaXIgPSBvcGVuKHJlcG9mbikucmVhZGxpbmUoKS5zdHJpcCgpCisgICAgICAgICAgICByZXBvZGlyID0gb3MucGF0aC5qb2luKHNlbGYuY3Zzcm9vdF9wYXRoLCByZXBvZGlyKQorICAgICAgICAgICAgc2VsZi5fcmVwb3NpdG9yeV9kaXJfY2FjaGVbZGlyXSA9IHJlcG9kaXIKKyAgICAgICAgaWYgam9pbjoKKyAgICAgICAgICAgIGZuID0gb3MucGF0aC5qb2luKHJlcG9kaXIsIG9zLnBhdGguYmFzZW5hbWUocGF0aCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmbiA9IHJlcG9kaXIKKyAgICAgICAgcmV0dXJuIGZuW2xlbihzZWxmLmN2c3Jvb3RfcGF0aCkrMTpdCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiPFJlcG9zaXRvcnlJbmZvIGZvciAlcz4iICUgYHNlbGYuZ2V0X2N2c3Jvb3QoKWAKZGlmZiAtLWdpdCBhL2RvYy90b29scy9maW5kYWNrcyBiL2RvYy90b29scy9maW5kYWNrcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMTNiMDBmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL2ZpbmRhY2tzCkBAIC0wLDAgKzEsMTYxIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyIiIlNjcmlwdCB0byBsb2NhdGUgZW1haWwgYWRkcmVzc2VzIGluIHRoZSBDVlMgbG9ncy4iIiIKK19fdmVyc2lvbl9fID0gJyRSZXZpc2lvbjogMS4xLjEuMSAkJworCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IFVzZXJEaWN0CisKK2ltcG9ydCBjdnNpbmZvCisKKworY2xhc3MgQWNrbm93bGVkZ2VtZW50cyhVc2VyRGljdC5Vc2VyRGljdCk6CisgICAgZGVmIGFkZChzZWxmLCBlbWFpbCwgbmFtZSwgcGF0aCk6CisgICAgICAgIGQgPSBzZWxmLmRhdGEKKyAgICAgICAgZC5zZXRkZWZhdWx0KGVtYWlsLCB7fSlbcGF0aF0gPSBuYW1lCisKKworZGVmIG9wZW5fY3ZzX2xvZyhpbmZvLCBwYXRocz1Ob25lKToKKyAgICBjdnNyb290ID0gaW5mby5nZXRfY3Zzcm9vdCgpCisgICAgY21kID0gImN2cyAtcSAtZCVzIGxvZyAiICUgY3Zzcm9vdAorICAgIGlmIHBhdGhzOgorICAgICAgICBjbWQgKz0gIiAiLmpvaW4ocGF0aHMpCisgICAgcmV0dXJuIG9zLnBvcGVuKGNtZCwgInIiKQorCisKK2VtYWlsX3J4ID0gcmUuY29tcGlsZSgiPChbYS16XVstYS16MC05Ll9dKkBbLWEtejAtOS5dKyk+IiwgcmUuSUdOT1JFQ0FTRSkKKworZGVmIGZpbmRfYWNrcyhmLCBhY2tzKToKKyAgICBwcmV2ID0gJycKKyAgICBmaWxlbmFtZSA9IE5vbmUKKyAgICBNQUdJQ19XT1JEUyA9ICgndmFuJywgJ3ZvbicpCisgICAgd2hpbGUgMToKKyAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiV29ya2luZyBmaWxlOiAiKToKKyAgICAgICAgICAgIGZpbGVuYW1lID0gbGluZS5zcGxpdChOb25lLCAyKVsyXS5zdHJpcCgpCisgICAgICAgICAgICBwcmV2ID0gbGluZQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgbSA9IGVtYWlsX3J4LnNlYXJjaChsaW5lKQorICAgICAgICBpZiBtOgorICAgICAgICAgICAgd29yZHMgPSBwcmV2LnNwbGl0KCkgKyBsaW5lWzptLnN0YXJ0KCldLnNwbGl0KCkKKyAgICAgICAgICAgIEwgPSBbXQorICAgICAgICAgICAgd2hpbGUgd29yZHMgXAorICAgICAgICAgICAgICAgICAgYW5kICh3b3Jkc1stMV1bMF0uaXN1cHBlcigpIG9yIHdvcmRzWy0xXSBpbiBNQUdJQ19XT1JEUyk6CisgICAgICAgICAgICAgICAgTC5pbnNlcnQoMCwgd29yZHMucG9wKCkpCisgICAgICAgICAgICBuYW1lID0gIiAiLmpvaW4oTCkKKyAgICAgICAgICAgIGVtYWlsID0gbS5ncm91cCgxKS5sb3dlcigpCisgICAgICAgICAgICBhY2tzLmFkZChlbWFpbCwgbmFtZSwgZmlsZW5hbWUpCisgICAgICAgIHByZXYgPSBsaW5lCisKKworZGVmIGxvYWRfY3ZzX2xvZ19hY2tzKGFja3MsIGFyZ3MpOgorICAgIHJlcG9saXN0ID0gY3ZzaW5mby5nZXRfcmVwb3NpdG9yeV9saXN0KGFyZ3Mgb3IgWyIiXSkKKyAgICBmb3IgaW5mbywgcGF0aHMgaW4gcmVwb2xpc3Q6CisgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIlJlcG9zaXRvcnk6IiwgaW5mby5nZXRfY3Zzcm9vdCgpCisgICAgICAgIGYgPSBvcGVuX2N2c19sb2coaW5mbywgcGF0aHMpCisgICAgICAgIGZpbmRfYWNrcyhmLCBhY2tzKQorICAgICAgICBmLmNsb3NlKCkKKworCitkZWYgbG9hZF90ZXhfc291cmNlX2Fja3MoYWNrcywgYXJncyk6CisgICAgZm9yIHBhdGggaW4gYXJnczoKKyAgICAgICAgcGF0aCA9IHBhdGggb3Igb3MuY3VyZGlyCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgorICAgICAgICAgICAgcmVhZF9hY2tzX2Zyb21fdGV4X2ZpbGUoYWNrcywgcGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlYWRfYWNrc19mcm9tX3RleF9kaXIoYWNrcywgcGF0aCkKKworCitkZWYgcmVhZF9hY2tzX2Zyb21fdGV4X2ZpbGUoYWNrcywgcGF0aCk6CisgICAgZiA9IG9wZW4ocGF0aCkKKyAgICB3aGlsZSAxOgorICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKHIiXHNlY3Rpb25hdXRob3J7Iik6CisgICAgICAgICAgICBsaW5lID0gbGluZVtsZW4ociJcc2VjdGlvbmF1dGhvciIpOl0KKyAgICAgICAgICAgIG5hbWUsIGxpbmUgPSBleHRyYWN0X3RleF9ncm91cChsaW5lKQorICAgICAgICAgICAgZW1haWwsIGxpbmUgPSBleHRyYWN0X3RleF9ncm91cChsaW5lKQorICAgICAgICAgICAgYWNrcy5hZGQoZW1haWwsIG5hbWUsIHBhdGgpCisKKworZGVmIHJlYWRfYWNrc19mcm9tX3RleF9kaXIoYWNrcywgcGF0aCk6CisgICAgc3RhY2sgPSBbcGF0aF0KKyAgICB3aGlsZSBzdGFjazoKKyAgICAgICAgcCA9IHN0YWNrLnBvcCgpCisgICAgICAgIGZvciBuIGluIG9zLmxpc3RkaXIocCk6CisgICAgICAgICAgICBuID0gb3MucGF0aC5qb2luKHAsIG4pCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG4pOgorICAgICAgICAgICAgICAgIHN0YWNrLmluc2VydCgwLCBuKQorICAgICAgICAgICAgZWxpZiBvcy5wYXRoLm5vcm1wYXRoKG4pLmVuZHN3aXRoKCIudGV4Iik6CisgICAgICAgICAgICAgICAgcmVhZF9hY2tzX2Zyb21fdGV4X2ZpbGUoYWNrcywgbikKKworCitkZWYgZXh0cmFjdF90ZXhfZ3JvdXAocyk6CisgICAgYyA9IDAKKyAgICBmb3IgaSBpbiByYW5nZShsZW4ocykpOgorICAgICAgICBpZiBzW2ldID09ICd7JzoKKyAgICAgICAgICAgIGMgKz0gMQorICAgICAgICBlbGlmIHNbaV0gPT0gJ30nOgorICAgICAgICAgICAgYyAtPSAxCisgICAgICAgICAgICBpZiBjID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNbMTppXSwgc1tpKzE6XQorCisKK2RlZiBwcmludF9hY2tzKGFja3MpOgorICAgIGZpcnN0ID0gMQorICAgIGZvciBlbWFpbCwgRCBpbiBhY2tzLml0ZW1zKCk6CisgICAgICAgIGlmIGZpcnN0OgorICAgICAgICAgICAgZmlyc3QgPSAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludAorICAgICAgICBMID0gRC5pdGVtcygpCisgICAgICAgIEwuc29ydCgpCisgICAgICAgIHByZWZuYW1lID0gTFswXVsxXQorICAgICAgICBmb3IgZmlsZSwgbmFtZSBpbiBMWzE6XToKKyAgICAgICAgICAgIGlmIG5hbWUgIT0gcHJlZm5hbWU6CisgICAgICAgICAgICAgICAgcHJlZm5hbWUgPSAiIgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIHByZWZuYW1lOgorICAgICAgICAgICAgcHJpbnQgcHJlZm5hbWUsICI8JXM+OiIgJSBlbWFpbAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgZW1haWwgKyAiOiIKKyAgICAgICAgZm9yIGZpbGUsIG5hbWUgaW4gTDoKKyAgICAgICAgICAgIGlmIG5hbWUgPT0gcHJlZm5hbWU6CisgICAgICAgICAgICAgICAgcHJpbnQgIiAgICAiICsgZmlsZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAiICAgICVzIChhcyAlcykiICUgKGZpbGUsIG5hbWUpCisKKworZGVmIHByaW50X2Fja19uYW1lcyhhY2tzKToKKyAgICBuYW1lcyA9IFtdCisgICAgZm9yIGVtYWlsLCBEIGluIGFja3MuaXRlbXMoKToKKyAgICAgICAgTCA9IEQuaXRlbXMoKQorICAgICAgICBMLnNvcnQoKQorICAgICAgICBwcmVmbmFtZSA9IExbMF1bMV0KKyAgICAgICAgZm9yIGZpbGUsIG5hbWUgaW4gTFsxOl06CisgICAgICAgICAgICBwcmVmbmFtZSA9IHByZWZuYW1lIG9yIG5hbWUKKyAgICAgICAgbmFtZXMuYXBwZW5kKHByZWZuYW1lIG9yIGVtYWlsKQorICAgIGRlZiBmKHMxLCBzMik6CisgICAgICAgIHMxID0gczEubG93ZXIoKQorICAgICAgICBzMiA9IHMyLmxvd2VyKCkKKyAgICAgICAgcmV0dXJuIGNtcCgoczEuc3BsaXQoKVstMV0sIHMxKSwKKyAgICAgICAgICAgICAgICAgICAoczIuc3BsaXQoKVstMV0sIHMyKSkKKyAgICBuYW1lcy5zb3J0KGYpCisgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgIHByaW50IG5hbWUKKworCitkZWYgbWFpbigpOgorICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KKyAgICBhY2tzID0gQWNrbm93bGVkZ2VtZW50cygpCisgICAgbG9hZF9jdnNfbG9nX2Fja3MoYWNrcywgYXJncykKKyAgICBsb2FkX3RleF9zb3VyY2VfYWNrcyhhY2tzLCBhcmdzKQorICAgIHByaW50X2Fja19uYW1lcyhhY2tzKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvZmluZG1vZHJlZnMgYi9kb2MvdG9vbHMvZmluZG1vZHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGM1ZjkzZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy9maW5kbW9kcmVmcwpAQCAtMCwwICsxLDYzIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisjICAtKi0gUHl0aG9uIC0qLQorCitpbXBvcnQgZmlsZWlucHV0CitpbXBvcnQgZ2V0b3B0CitpbXBvcnQgZ2xvYgoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKKworCitkZWNsYXJlX3J4ID0gcmUuY29tcGlsZSgKKyAgICByIlxcZGVjbGFyZW1vZHVsZSg/OlxbW2EtekEtWjAtOV0qXF0qKT97W2EtekEtWl8wLTldK317KFthLXpBLVpfMC05XSspfSIpCisKK21vZHVsZV9yeCA9IHJlLmNvbXBpbGUociJcXG1vZHVsZXsoW2EtekEtWl8wLTldKyl9IikKKworZGVmIG1haW4oKToKKyAgICB0cnk6CisgICAgICAgIGp1c3RfbGlzdCA9IDAKKyAgICAgICAgcHJpbnRfbGluZW5vID0gMAorICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICJsbiIsIFsibGlzdCIsICJudW1iZXIiXSkKKyAgICAgICAgZm9yIG9wdCwgYXJnIGluIG9wdHM6CisgICAgICAgICAgICBpZiBvcHQgaW4gKCItbCIsICItLWxpc3QiKToKKyAgICAgICAgICAgICAgICBqdXN0X2xpc3QgPSAxCisgICAgICAgICAgICBlbGlmIG9wdCBpbiAoIi1uIiwgIi0tbnVtYmVyIik6CisgICAgICAgICAgICAgICAgcHJpbnRfbGluZW5vID0gMQorICAgICAgICBmaWxlcyA9IGFyZ3MKKyAgICAgICAgaWYgbm90IGZpbGVzOgorICAgICAgICAgICAgZmlsZXMgPSBnbG9iLmdsb2IoIioudGV4IikKKyAgICAgICAgICAgIGZpbGVzLnNvcnQoKQorICAgICAgICBtb2R1bGVuYW1lID0gTm9uZQorICAgICAgICBmb3IgbGluZSBpbiBmaWxlaW5wdXQuaW5wdXQoZmlsZXMpOgorICAgICAgICAgICAgaWYgbGluZVs6OV0gPT0gciJcc2VjdGlvbnsiOgorICAgICAgICAgICAgICAgIG1vZHVsZW5hbWUgPSBOb25lCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGxpbmVbOjE2XSA9PSByIlxtb2R1bGVzeW5vcHN5c3siOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBtID0gZGVjbGFyZV9yeC5tYXRjaChsaW5lKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICBtb2R1bGVuYW1lID0gbS5ncm91cCgxKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBub3QgbW9kdWxlbmFtZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbSA9IG1vZHVsZV9yeC5zZWFyY2gobGluZSkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgbmFtZSA9IG0uZ3JvdXAoMSkKKyAgICAgICAgICAgICAgICBpZiBuYW1lICE9IG1vZHVsZW5hbWU6CisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZWlucHV0LmZpbGVuYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgaWYganVzdF9saXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgZmlsZW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVpbnB1dC5uZXh0ZmlsZSgpCisgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVuYW1lID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBlbGlmIHByaW50X2xpbmVubzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICIlcyglZCk6JXMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGZpbGVuYW1lLCBmaWxlaW5wdXQuZmlsZWxpbmVubygpLCBsaW5lWzotMV0pCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiJXM6JXMiICUgKGZpbGVuYW1lLCBsaW5lWzotMV0pCisgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICBzeXMuZXhpdCgxKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvZml4X2hhY2sgYi9kb2MvdG9vbHMvZml4X2hhY2sKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGRhZDExMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy9maXhfaGFjawpAQCAtMCwwICsxLDIgQEAKKyMhL2Jpbi9zaAorc2VkIC1lICdzL3tcXHB0dFsgCV0qXFxjaGFyWyAJXSonIiciJzEzN30vXy9nJyA8IiQxIiA+ICJAJDEiICYmIG12ICJAJDEiICQxCmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvZml4X2xpYmF1eC5zZWQgYi9kb2MvdG9vbHMvZml4X2xpYmF1eC5zZWQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmIzM2NjNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy9maXhfbGliYXV4LnNlZApAQCAtMCwwICsxLDMgQEAKKyMhIC9iaW4vc2VkIC1mCitzL3tcXHR0ICBcXGhhY2tzY29yZSAge31cXGhhY2tzY29yZSAge30vXFxzZWN0Y29kZXtfXy8KK3MvXFxoYWNrc2NvcmUgIHt9XFxoYWNrc2NvcmUgIHt9L19fLwpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2ZpeGluZm8uZWwgYi9kb2MvdG9vbHMvZml4aW5mby5lbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjdhN2UzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL2ZpeGluZm8uZWwKQEAgLTAsMCArMSwxNSBAQAorKGRlZnVuIGZpeC1weXRob24tdGV4aW5mbyAoKQorICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAocmVwbGFjZS1yZWdleHAgIlxcKEBzZXRmaWxlbmFtZSBcXClcXChbLWEtel0qXFwpJCIKKwkJICAiXFwxcHl0aG9uLVxcMi5pbmZvIikKKyAgKHJlcGxhY2Utc3RyaW5nICJAbm9kZSBGcm9udCBNYXR0ZXJcbkBjaGFwdGVyIEFic3RyYWN0XG4iCisJCSAgIkBub2RlIEFic3RyYWN0XG5Ac2VjdGlvbiBBYnN0cmFjdFxuIikKKyAgKG1hcmstd2hvbGUtYnVmZmVyKQorICAodGV4aW5mby1tYXN0ZXItbWVudSAndXBkYXRlLWFsbC1ub2RlcykKKyAgKHNhdmUtYnVmZmVyKQorICApCTs7IGZpeC1weXRob24tdGV4aW5mbworCis7OyBub3cgcmVhbGx5IGRvIGl0OgorKGZpbmQtZmlsZSAoY2FyIGNvbW1hbmQtbGluZS1hcmdzLWxlZnQpKQorKGZpeC1weXRob24tdGV4aW5mbykKKyhraWxsLWVtYWNzKQpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2dldHBhZ2Vjb3VudHMgYi9kb2MvdG9vbHMvZ2V0cGFnZWNvdW50cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNzljZWQxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL2dldHBhZ2Vjb3VudHMKQEAgLTAsMCArMSw4OCBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorIyAgLSotIFB5dGhvbiAtKi0KKworIiIiR2VuZXJhdGUgYSBwYWdlIGNvdW50IHJlcG9ydCBvZiB0aGUgUG9zdFNjcmlwdCB2ZXJzaW9uIG9mIHRoZSBtYW51YWxzLiIiIgorCitfX3ZlcnNpb25fXyA9ICckUmV2aXNpb246IDEuMS4xLjEgJCcKKworCitjbGFzcyBQYWdlQ291bnRlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZG9jbGlzdCA9IFtdCisgICAgICAgIHNlbGYudG90YWwgPSAwCisgICAgICAgIHNlbGYudGl0bGVfd2lkdGggPSAwCisKKyAgICBkZWYgYWRkX2RvY3VtZW50KHNlbGYsIHByZWZpeCwgdGl0bGUpOgorICAgICAgICBjb3VudCA9IGNvdW50X3BhZ2VzKHByZWZpeCArICIucHMiKQorICAgICAgICBzZWxmLmRvY2xpc3QuYXBwZW5kKCh0aXRsZSwgcHJlZml4LCBjb3VudCkpCisgICAgICAgIHNlbGYudGl0bGVfd2lkdGggPSBtYXgoc2VsZi50aXRsZV93aWR0aCwgbGVuKHRpdGxlKSkKKyAgICAgICAgc2VsZi50b3RhbCA9IHNlbGYudG90YWwgKyBjb3VudAorCisgICAgZGVmIGR1bXAoc2VsZik6CisgICAgICAgIGZtdCA9ICIlJS0lZHMgICglJXMucHMsICUlZCBwYWdlcykiICUgc2VsZi50aXRsZV93aWR0aAorICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLmRvY2xpc3Q6CisgICAgICAgICAgICBwcmludCBmbXQgJSBpdGVtCisgICAgICAgIHByaW50CisgICAgICAgIHByaW50ICIgIFRvdGFsIHBhZ2UgY291bnQ6ICAlZCIgJSBzZWxmLnRvdGFsCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBmb3IgcHJlZml4LCB0aXRsZSBpbiBbCisgICAgICAgICAgICAoImFwaSIsICJQeXRob24vQyBBUEkiKSwKKyAgICAgICAgICAgICgiZXh0IiwgIkV4dGVuZGluZyBhbmQgRW1iZWRkaW5nIHRoZSBQeXRob24gSW50ZXJwcmV0ZXIiKSwKKyAgICAgICAgICAgICgibGliIiwgIlB5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZSIpLAorICAgICAgICAgICAgKCJtYWMiLCAiTWFjaW50b3NoIE1vZHVsZSBSZWZlcmVuY2UiKSwKKyAgICAgICAgICAgICgicmVmIiwgIlB5dGhvbiBSZWZlcmVuY2UgTWFudWFsIiksCisgICAgICAgICAgICAoInR1dCIsICJQeXRob24gVHV0b3JpYWwiKSwKKyAgICAgICAgICAgICgiZG9jIiwgIkRvY3VtZW50aW5nIFB5dGhvbiIpLAorICAgICAgICAgICAgKCJpbnN0IiwgIkluc3RhbGxpbmcgUHl0aG9uIE1vZHVsZXMiKSwKKyAgICAgICAgICAgICgiZGlzdCIsICJEaXN0cmlidXRpbmcgUHl0aG9uIE1vZHVsZXMiKSwKKyAgICAgICAgICAgIF06CisgICAgICAgICAgICBzZWxmLmFkZF9kb2N1bWVudChwcmVmaXgsIHRpdGxlKQorICAgICAgICBwcmludCBzZWxmLlBSRUZJWAorICAgICAgICBzZWxmLmR1bXAoKQorICAgICAgICBwcmludCBzZWxmLlNVRkZJWAorCisgICAgUFJFRklYID0gIiIiXAorVGhpcyBpcyB0aGUgUG9zdFNjcmlwdCB2ZXJzaW9uIG9mIHRoZSBzdGFuZGFyZCBQeXRob24gZG9jdW1lbnRhdGlvbi4KK0lmIHlvdSBwbGFuIHRvIHByaW50IHRoaXMsIGJlIGF3YXJlIHRoYXQgc29tZSBvZiB0aGUgZG9jdW1lbnRzIGFyZQorbG9uZy4gIEl0IGlzIGZvcm1hdHRlZCBmb3IgcHJpbnRpbmcgb24gdHdvLXNpZGVkIHBhcGVyOyBpZiB5b3UgZG8gcGxhbgordG8gcHJpbnQgdGhpcywgKnBsZWFzZSogcHJpbnQgdHdvLXNpZGVkIGlmIHlvdSBoYXZlIGEgcHJpbnRlciBjYXBhYmxlCitvZiBpdCEgIFRvIGxvY2F0ZSBwdWJsaXNoZWQgY29waWVzIG9mIHRoZSBsYXJnZXIgbWFudWFscywgb3Igb3RoZXIKK1B5dGhvbiByZWZlcmVuY2UgbWF0ZXJpYWwsIGNvbnN1bHQgdGhlIFBTQSBPbmxpbmUgQm9va3N0b3JlIGF0OgorCisgICAgICAgICAgICAgaHR0cDovL3d3dy5weXRob24ub3JnL3BzYS9ib29rc3RvcmUvCisKK1RoZSBmb2xsb3dpbmcgbWFudWFscyBhcmUgaW5jbHVkZWQ6CisiIiIKKyAgICBTVUZGSVggPSAiIiJcCisKKworSWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucywgY29tbWVudHMsIG9yIHN1Z2dlc3Rpb25zIHJlZ2FyZGluZyB0aGVzZQorZG9jdW1lbnRzLCBwbGVhc2Ugc2VuZCB0aGVtIHZpYSBlbWFpbCB0byBweXRob24tZG9jc0BweXRob24ub3JnLgorCitJZiB5b3Ugd291bGQgbGlrZSB0byBzdXBwb3J0IHRoZSBkZXZlbG9wbWVudCBhbmQgbWFpbnRlbmFuY2Ugb2YKK2RvY3VtZW50YXRpb24gZm9yIFB5dGhvbiwgcGxlYXNlIGNvbnNpZGVyIGpvaW5pbmcgdGhlIFB5dGhvbiBTb2Z0d2FyZQorQWN0aXZpdHkgKFBTQTsgc2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9wc2EvKSwgb3IgdXJnaW5nIHlvdXIKK29yZ2FuaXphdGlvbiB0byBqb2luIHRoZSBQU0Egb3IgdGhlIFB5dGhvbiBDb25zb3J0aXVtIChzZWUKK2h0dHA6Ly93d3cucHl0aG9uLm9yZy9jb25zb3J0aXVtLykuCisiIiIKKworZGVmIGNvdW50X3BhZ2VzKGZpbGVuYW1lKToKKyAgICBmcCA9IG9wZW4oZmlsZW5hbWUpCisgICAgY291bnQgPSAwCisgICAgd2hpbGUgMToKKyAgICAgICAgbGluZXMgPSBmcC5yZWFkbGluZXMoMTAyNCo0MCkKKyAgICAgICAgaWYgbm90IGxpbmVzOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICBpZiBsaW5lWzo3XSA9PSAiJSVQYWdlOiI6CisgICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICBmcC5jbG9zZSgpCisgICAgcmV0dXJuIGNvdW50CisKKworZGVmIG1haW4oKToKKyAgICBQYWdlQ291bnRlcigpLnJ1bigpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvaHRtbC9hYm91dC5kYXQgYi9kb2MvdG9vbHMvaHRtbC9hYm91dC5kYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZmOGI1NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy9odG1sL2Fib3V0LmRhdApAQCAtMCwwICsxLDI0IEBACis8cD4gVGhpcyBkb2N1bWVudCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHRoZSA8YQorICAgIGhyZWY9Imh0dHA6Ly9zYWZ0c2Fjay5mcy51bmktYmF5cmV1dGguZGUvO1NQTXRpbGRlO2xhdGV4Mmh0LyI+CisgICAgPHN0cm9uZz5MYVRlWDwvc3Ryb25nPjI8dHQ+SFRNTDwvdHQ+PC9hPiB0cmFuc2xhdG9yLgorPC9wPgorCis8cD4gPGEKKyAgICBocmVmPSJodHRwOi8vc2FmdHNhY2suZnMudW5pLWJheXJldXRoLmRlLztTUE10aWxkZTtsYXRleDJodC8iPgorICAgIDxzdHJvbmc+TGFUZVg8L3N0cm9uZz4yPHR0PkhUTUw8L3R0PjwvYT4gaXMgQ29weXJpZ2h0ICZjb3B5OworICAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCA8YQorICAgIGhyZWY9Imh0dHA6Ly9jYmwubGVlZHMuYWMudWsvbmlrb3MvcGVyc29uYWwuaHRtbCI+Tmlrb3MKKyAgICBEcmFrb3M8L2E+LCBDb21wdXRlciBCYXNlZCBMZWFybmluZyBVbml0LCBVbml2ZXJzaXR5IG9mCisgIExlZWRzLCBhbmQgQ29weXJpZ2h0ICZjb3B5OyAxOTk3LCAxOTk4LCA8YQorICAgIGhyZWY9Imh0dHA6Ly93d3cubWF0aHMubXEuZWR1LmF1LztTUE10aWxkZTtyb3NzLyI+Um9zcworICAgIE1vb3JlPC9hPiwgTWF0aGVtYXRpY3MgRGVwYXJ0bWVudCwgTWFjcXVhcmllIFVuaXZlcnNpdHksCisgIFN5ZG5leS4KKzwvcD4KKworPHA+IFRoZSBhcHBsaWNhdGlvbiBvZiA8YQorICAgIGhyZWY9Imh0dHA6Ly9zYWZ0c2Fjay5mcy51bmktYmF5cmV1dGguZGUvO1NQTXRpbGRlO2xhdGV4Mmh0LyI+CisgICAgPHN0cm9uZz5MYVRlWDwvc3Ryb25nPjI8dHQ+SFRNTDwvdHQ+PC9hPiB0byB0aGUgUHl0aG9uCisgIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gaGVhdmlseSB0YWlsb3JlZCBieSBGcmVkIEwuIERyYWtlLAorICBKci4gIE9yaWdpbmFsIG5hdmlnYXRpb24gaWNvbnMgd2VyZSBjb250cmlidXRlZCBieSBDaHJpc3RvcGhlcgorICBQZXRyaWxsaS4KKzwvcD4KZGlmZiAtLWdpdCBhL2RvYy90b29scy9odG1sL2Fib3V0Lmh0bWwgYi9kb2MvdG9vbHMvaHRtbC9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMDNmYWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvaHRtbC9hYm91dC5odG1sCkBAIC0wLDAgKzEsNzQgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkFib3V0IHRoZSBQeXRob24gRG9jdW1lbnRhdGlvbjwvdGl0bGU+CisgICAgPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iCisgICAgICBjb250ZW50PSJPdmVydmlldyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24iPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorICAgIDxsaW5rIHJlbD0iU1RZTEVTSEVFVCIgaHJlZj0ibGliL2xpYi5jc3MiPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxkaXYgY2xhc3M9Im5hdmlnYXRpb24iPgorICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjIiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD48aW1nIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIiBhbHQ9IiIKKyAgICAgICAgICAgICAgICBzcmM9Imljb25zL2JsYW5rLmdpZiI+PC90ZD4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSIuLyIKKyAgICAgICAgICAgICAgICB0aXRsZT0iUHl0aG9uIERvY3VtZW50YXRpb24gSW5kZXgiPjxpbWcgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIgorICAgICAgICAgICAgICAgICAgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIiBhbHQ9InVwIgorICAgICAgICAgICAgICAgICAgc3JjPSJpY29ucy91cC5naWYiPjwvYT48L3RkPgorICAgICAgICAgICAgPHRkPjxpbWcgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiIGFsdD0iIgorICAgICAgICAgICAgICAgIHNyYz0iaWNvbnMvYmxhbmsuZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIj5BYm91dCB0aGUgUHl0aG9uIERvY3VtZW50YXRpb248L3RkPgorICAgICAgICAgICAgPHRkPjxpbWcgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiIGFsdD0iIgorICAgICAgICAgICAgICAgIHNyYz0iaWNvbnMvYmxhbmsuZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkPjxpbWcgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiIGFsdD0iIgorICAgICAgICAgICAgICAgIHNyYz0iaWNvbnMvYmxhbmsuZ2lmIj48L3RkPgorICAgICAgICAgICAgPHRkPjxpbWcgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiIGFsdD0iIgorICAgICAgICAgICAgICAgIHNyYz0iaWNvbnMvYmxhbmsuZ2lmIj48L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICA8L3RhYmxlPgorICAgICAgPGIgY2xhc3M9Im5hdmxhYmVsIj5VcDo8L2I+CisgICAgICA8c3BhbiBjbGFzcz0ic2VjdHJlZiI+CisgICAgICAgIDxhIGhyZWY9Ii4vIiB0aXRsZT0iUHl0aG9uIERvY3VtZW50YXRpb24gSW5kZXgiPgorICAgICAgICAgIFB5dGhvbiBEb2N1bWVudGF0aW9uIEluZGV4PC9BPjwvc3Bhbj4KKyAgICAgIDxicj4KKyAgICA8L2Rpdj4KKyAgICA8aHI+CisKKyAgICA8aDI+QWJvdXQgdGhlIFB5dGhvbiBEb2N1bWVudGF0aW9uPC9oMj4KKworICAgIDxwPlRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IEd1aWRvIHZhbgorICAgICAgUm9zc3VtLCBidXQgaGFzIGluY3JlYXNpbmdseSBiZWNvbWUgYSBjb21tdW5pdHkgZWZmb3J0IG92ZXIgdGhlCisgICAgICBwYXN0IHNldmVyYWwgeWVhcnMuICBUaGlzIGdyb3dpbmcgY29sbGVjdGlvbiBvZiBkb2N1bWVudHMgaXMKKyAgICAgIGF2YWlsYWJsZSBpbiBzZXZlcmFsIGZvcm1hdHMsIGluY2x1ZGluZyB0eXBlc2V0IHZlcnNpb25zIGluIFBERgorICAgICAgYW5kIFBvc3RTY3JpcHQgZm9yIHByaW50aW5nLCBmcm9tIHRoZSA8YQorICAgICAgICBocmVmPSJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIj5QeXRob24gV2ViIHNpdGU8L2E+LgorCisgICAgPHA+QSA8YSBocmVmPSJhY2tzLmh0bWwiPmxpc3Qgb2YgY29udHJpYnV0b3JzPC9hPiBpcyBhdmFpbGFibGUuCisKKyAgICA8aDI+Q29tbWVudHMgYW5kIFF1ZXN0aW9uczwvaDI+CisKKyAgICA8cD4gR2VuZXJhbCBjb21tZW50cyBhbmQgcXVlc3Rpb25zIHJlZ2FyZGluZyB0aGlzIGRvY3VtZW50IHNob3VsZAorICAgICAgYmUgc2VudCBieSBlbWFpbCB0byA8YSBocmVmPSJtYWlsdG86cHl0aG9uLWRvY3NAcHl0aG9uLm9yZyIKKyAgICAgICAgPnB5dGhvbi1kb2NzQHB5dGhvbi5vcmc8L2E+LiAgSWYgeW91IGZpbmQgc3BlY2lmaWMgZXJyb3JzIGluCisgICAgICB0aGlzIGRvY3VtZW50LCBwbGVhc2UgcmVwb3J0IHRoZSBidWcgYXQgdGhlIDxhCisgICAgICAgIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvYnVncy8/Z3JvdXBfaWQ9NTQ3MCI+UHl0aG9uIEJ1ZworICAgICAgICBUcmFja2VyPC9hPiBhdCA8YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0LyI+U291cmNlRm9yZ2U8L2E+LgorICAgIDwvcD4KKworICAgIDxwPiBRdWVzdGlvbnMgcmVnYXJkaW5nIGhvdyB0byB1c2UgdGhlIGluZm9ybWF0aW9uIGluIHRoaXMKKyAgICAgIGRvY3VtZW50IHNob3VsZCBiZSBzZW50IHRvIHRoZSBQeXRob24gbmV3cyBncm91cCwgPGEKKyAgICAgICAgaHJlZj0ibmV3czpjb21wLmxhbmcucHl0aG9uIj5jb21wLmxhbmcucHl0aG9uPC9hPiwgb3IgdGhlIDxhCisgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cucHl0aG9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL3B5dGhvbi1saXN0IgorICAgICAgICA+UHl0aG9uIG1haWxpbmcgbGlzdDwvYT4gKHdoaWNoIGlzIGdhdGVkIHRvIHRoZSBuZXdzZ3JvdXAgYW5kCisgICAgICBjYXJyaWVzIHRoZSBzYW1lIGNvbnRlbnQpLgorICAgIDwvcD4KKworICAgIDxwPiBGb3IgYW55IG9mIHRoZXNlIGNoYW5uZWxzLCBwbGVhc2UgYmUgc3VyZSBub3QgdG8gc2VuZCBIVE1MIGVtYWlsLgorICAgICAgVGhhbmtzLgorICAgIDwvcD4KKworICAgIDxocj4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvYmxhbmsuZ2lmIGIvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvYmxhbmsuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMzFmNGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvaHRtbC9pY29ucy9ibGFuay5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvYmxhbmsucG5nIGIvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvYmxhbmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZjU2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvaHRtbC9pY29ucy9ibGFuay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvY29udGVudHMuZ2lmIGIvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvY29udGVudHMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMjk5YzQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvaHRtbC9pY29ucy9jb250ZW50cy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvY29udGVudHMucG5nIGIvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvY29udGVudHMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MjliZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvaHRtbC9pY29ucy9jb250ZW50cy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvaW5kZXguZ2lmIGIvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvaW5kZXguZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZWVjZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvaHRtbC9pY29ucy9pbmRleC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvaW5kZXgucG5nIGIvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvaW5kZXgucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOTE4YWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvaHRtbC9pY29ucy9pbmRleC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvbW9kdWxlcy5naWYgYi9kb2MvdG9vbHMvaHRtbC9pY29ucy9tb2R1bGVzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTg2MGI2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvbW9kdWxlcy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvbW9kdWxlcy5wbmcgYi9kb2MvdG9vbHMvaHRtbC9pY29ucy9tb2R1bGVzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmE4Yjc1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvbW9kdWxlcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvbmV4dC5naWYgYi9kb2MvdG9vbHMvaHRtbC9pY29ucy9uZXh0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGNhZmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvbmV4dC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvbmV4dC5wbmcgYi9kb2MvdG9vbHMvaHRtbC9pY29ucy9uZXh0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmU1ZTUxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvbmV4dC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvcHJldmlvdXMuZ2lmIGIvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvcHJldmlvdXMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMWRhMTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvaHRtbC9pY29ucy9wcmV2aW91cy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvcHJldmlvdXMucG5nIGIvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvcHJldmlvdXMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5N2RlZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvaHRtbC9pY29ucy9wcmV2aW91cy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvdXAuZ2lmIGIvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvdXAuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZDNlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvaHRtbC9pY29ucy91cC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvdXAucG5nIGIvZG9jL3Rvb2xzL2h0bWwvaWNvbnMvdXAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MGUwMjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvaHRtbC9pY29ucy91cC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2h0bWwvaW5kZXguaHRtbC5pbiBiL2RvYy90b29scy9odG1sL2luZGV4Lmh0bWwuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZiMjhjYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy9odG1sL2luZGV4Lmh0bWwuaW4KQEAgLTAsMCArMSwxMTcgQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+UHl0aG9uIEBSRUxFQVNFQCBEb2N1bWVudGF0aW9uIC0gQERBVEVAPC90aXRsZT4KKyAgICA8bGluayByZWw9IlNUWUxFU0hFRVQiIGhyZWY9ImxpYi9saWIuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iCisgICAgICAgICAgY29udGVudD0iVG9wLWxldmVsIGluZGV4IHRvIHRoZSBzdGFuZGFyZCBkb2N1bWVudGF0aW9uIGZvcgorICAgICAgICAgICAgICAgICAgIFB5dGhvbiBAUkVMRUFTRUAuIj4KKyAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgYS50aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDExMCU7IH0KKyAgICAgIHVsIHsgbWFyZ2luLWxlZnQ6IDFlbTsgcGFkZGluZzogMHB0OyBib3JkZXI6IDBwdDsgfQorICAgIDwvc3R5bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisJPGRpdiBjbGFzcz0ibmF2aWdhdGlvbiI+CisJPHRhYmxlIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjIiPgorCTx0cj4KKwkgIDx0ZD48aW1nIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIiBhbHQ9IiIKKwkgICAgICBzcmM9Imljb25zL2JsYW5rLmdpZiI+PC90ZD4KKwkgIDx0ZD48aW1nIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIiBhbHQ9IiIKKwkgICAgICBzcmM9Imljb25zL2JsYW5rLmdpZiI+PC90ZD4KKwkgIDx0ZD48aW1nIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIiBhbHQ9IiIKKwkgICAgICBzcmM9Imljb25zL2JsYW5rLmdpZiI+PC90ZD4KKwkgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSI+CisJICAgIDxiIGNsYXNzPSJ0aXRsZSI+UHl0aG9uIERvY3VtZW50YXRpb248L2I+PC90ZD4KKwkgIDx0ZD48aW1nIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIiBhbHQ9IiIKKwkgICAgICBzcmM9Imljb25zL2JsYW5rLmdpZiI+PC90ZD4KKwkgIDx0ZD48YSBocmVmPSJtb2RpbmRleC5odG1sIj48aW1nIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIKKwkJYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIiBhbHQ9Ik1vZHVsZSBJbmRleCIKKwkJc3JjPSJpY29ucy9tb2R1bGVzLmdpZiI+PC9hPjwvdGQ+CisJICA8dGQ+PGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCIgYWx0PSIiCisJICAgICAgc3JjPSJpY29ucy9ibGFuay5naWYiPjwvQT48L3RkPgorCTwvdHI+CisJPC90YWJsZT4KKyAgICAgICAgPGhyPgorCTwvZGl2PgorICAgIDxkaXYgYWxpZ249ImNlbnRlciIgY2xhc3M9InRpdGxlcGFnZSI+CisgICAgICA8aDE+UHl0aG9uIERvY3VtZW50YXRpb248L2gxPgorCisgICAgICA8cD4KKwk8c3Ryb25nPlJlbGVhc2UgQFJFTEVBU0VAPC9zdHJvbmc+CisJPGJyPgorCTxzdHJvbmc+QERBVEVAPC9zdHJvbmc+CisgICAgICA8L3A+CisgICAgPC9kaXY+CisKKyAgICA8dGFibGUgYWxpZ249ImNlbnRlciI+CisgICAgICA8dGJvZHk+CisgICAgICA8dHI+PHRkPgorCSAgPHVsPgorCSAgICA8bGk+IDxhIGhyZWY9InR1dC90dXQuaHRtbCIgY2xhc3M9InRpdGxlIj5UdXRvcmlhbDwvYT4KKwkgICAgICA8YnI+KHN0YXJ0IGhlcmUpCisKKwkgICAgPGxpPiA8YSBocmVmPSJtb2RpbmRleC5odG1sIiBjbGFzcz0idGl0bGUiPkdsb2JhbCBNb2R1bGUgSW5kZXg8L2E+CisJICAgICAgPGJyPihmb3IgcXVpY2sgYWNjZXNzIHRvIGFsbCBkb2N1bWVudGF0aW9uKQorCisJICAgIDxsaT4gPGEgaHJlZj0ibGliL2xpYi5odG1sIiBjbGFzcz0idGl0bGUiPkxpYnJhcnkgUmVmZXJlbmNlPC9hPgorCSAgICAgIDxicj4oa2VlcCB0aGlzIHVuZGVyIHlvdXIgcGlsbG93KQorCisJICAgIDxsaT4gPGEgaHJlZj0ibWFjL21hYy5odG1sIiBjbGFzcz0idGl0bGUiPk1hY2ludG9zaCBNb2R1bGUKKwkJUmVmZXJlbmNlPC9hPgorCSAgICAgIDxicj4odGhpcyB0b28sIGlmIHlvdSB1c2UgYSBNYWNpbnRvc2gpCisKKwkgICAgPGxpPiA8YSBocmVmPSJpbnN0L2luc3QuaHRtbCIgY2xhc3M9InRpdGxlIj5JbnN0YWxsaW5nCisJCVB5dGhvbiBNb2R1bGVzPC9hPgorCSAgICAgIDxicj4oZm9yIGFkbWluaXN0cmF0b3JzKQorCSAgPC91bD4KKwkgIDwvdGQ+CisJICA8dGQ+CisJICA8dWw+CisJICAgIDxsaT4gPGEgaHJlZj0icmVmL3JlZi5odG1sIiBjbGFzcz0idGl0bGUiPkxhbmd1YWdlIFJlZmVyZW5jZTwvYT4KKwkgICAgICA8YnI+KGZvciBsYW5ndWFnZSBsYXd5ZXJzKQorCisJICAgIDxsaT4gPGEgaHJlZj0iZXh0L2V4dC5odG1sIiBjbGFzcz0idGl0bGUiPkV4dGVuZGluZyBhbmQKKwkJRW1iZWRkaW5nPC9hPgorCSAgICAgIDxicj4odHV0b3JpYWwgZm9yIEMvQysrIHByb2dyYW1tZXJzKQorCisJICAgIDxsaT4gPGEgaHJlZj0iYXBpL2FwaS5odG1sIiBjbGFzcz0idGl0bGUiPlB5dGhvbi9DIEFQSTwvYT4KKwkgICAgICA8YnI+KHJlZmVyZW5jZSBmb3IgQy9DKysgcHJvZ3JhbW1lcnMpCisKKwkgICAgPGxpPiA8YSBocmVmPSJkb2MvZG9jLmh0bWwiIGNsYXNzPSJ0aXRsZSI+RG9jdW1lbnRpbmcgUHl0aG9uPC9hPgorCSAgICAgIDxicj4oaW5mb3JtYXRpb24gZm9yIGRvY3VtZW50YXRpb24gYXV0aG9ycykKKworCSAgICA8bGk+IDxhIGhyZWY9ImRpc3QvZGlzdC5odG1sIiBjbGFzcz0idGl0bGUiPkRpc3RyaWJ1dGluZworCQlQeXRob24gTW9kdWxlczwvYT4KKwkgICAgICA8YnI+KGZvciBkZXZlbG9wZXJzIGFuZCBwYWNrYWdlcnMpCisJICA8L3VsPgorCSAgPC90ZD4KKwk8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkPgorICAgICAgICAgICZuYnNwOworICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT4gPGEgaHJlZj0iaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy8iIGNsYXNzPSJ0aXRsZSIKKyAgICAgICAgICAgICAgICA+RG9jdW1lbnRhdGlvbiBDZW50cmFsPC9hPgorICAgICAgICAgICAgICA8YnI+KGZvciBldmVyeW9uZSkKKyAgICAgICAgICA8L3VsPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgPHRkPgorICAgICAgICAgICZuYnNwOworICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT4gPGEgaHJlZj0iaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9ob3d0by8iIGNsYXNzPSJ0aXRsZSIKKyAgICAgICAgICAgICAgICA+UHl0aG9uIEhvdy1UbyBHdWlkZXM8L2E+CisgICAgICAgICAgICAgIDxicj4oc3BlY2lhbCB0b3BpY3MpCisgICAgICAgICAgPC91bD4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgPC90Ym9keT4KKyAgICA8L3RhYmxlPgorICAgIDxwPgorCisgICAgPGFkZHJlc3M+CisgICAgICA8aHI+CisgICAgICBTZWUgPGk+PGEgaHJlZj0iYWJvdXQuaHRtbCI+QWJvdXQgdGhlIFB5dGhvbiBEb2N1bWVudGF0aW9uPC9hPjwvaT4KKyAgICAgIGZvciBpbmZvcm1hdGlvbiBvbiBzdWdnZXN0aW5nIGNoYW5nZXMuCisgICAgPC9hZGRyZXNzPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvaHRtbC9zdGRhYm91dC5kYXQgYi9kb2MvdG9vbHMvaHRtbC9zdGRhYm91dC5kYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTliMjcxOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy9odG1sL3N0ZGFib3V0LmRhdApAQCAtMCwwICsxLDQ4IEBACis8cD4gVGhpcyBkb2N1bWVudCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHRoZSA8YQorICAgIGhyZWY9Imh0dHA6Ly9zYWZ0c2Fjay5mcy51bmktYmF5cmV1dGguZGUvO1NQTXRpbGRlO2xhdGV4Mmh0LyI+CisgICAgPHN0cm9uZz5MYVRlWDwvc3Ryb25nPjI8dHQ+SFRNTDwvdHQ+PC9hPiB0cmFuc2xhdG9yLgorPC9wPgorCis8cD4gPGEKKyAgICBocmVmPSJodHRwOi8vc2FmdHNhY2suZnMudW5pLWJheXJldXRoLmRlLztTUE10aWxkZTtsYXRleDJodC8iPgorICAgIDxzdHJvbmc+TGFUZVg8L3N0cm9uZz4yPHR0PkhUTUw8L3R0PjwvYT4gaXMgQ29weXJpZ2h0ICZjb3B5OworICAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCA8YQorICAgIGhyZWY9Imh0dHA6Ly9jYmwubGVlZHMuYWMudWsvbmlrb3MvcGVyc29uYWwuaHRtbCI+Tmlrb3MKKyAgICBEcmFrb3M8L2E+LCBDb21wdXRlciBCYXNlZCBMZWFybmluZyBVbml0LCBVbml2ZXJzaXR5IG9mCisgIExlZWRzLCBhbmQgQ29weXJpZ2h0ICZjb3B5OyAxOTk3LCAxOTk4LCA8YQorICAgIGhyZWY9Imh0dHA6Ly93d3cubWF0aHMubXEuZWR1LmF1LztTUE10aWxkZTtyb3NzLyI+Um9zcworICAgIE1vb3JlPC9hPiwgTWF0aGVtYXRpY3MgRGVwYXJ0bWVudCwgTWFjcXVhcmllIFVuaXZlcnNpdHksCisgIFN5ZG5leS4KKzwvcD4KKworPHA+IFRoZSBhcHBsaWNhdGlvbiBvZiA8YQorICAgIGhyZWY9Imh0dHA6Ly9zYWZ0c2Fjay5mcy51bmktYmF5cmV1dGguZGUvO1NQTXRpbGRlO2xhdGV4Mmh0LyI+CisgICAgPHN0cm9uZz5MYVRlWDwvc3Ryb25nPjI8dHQ+SFRNTDwvdHQ+PC9hPiB0byB0aGUgUHl0aG9uCisgIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gaGVhdmlseSB0YWlsb3JlZCBieSBGcmVkIEwuIERyYWtlLAorICBKci4gIE9yaWdpbmFsIG5hdmlnYXRpb24gaWNvbnMgd2VyZSBjb250cmlidXRlZCBieSBDaHJpc3RvcGhlcgorICBQZXRyaWxsaS4KKzwvcD4KKworPGhyPgorCis8aDI+Q29tbWVudHMgYW5kIFF1ZXN0aW9uczwvaDI+CisKKzxwPiBHZW5lcmFsIGNvbW1lbnRzIGFuZCBxdWVzdGlvbnMgcmVnYXJkaW5nIHRoaXMgZG9jdW1lbnQgc2hvdWxkCisgIGJlIHNlbnQgYnkgZW1haWwgdG8gPGEgaHJlZj0ibWFpbHRvOnB5dGhvbi1kb2NzQHB5dGhvbi5vcmciCisgICAgPnB5dGhvbi1kb2NzQHB5dGhvbi5vcmc8L2E+LiAgSWYgeW91IGZpbmQgc3BlY2lmaWMgZXJyb3JzIGluCisgIHRoaXMgZG9jdW1lbnQsIHBsZWFzZSByZXBvcnQgdGhlIGJ1ZyBhdCB0aGUgPGEKKyAgICBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L2J1Z3MvP2dyb3VwX2lkPTU0NzAiPlB5dGhvbiBCdWcKKyAgICBUcmFja2VyPC9hPiBhdCA8YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0LyI+U291cmNlRm9yZ2U8L2E+LgorPC9wPgorCis8cD4gUXVlc3Rpb25zIHJlZ2FyZGluZyBob3cgdG8gdXNlIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzCisgIGRvY3VtZW50IHNob3VsZCBiZSBzZW50IHRvIHRoZSBQeXRob24gbmV3cyBncm91cCwgPGEKKyAgICBocmVmPSJuZXdzOmNvbXAubGFuZy5weXRob24iPmNvbXAubGFuZy5weXRob248L2E+LCBvciB0aGUgPGEKKyAgICBocmVmPSJodHRwOi8vd3d3LnB5dGhvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9weXRob24tbGlzdCIKKyAgICA+UHl0aG9uIG1haWxpbmcgbGlzdDwvYT4gKHdoaWNoIGlzIGdhdGVkIHRvIHRoZSBuZXdzZ3JvdXAgYW5kCisgIGNhcnJpZXMgdGhlIHNhbWUgY29udGVudCkuCis8L3A+CisKKzxwPiBGb3IgYW55IG9mIHRoZXNlIGNoYW5uZWxzLCBwbGVhc2UgYmUgc3VyZSBub3QgdG8gc2VuZCBIVE1MIGVtYWlsLgorICBUaGFua3MuCis8L3A+CmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvaHRtbC9zdHlsZS5jc3MgYi9kb2MvdG9vbHMvaHRtbC9zdHlsZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY3Y2Y3NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy9odG1sL3N0eWxlLmNzcwpAQCAtMCwwICsxLDg4IEBACisvKgorICogVGhlIGZpcnN0IHBhcnQgb2YgdGhpcyBpcyB0aGUgc3RhbmRhcmQgQ1NTIGdlbmVyYXRlZCBieSBMYVRlWDJIVE1MLAorICogd2l0aCB0aGUgImVtcHR5IiBkZWNsYXJhdGlvbnMgcmVtb3ZlZC4KKyAqLworCisvKiBDZW50dXJ5IFNjaG9vbGJvb2sgZm9udCBpcyB2ZXJ5IHNpbWlsYXIgdG8gQ29tcHV0ZXIgTW9kZXJuIE1hdGg6IGNtbWkgKi8KKy5tYXRoICAgICAgICAgICAgICAgICAgIHsgZm9udC1mYW1pbHk6ICJDZW50dXJ5IFNjaG9vbGJvb2siLCBzZXJpZjsgfQorLm1hdGggaSAgICAgICAgICAgICAgICAgeyBmb250LWZhbWlseTogIkNlbnR1cnkgU2Nob29sYm9vayIsIHNlcmlmOworICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogYm9sZCB9CisuYm9sZG1hdGggICAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiAiQ2VudHVyeSBTY2hvb2xib29rIiwgc2VyaWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkIH0KKworLyogSW1wbGVtZW50IGJvdGggZml4ZWQtc2l6ZSBhbmQgcmVsYXRpdmUgc2l6ZXM6ICovCitzbWFsbC54dGlueSAgICAgICAgICAgICB7IGZvbnQtc2l6ZSA6IHh4LXNtYWxsIH0KK3NtYWxsLnRpbnkgICAgICAgICAgICAgIHsgZm9udC1zaXplIDogeC1zbWFsbCB9CitzbWFsbC5zY3JpcHRzaXplICAgICAgICB7IGZvbnQtc2l6ZSA6IHNtYWxsZXIgfQorc21hbGwuZm9vdG5vdGVzaXplICAgICAgeyBmb250LXNpemUgOiBzbWFsbCB9CitiaWcueGxhcmdlICAgICAgICAgICAgICB7IGZvbnQtc2l6ZSA6IGxhcmdlIH0KK2JpZy54eGxhcmdlICAgICAgICAgICAgIHsgZm9udC1zaXplIDogeC1sYXJnZSB9CitiaWcuaHVnZSAgICAgICAgICAgICAgICB7IGZvbnQtc2l6ZSA6IGxhcmdlciB9CitiaWcueGh1Z2UgICAgICAgICAgICAgICB7IGZvbnQtc2l6ZSA6IHh4LWxhcmdlIH0KKworLyoKKyAqIERvY3VtZW50LXNwZWNpZmljIHN0eWxlcyBjb21lIG5leHQ7CisgKiB0aGVzZSBhcmUgYWRkZWQgZm9yIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIHNpemUgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBIKiBlbGVtZW50cyBhcmUgYmVjYXVzZQorICogTmV0c2NhcGUgb24gU29sYXJpcyBvdGhlcndpc2UgZG9lc24ndCBnZXQgaXQgcmlnaHQ7IHRoZXkgYWxsIGVuZCB1cAorICogdGhlIG5vcm1hbCB0ZXh0IHNpemUuCisgKi8KKworYm9keSAgICAgICAgICAgICAgICAgICAgeyBjb2xvcjogIzAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsgfQorCithOmFjdGl2ZSAgICAgICAgICAgICAgICB7IGNvbG9yOiAjZmYwMDAwOyB9CithOnZpc2l0ZWQgICAgICAgICAgICAgICB7IGNvbG9yOiAjNTUxYThiOyB9CithOmxpbmsgICAgICAgICAgICAgICAgICB7IGNvbG9yOiAjMDAwMGJiOyB9CisKK2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYgIHsgZm9udC1mYW1pbHk6IGF2YW50Z2FyZGUsIHNhbnMtc2VyaWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkIH0KK2gxICAgICAgICAgICAgICAgICAgICAgIHsgZm9udC1zaXplOiAxODAlIH0KK2gyICAgICAgICAgICAgICAgICAgICAgIHsgZm9udC1zaXplOiAxNTAlIH0KK2gzLCBoNCAgICAgICAgICAgICAgICAgIHsgZm9udC1zaXplOiAxMjAlIH0KK2NvZGUsIHR0ICAgICAgICAgICAgICAgIHsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSB9Cit2YXIgICAgICAgICAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiB0aW1lcywgc2VyaWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbCB9CisKKy5uYXZpZ2F0aW9uIHRkICAgICAgICAgIHsgYmFja2dyb3VuZC1jb2xvcjogIzk5Y2NmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBhdmFudGdhcmRlLCBzYW5zLXNlcmlmOworICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDExMCUgfQorCisucmVsZWFzZS1pbmZvICAgICAgICAgICB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQorCisudGl0bGVncmFwaGljICAgICAgICAgICB7IHZlcnRpY2FsLWFsaWduOiB0b3A7IH0KKworLnZlcmJhdGltICAgICAgICAgICAgICAgeyBjb2xvcjogIzAwMDA4YiB9CisKKy5lbWFpbCAgICAgICAgICAgICAgICAgIHsgZm9udC1mYW1pbHk6IGF2YW50Z2FyZGUsIHNhbnMtc2VyaWYgfQorLm1pbWV0eXBlICAgICAgICAgICAgICAgeyBmb250LWZhbWlseTogYXZhbnRnYXJkZSwgc2Fucy1zZXJpZiB9CisubmV3c2dyb3VwICAgICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiBhdmFudGdhcmRlLCBzYW5zLXNlcmlmIH0KKy51cmwgICAgICAgICAgICAgICAgICAgIHsgZm9udC1mYW1pbHk6IGF2YW50Z2FyZGUsIHNhbnMtc2VyaWYgfQorLmZpbGUgICAgICAgICAgICAgICAgICAgeyBmb250LWZhbWlseTogYXZhbnRnYXJkZSwgc2Fucy1zZXJpZiB9CisKKy50YWJsZWhlYWRlciAgICAgICAgICAgIHsgYmFja2dyb3VuZC1jb2xvcjogIzk5Y2NmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1mYW1pbHk6IGF2YW50Z2FyZGUsIHNhbnMtc2VyaWY7IH0KKworLnJlZmNvdW50LWluZm8gICAgICAgICAgeyBmb250LXN0eWxlOiBpdGFsaWMgfQorLnJlZmNvdW50LWluZm8gLnZhbHVlICAgeyBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICMwMDY2MDAgfQorCisvKgorICogU29tZSBkZWNvcmF0aW9uIGZvciB0aGUgIlNlZSBhbHNvOiIgYmxvY2tzLCBpbiBwYXJ0IGluc3BpcmVkIGJ5IHNvbWUgb2YKKyAqIHRoZSBzdHlsaW5nIG9uIExhcnMgTWFyaXVzIEdhcnNob2wncyBYU0EgcGFnZXMuCisgKiAoVGhlIGJsdWUgaW4gdGhlIG5hdmlnYXRpb24gYmFycyBpcyAjOTlDQ0ZGLikKKyAqLworLnNlZWFsc28gICAgICAgICAgICAgICAgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmYWYwOworICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IHRoaW4gc29saWQgYmxhY2s7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDRwdCB9CisKKy5zZWVhbHNvIC5oZWFkaW5nICAgICAgIHsgZm9udC1zaXplOiAxMTAlIH0KKworLyoKKyAqIENsYXNzICdhdmFpbGFiaWxpdHknIGlzIHVzZWQgZm9yIG1vZHVsZSBhdmFpbGFiaWxpdHkgc3RhdGVtZW50cyBhdAorICogdGhlIHRvcCBvZiBtb2R1bGVzLgorICovCisuYXZhaWxhYmlsaXR5IC5wbGF0Zm9ybSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KZGlmZiAtLWdpdCBhL2RvYy90b29scy9odG1sMnRleGkucGwgYi9kb2MvdG9vbHMvaHRtbDJ0ZXhpLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJlMDUwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvaHRtbDJ0ZXhpLnBsCkBAIC0wLDAgKzEsMTc1MCBAQAorIyEgL3Vzci9iaW4vZW52IHBlcmwKKyMgaHRtbDJ0ZXhpLnBsIC0tIENvbnZlcnQgSFRNTCBkb2N1bWVudGF0aW9uIHRvIFRleGluZm8gZm9ybWF0CisjIE1pY2hhZWwgRXJuc3QgPG1lcm5zdEBjcy53YXNoaW5ndG9uLmVkdT4KKyMgVGltZS1zdGFtcDogPDE5OTktMDEtMTIgMjE6MzQ6MjcgbWVybnN0PgorCisjIFRoaXMgcHJvZ3JhbSBjb252ZXJ0cyBIVE1MIGRvY3VtZW50YXRpb24gdHJlZXMgaW50byBUZXhpbmZvIGZvcm1hdC4KKyMgR2l2ZW4gdGhlIG5hbWUgb2YgYSBtYWluIChvciBjb250ZW50cykgSFRNTCBmaWxlLCBpdCBwcm9jZXNzZXMgdGhhdCBmaWxlLAorIyBhbmQgb3RoZXIgZmlsZXMgKHRyYW5zaXRpdmVseSkgcmVmZXJlbmNlZCBieSBpdCwgaW50byBhIFRleGluZm8gZmlsZQorIyAod2hvc2UgbmFtZSBpcyBjaG9zZW4gZnJvbSB0aGUgZmlsZSBvciBkaXJlY3RvcnkgbmFtZSBvZiB0aGUgYXJndW1lbnQpLgorIyBGb3IgaW5zdGFuY2U6CisjICAgaHRtbDJ0ZXhpLnBsIGFwaS9pbmRleC5odG1sCisjIHByb2R1Y2VzIGZpbGUgImFwaS50ZXhpIi4KKworIyBUZXhpbmZvIGZvcm1hdCBjYW4gYmUgZWFzaWx5IGNvbnZlcnRlZCB0byBJbmZvIGZvcm1hdCAoZm9yIGJyb3dzaW5nIGluCisjIEVtYWNzIG9yIHRoZSBzdGFuZGFsb25lIEluZm8gYnJvd3NlciksIHRvIGEgcHJpbnRlZCBtYW51YWwsIG9yIHRvIEhUTUwuCisjIFRodXMsIGh0bWwydGV4aS5wbCBwZXJtaXRzIGNvbnZlcnNpb24gb2YgSFRNTCBmaWxlcyB0byBJbmZvIGZvcm1hdCwgYW5kCisjIHNlY29uZGFyaWx5IGVuYWJsZXMgcHJvZHVjaW5nIHByaW50ZWQgdmVyc2lvbnMgb2YgV2ViIHBhZ2UgaGllcmFyY2hpZXMuCisKKyMgVW5saWtlIEhUTUwsIEluZm8gZm9ybWF0IGlzIHNlYXJjaGFibGUuICBTaW5jZSBJbmZvIGlzIGludGVncmF0ZWQgaW50bworIyBFbWFjcywgb25lIGNhbiByZWFkIGRvY3VtZW50YXRpb24gd2l0aG91dCBzdGFydGluZyBhIHNlcGFyYXRlIFdlYgorIyBicm93c2VyLiAgQWRkaXRpb25hbGx5LCBJbmZvIGJyb3dzZXJzIChpbmNsdWRpbmcgRW1hY3MpIGNvbnRhaW4KKyMgY29udmVuaWVudCBmZWF0dXJlcyBtaXNzaW5nIGZyb20gV2ViIGJyb3dzZXJzLCBzdWNoIGFzIGVhc3kgaW5kZXggbG9va3VwCisjIGFuZCBtb3VzZS1mcmVlIGJyb3dzaW5nLgorCisjIExpbWl0YXRpb25zOgorIyBodG1sMnRleGkucGwgaXMgY3VycmVudGx5IHR1bmVkIHRvIGxhdGV4Mmh0bWwgb3V0cHV0IChhbmQgaXQgY29ycmVjdHMKKyMgc2V2ZXJhbCBsYXRleDJodG1sIGJ1Z3MpLCBidXQgc2hvdWxkIGJlIGV4dGVuc2libGUgdG8gYXJiaXRyYXJ5IEhUTUwKKyMgZG9jdW1lbnRzLiAgSXQgd2lsbCBiZSBtb3N0IHVzZWZ1bCBmb3IgSFRNTCB3aXRoIGEgaGllcmFyY2hpY2FsIHN0cnVjdHVyZQorIyBhbmQgYW4gaW5kZXgsIGFuZCBpdCByZWNvZ25pemVzIHRob3NlIGZlYXR1cmVzIGFzIGNyZWF0ZWQgYnkgbGF0ZXgyaHRtbAorIyAoYW5kIHBvc3NpYmx5IGJ5IHNvbWUgb3RoZXIgdG9vbHMpLiAgVGhlIEhUTUwgdHJlZSB0byBiZSB0cmF2ZXJzZWQgbXVzdAorIyBiZSBvbiBsb2NhbCBkaXNrLCByYXRoZXIgdGhhbiBiZWluZyBhY2Nlc3NlZCB2aWEgSFRUUC4KKyMgVGhpcyBzY3JpcHQgcmVxdWlyZXMgdGhlIHVzZSBvZiAiY2hlY2thcmdzLnBtIi4gIFRvIGVsaW1pbmF0ZSB0aGF0CisjIGRlcGVuZGVuY2UsIHJlcGxhY2UgY2FsbHMgdG8gY2hlY2tfYXJncyogYnkgQF8gKHdoaWNoIGlzIGFsd2F5cyB0aGUgbGFzdAorIyBhcmd1bWVudCB0byB0aG9zZSBmdW5jdGlvbnMpLgorIyBBbHNvIHNlZSB0aGUgInRvIGRvIiBzZWN0aW9uLCBiZWxvdy4KKyMgQ29tbWVudHMsIHN1Z2dlc3Rpb25zLCBidWcgZml4ZXMsIGFuZCBlbmhhbmNlbWVudHMgYXJlIHdlbGNvbWUuCisKKyMgVHJvdWJsZXNob290aW5nOgorIyBNYWxmb3JtZWQgSFRNTCBjYW4gY2F1c2UgdGhpcyBwcm9ncmFtIHRvIGFib3J0LCBzbworIyB5b3Ugc2hvdWxkIGNoZWNrIHlvdXIgSFRNTCBmaWxlcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgbGVnYWwuCisKKworIyMjCisjIyMgVHlwaWNhbCB1c2FnZSBmb3IgdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uOgorIyMjCisKKyMgKEFjdHVhbGx5LCBtb3N0IG9mIHRoaXMgaXMgaW4gYSBNYWtlZmlsZSBpbnN0ZWFkLikKKyMgVGhlIHJlc3VsdGluZyBJbmZvIGZvcm1hdCBQeXRob24gZG9jdW1lbnRhdGlvbiBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGF0CisjIGZ0cDovL2Z0cC5jcy53YXNoaW5ndG9uLmVkdS9ob21lcy9tZXJuc3QvcHl0aG9uLWluZm8udGFyLmd6CisKKyMgRml4IHVwIEhUTUwgcHJvYmxlbXMsIGVnIDxEVD48REwgQ09NUEFDVD48REQ+IHNob3VsZCBiZSA8RFQ+PERMIENPTVBBQ1Q+PEREPi4KKworIyBodG1sMnRleGkucGwgL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL2luZGV4Lmh0bWwKKyMgaHRtbDJ0ZXhpLnBsIC9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2V4dC9pbmRleC5odG1sCisjIGh0bWwydGV4aS5wbCAvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9saWIvaW5kZXguaHRtbAorIyBodG1sMnRleGkucGwgL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvbWFjL2luZGV4Lmh0bWwKKyMgaHRtbDJ0ZXhpLnBsIC9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL3JlZi9pbmRleC5odG1sCisjIGh0bWwydGV4aS5wbCAvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC90dXQvaW5kZXguaHRtbAorCisjIEVkaXQgdGhlIGdlbmVyYXRlZCAudGV4aSBmaWxlczoKKyMgICAqIGNoYW5nZSBAc2V0ZmlsZW5hbWUgdG8gcHJlZml4ICJweXRob24tIgorIyAgICogZml4IHVwIGFueSBzZWN0aW9uaW5nLCBzdWNoIGFzIGZvciBBYnN0cmFjdAorIyAgICogbWFrZSBUZXhpbmZvIG1lbnVzCisjICAgKiBwZXJoYXBzIHJlbW92ZSB0aGUgQGRldGFpbG1lbnUgLi4uIEBlbmQgZGV0YWlsbWVudQorIyBJbiBFbWFjcywgdG8gZG8gYWxsIHRoaXM6CisjICAgKHByb2duIChnb3RvLWNoYXIgKHBvaW50LW1pbikpIChyZXBsYWNlLXJlZ2V4cCAiXFwoQHNldGZpbGVuYW1lIFxcKVxcKFstYS16XSpcXCkkIiAiXFwxcHl0aG9uLVxcMi5pbmZvIikgKHJlcGxhY2Utc3RyaW5nICJAbm9kZSBGcm9udCBNYXR0ZXJcbkBjaGFwdGVyIEFic3RyYWN0XG4iICJAbm9kZSBBYnN0cmFjdFxuQHNlY3Rpb24gQWJzdHJhY3RcbiIpIChwcm9nbiAobWFyay13aG9sZS1idWZmZXIpICh0ZXhpbmZvLW1hc3Rlci1tZW51ICd1cGRhdGUtYWxsLW5vZGVzKSkgKHNhdmUtYnVmZmVyKSkKKworIyBtYWtlaW5mbyBhcGkudGV4aQorIyBtYWtlaW5mbyBleHQudGV4aQorIyBtYWtlaW5mbyBsaWIudGV4aQorIyBtYWtlaW5mbyBtYWMudGV4aQorIyBtYWtlaW5mbyByZWYudGV4aQorIyBtYWtlaW5mbyB0dXQudGV4aQorCisKKyMjIworIyMjIFN0cnVjdHVyZSBvZiB0aGUgY29kZQorIyMjCisKKyMgVG8gYmUgd3JpdHRlbi4uLgorCisKKyMjIworIyMjIERlc2lnbiBkZWNpc2lvbnMKKyMjIworCisjIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gbGFuZ3VhZ2VzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIAorIyBUaGUgZ29hbCBpcyBJbmZvIGZpbGVzOyBJIGNyZWF0ZSBUZXhpbmZvLCBzbyBJIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQKKyMgdGhlIGZpbmVyIGRldGFpbHMgb2YgSW5mbyBmaWxlIGNyZWF0aW9uLiAgKEknbSBub3QgZXZlbiBzdXJlIG9mIGl0cyBleGFjdAorIyBmb3JtYXQuKQorIyAKKyMgV2h5IG5vdCBzdGFydCBmcm9tIExhVGVYIHJhdGhlciB0aGFuIEhUTUw/CisjIEkgY291bGQgaGFjayBsYXRleDJodG1sIGl0c2VsZiB0byBwcm9kdWNlIFRleGluZm8gaW5zdGVhZCwgb3IgZml4IHVwCisjIHBhcnRwYXJzZS5weSAod2hpY2ggYWxyZWFkeSB0cmFuc2xhdGVzIExhVGVYIHRvIFRlaW5mbykuCisjICBQcm9zOgorIyAgICogaGFzIGhpZ2gtbGV2ZWwgaW5mb3JtYXRpb24gc3VjaCBhcyBpbmRleCBlbnRyaWVzLCBvcmlnaW5hbCBmb3JtYXR0aW5nCisjICBDb25zOgorIyAgICogdGhvc2UgcHJvZ3JhbXMgYXJlIGNvbXBsaWNhdGVkIHRvIHJlYWQgYW5kIHVuZGVyc3RhbmQKKyMgICAqIHRob3NlIHByb2dyYW1zIHRyeSB0byBoYW5kbGUgYXJiaXRyYXJ5IExhVGVYIGlucHV0LCB0cmFjayBjYXRjb2RlcywKKyMgICAgIGFuZCBtb3JlOiAgSSBkb24ndCB3YW50IHRvIGdvIHRvIHRoYXQgZWZmb3J0LiAgSFRNTCBpc24ndCBhcyBwb3dlcmZ1bAorIyAgICAgYXMgTGFUZVgsIHNvIHRoZXJlIGFyZSBmZXdlciBzdWJ0bGV0aWVzLgorIyAgICogdGhlIHJlc3VsdCB3b3VsZG4ndCB3b3JrIGZvciBhcmJpdHJhcnkgSFRNTCBkb2N1bWVudHM7IGl0IHdvdWxkIGJlCisjICAgICBuaWNlIHRvIGV2ZW50dWFsbHkgZXh0ZW5kIHRoaXMgcHJvZ3JhbSB0byBIVE1MIHByb2R1Y2VkIGZyb20gRG9jYm9vaywKKyMgICAgIEZyYW1lLCBhbmQgbW9yZS4KKworIyBQYXJzaW5nCisjIC0tLS0tLS0KKyMgCisjIEkgZG9uJ3Qgd2FudCB0byB2aWV3IHRoZSB0ZXh0IGFzIGEgbGluZWFyIHN0cmVhbTsgSSdkIHJhdGhlciBwYXJzZSB0aGUKKyMgd2hvbGUgdGhpbmcgYW5kIHRoZW4gZG8gcGF0dGVybiBtYXRjaGluZyBvdmVyIHRoZSBwYXJzZWQgcmVwcmVzZW50YXRpb24gKHRvCisjIGZpbmQgaWRpb21zIHN1Y2ggYXMgaW5kaWNlcywgbGlzdHMgb2YgY2hpbGQgbm9kZXMsIGV0Yy4pLgorIyAgKiBQZXJsIHByb3ZpZGVzIEhUTUw6OlRyZWVCdWlsZGVyLCB3aGljaCBkb2VzIGp1c3Qgd2hhdCBJIHdhbnQuCisjICAgICAqIGxpYnd3dy1wZXJsOiBodHRwOi8vd3d3LmxpbnByby5uby9sd3AvCisjICAgICAqIFRyZWVCdWlsZGVyOiBIVE1MLVRyZWUtMC41MS50YXIuZ3oKKyMgICogUHl0aG9uIFBhcnNlcnMsIEZvcm1hdHRlcnMsIGFuZCBXcml0ZXJzIGRvbid0IHJlYWxseSBwcm92aWRlIHRoZSByaWdodAorIyAgICBpbnRlcmZhY2UgKGFuZCB0aGUgdmVyc2lvbiBpbiBHcmFpbCBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYW5vdGhlcgorIyAgICBkaXN0cmlidXRlZCB2ZXJzaW9uLCBzbyBJJ20gY29uZnVzZWQgYWJvdXQgd2hpY2ggdG8gYmUgdXNpbmcpLiAgSSBjb3VsZAorIyAgICB3cml0ZSBzb21ldGhpbmcgaW4gUHl0aG9uIHRoYXQgY3JlYXRlcyBhIHBhcnNlIHRyZWUsIGJ1dCB3aHkgYm90aGVyPworCisjIE90aGVyIGltcGxlbWVudGF0aW9uIGxhbmd1YWdlIGlzc3VlczoKKyMgICogUHl0aG9uIGxhY2tzIHZhcmlhYmxlIGRlY2xhcmF0aW9ucywgcmVhc29uYWJsZSBzY29waW5nLCBhbmQgc3RhdGljCisjICAgIGNoZWNraW5nIHRvb2xzLiAgSSd2ZSB3cml0dGVuIHNvbWUgb2YgdGhlIGxhdHRlciBmb3IgbXlzZWxmIHRoYXQgbWFrZQorIyAgICBteSBQZXJsIHByb2dyYW1taW5nIGEgbG90IHNhZmVyIHRoYW4gbXkgUHl0aG9uIHByb2dyYW1taW5nIHdpbGwgYmUgdW50aWwKKyMgICAgSSBoYXZlIGEgc2ltaWxhciBzdWl0ZSBmb3IgdGhhdCBsYW5ndWFnZS4KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyBUbyBkbworIyMjCisKKyMgU2VjdGlvbiBuYW1lczoKKyMgICBGaXggdGhlIHByb2JsZW0gd2l0aCBtdWx0aXBsZSBzZWN0aW9ucyBpbiBhIHNpbmdsZSBmaWxlIChlZywgQWJzdHJhY3QgaW4KKyMgICAgIEZyb250IE1hdHRlciBzZWN0aW9uKS4KKyMgICBEZWFsIHdpdGggY3Jvc3MtcmVmZXJlbmNlcywgYXMgaW4gL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvcmVmL3R5cGVzLmh0bWw6MzEwCisjIEluZGV4OgorIyAgIFBlcmhhcHMgZG91YmxlLWNoZWNrIHRoYXQgZXZlcnkgdGFnIG1lbnRpb25lZCBpbiB0aGUgaW5kZXggaXMgZm91bmQKKyMgICAgIGluIHRoZSB0ZXh0LgorIyBQeXRob246ICBlbWFpbCB0byBweXRob24tZG9jc0BweXRob24ub3JnLCB0byBnZXQgdGhlaXIgZmVlZGJhY2suCisjICAgQ29tcGFyZSB0byBleGlzdGluZyBsaWIvIEluZm8gbWFudWFsCisjICAgV3JpdGUgdGhlIGhvb2tzIGludG8gaW5mby1sb29rOyByZXBsYWNlIHB5bGlibG9va3VwMS0xLnRhci5nei4KKyMgICBQb3N0cGFzcyB0byByZW1vdmUgZXh0cmEgcXVvdGF0aW9uIG1hcmtzIGFyb3VuZCB0eXBvZ3JhcGh5IGFscmVhZHkgaW4KKyMgICAgIGEgZGlmZmVyZW50IGZvbnQgKHRvIGF2b2lkIGRvdWJsZSBkZWxpbWl0ZXJzIGFzIGluICJgY29kZSciKTsgb3IKKyMgICAgIHBlcmhhcHMgY29uc2lkZXIgdXNpbmcgb25seSBmb250LWJhc2VkIG1hcmt1cCBzbyB0aGF0IHdlIGRvbid0IGdldAorIyAgICAgdGhlIGV4dHJhICpib2xkKiBhbmQgYGNvZGUnIG1hcmt1cCBpbiBJbmZvLgorCisjIyBQZXJoYXBzIGRvbid0IHJlbHkgb24gYXV0b21hdGljIG1lYW5zIGZvciBhZGRpbmcgdXAsIG5leHQsIHByZXY7IEkgaGF2ZQorIyMgYWxsIHRoYXQgaW5mbyBhdmFpbGFibGUgdG8gbWUgYWxyZWFkeSwgc28gaXQncyBub3Qgc28gbXVjaCB0cm91YmxlIHRvCisjIyBhZGQgaXQuICAoUmlnaHQ/KSAgQnV0IGl0IGlzICpzbyogZWFzeSB0byB1c2UgRW1hY3MgaW5zdGVhZC4uLgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIFN0cmljdHVyZXMKKyMjIworCisjIG1hbiBIVE1MOjpUcmVlQnVpbGRlcgorIyBtYW4gSFRNTDo6UGFyc2VyCisjIG1hbiBIVE1MOjpFbGVtZW50CisKKyMgcmVxdWlyZSBIVE1MOjpQYXJzZXJXQ29tbWVudDsKK3JlcXVpcmUgSFRNTDo6UGFyc2VyOworcmVxdWlyZSBIVE1MOjpUcmVlQnVpbGRlcjsKK3JlcXVpcmUgSFRNTDo6RWxlbWVudDsKKwordXNlIEZpbGU6OkJhc2VuYW1lOworCit1c2Ugc3RyaWN0OworIyB1c2UgQ2FycDsKKwordXNlIGNoZWNrYXJnczsKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyBWYXJpYWJsZXMKKyMjIworCitteSBAc2VjdGlvbl9zdGFjayA9ICgpOwkJIyBlbGVtZW50cyBhcmUgY2hhcHRlci9zZWN0aW9uL3N1YnNlYyBub2RldGl0bGVzIChJIHRoaW5rKQorbXkgJGN1cnJlbnRfcmVmX3RkZjsJCSMgZm9yIHRoZSBmaWxlIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQ7CisJCQkJIyAgdXNlZCBpbiBlcnJvciBtZXNzYWdlcworbXkgJGh0bWxfZGlyZWN0b3J5OworbXkgJWZvb3Rub3RlczsKKworIyBGaXJzdCBlbGVtZW50IHNob3VsZCBub3QgYmUgdXNlZC4KK215IEBzZWN0aW9ubWFya2VyID0gKCJtYW51YWwiLCAiY2hhcHRlciIsICJzZWN0aW9uIiwgInN1YnNlY3Rpb24iLCAic3Vic3Vic2VjdGlvbiIpOworCitteSAlaW5saW5lX21hcmt1cCA9ICgiYiIgPT4gInN0cm9uZyIsCisJCSAgICAgImNvZGUiID0+ICJjb2RlIiwKKwkJICAgICAiaSIgPT4gImVtcGgiLAorCQkgICAgICJrYmQiID0+ICJrYmQiLAorCQkgICAgICJzYW1wIiA9PiAic2FtcCIsCisJCSAgICAgInN0cm9uZyIgPT4gInN0cm9uZyIsCisJCSAgICAgInR0IiA9PiAiY29kZSIsCisJCSAgICAgInZhciIgPT4gInZhciIpOworCitteSBAZGVmZXJyZWRfaW5kZXhfZW50cmllcyA9ICgpOworCitteSBAaW5kZXhfdGl0bGVzID0gKCk7CQkjIGxpc3Qgb2YgKGZpbGVuYW1lLCB0eXBlKSBsaXN0cworbXkgJWluZGV4X2luZm8gPSAoIkluZGV4IiA9PiBbIlxAYmxpbmRleCIsICJibCJdLAorCQkgICJDb25jZXB0IEluZGV4IiA9PiBbIlxAY2luZGV4IiwgImNwIl0sCisJCSAgIk1vZHVsZSBJbmRleCIgPT4gWyJcQG1kaW5kZXgiLCAibWQiXSk7CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMgTWFpbi9jb250ZW50cyBwYWdlCisjIyMKKworIyBQcm9jZXNzIGZpcnN0LWxldmVsIHBhZ2Ugb24gaXRzIG93biwgb3IganVzdCBhIGNvbnRlbnRzIHBhZ2U/ICBXZWxsLCBJIGRvCisjIHdhbnQgdGhlIHRpdGxlLCBhdXRob3IsIGV0Yy4sIGFuZCB0aGUgZnJvbnQgbWF0dGVyLi4uICBGb3Igbm93LCBqdXN0IGFkZAorIyB0aGF0IGJ5IGhhbmQgYXQgdGhlIGVuZC4KKworCisjIGRhdGEgc3RydWN0dXJlIHBvc3NpYmlsaXRpZXM6CisjICAqIHRyZWUtbGlrZSAobmVlZCBzb21lIGtpbmQgb2Ygc3RhY2sgd2hlbiBwcm9jZXNzaW5nIChvciBwYXJlbnQgcG9pbnRlcnMpKQorIyAgKiBsaXN0IG9mIG5hbWUgYW5kIGRlcHRoOyByZW1lbWJlciBvbGQgYW5kIG5ldyBkZXB0aHMuCisKKyMgRWFjaCBlbGVtZW50IGlzIGEgcmVmZXJlbmNlIHRvIGEgbGlzdCBvZiAobm9kZXRpdGxlLCBkZXB0aCwgZmlsZW5hbWUpLgorbXkgQGNvbnRlbnRzX2xpc3QgPSAoKTsKKworIyBUaGUgcHJvYmxlbSB3aXRoIGRvaW5nIGZpeHVwcyBvbiB0aGUgZmx5IGlzIHRoYXQgc29tZSBzZWN0aW9ucyBtYXkgaGF2ZQorIyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIChhbmQgbm8gbG9uZ2VyIGF2YWlsYWJsZSkgYnkgdGhlIHRpbWUgd2Ugbm90aWNlCisjIG90aGVycyB3aXRoIHRoZSBzYW1lIG5hbWUuICBJdCdzIHByb2JhYmx5IGJldHRlciB0byBmdWxseSBjb25zdHJ1Y3QgdGhlCisjIGNvbnRlbnRzIGxpc3QgKHJlYWRpbmcgaW4gYWxsIGZpbGVzIG9mIGludGVyZXN0KSB1cGZyb250OyB0aGF0IHdpbGwgYWxzbworIyBsZXQgbWUgZG8gYSBiZXR0ZXIgam9iIHdpdGggY3Jvc3MtcmVmZXJlbmNlcywgYmVjYXVzZSBhZ2FpbiwgYWxsIGZpbGVzCisjIHdpbGwgYWxyZWFkeSBiZSByZWFkIGluLgorbXkgJWNvbnRlbnRzX2hhc2ggPSAoKTsKK215ICVjb250ZW50c19maXh1cHMgPSAoKTsKKworbXkgQGN1cnJlbnRfY29udGVudHNfbGlzdCA9ICgpOworCisjIE1lcmdlIEBjdXJyZW50X2NvbnRlbnRzX2xpc3QgaW50byBAY29udGVudHNfbGlzdCwKKyMgYW5kIHNldCBAY3VycmVudF9jb250ZW50c19saXN0IHRvIGJlIGVtcHR5Lgorc3ViIG1lcmdlX2NvbnRlbnRzX2xpc3RzICggKQoreyBjaGVja19hcmdzKDAsIEBfKTsKKworICAjIFRocmVlIHBvc3NpYmlsaXRpZXM6CisgICMgICogQGNvbnRlbnRzX2xpc3QgaXMgZW1wdHk6IHJlcGxhY2UgaXQgYnkgQGN1cnJlbnRfY29udGVudHNfbGlzdC4KKyAgIyAgKiBwcmVmaXhlcyBvZiB0aGUgdHdvIGxpc3RzIGFyZSBpZGVudGljYWw6IGRvIG5vdGhpbmcKKyAgIyAgKiBAY3VycmVudF9jb250ZW50c19saXN0IGlzIGFsbCBhdCBsb3dlciBsZXZlbCB0aGFuICRjb250ZW50c19saXN0WzBdOworICAjICAgIHByZWZpeCBAY29udGVudHNfbGlzdCBieSBAY3VycmVudF9jb250ZW50c19saXN0CisKKyAgaWYgKHNjYWxhcihAY3VycmVudF9jb250ZW50c19saXN0KSA9PSAwKQorICAgIHsgZGllICJlbXB0eSBjdXJyZW50X2NvbnRlbnRzX2xpc3QiOyB9CisKKyAgIyAgIGlmIChzY2FsYXIoQGNvbnRlbnRzX2xpc3QpID09IDApCisgICMgICAgIHsgQGNvbnRlbnRzX2xpc3QgPSBAY3VycmVudF9jb250ZW50c19saXN0OworICAjICAgICAgIEBjdXJyZW50X2NvbnRlbnRzX2xpc3QgPSAoKTsKKyAgIyAgICAgICByZXR1cm47IH0KKworICAjICAgaWYgKCgkIHskY29udGVudHNfbGlzdFswXX1bMV0pIDwgKCQgeyRjdXJyZW50X2NvbnRlbnRzX2xpc3RbMF19WzFdKSkKKyAgIyAgICAgeyB1bnNoaWZ0IEBjb250ZW50c19saXN0LCBAY3VycmVudF9jb250ZW50c19saXN0OworICAjICAgICAgIEBjdXJyZW50X2NvbnRlbnRzX2xpc3QgPSAoKTsKKyAgIyAgICAgICByZXR1cm47IH0KKworICBmb3IgKG15ICRpPTA7ICRpPHNjYWxhcihAY3VycmVudF9jb250ZW50c19saXN0KTsgJGkrKykKKyAgICB7IG15ICRyZWZfY190ZGYgPSAkY3VycmVudF9jb250ZW50c19saXN0WyRpXTsKKyAgICAgIGlmICgkaSA+PSBzY2FsYXIoQGNvbnRlbnRzX2xpc3QpKQorCXsgcHVzaCBAY29udGVudHNfbGlzdCwgJHJlZl9jX3RkZjsKKwkgIG15ICR0aXRsZSA9ICQgeyRyZWZfY190ZGZ9WzBdOworCSAgaWYgKGRlZmluZWQgJGNvbnRlbnRzX2hhc2h7JHRpdGxlfSkKKwkgICAgeyAkY29udGVudHNfZml4dXBzeyR0aXRsZX0gPSAxOyB9CisJICBlbHNlCisJICAgIHsgJGNvbnRlbnRzX2hhc2h7JHRpdGxlfSA9IDE7IH0KKwkgIG5leHQ7IH0KKyAgICAgIG15ICRyZWZfdGRmID0gJGNvbnRlbnRzX2xpc3RbJGldOworICAgICAgbXkgKCR0aXRsZSwgJGRlcHRoLCAkZmlsZSkgPSBAeyRyZWZfdGRmfTsKKyAgICAgIG15ICgkY190aXRsZSwgJGNfZGVwdGgsICRjX2ZpbGUpID0gQHskcmVmX2NfdGRmfTsKKworICAgICAgaWYgKCgkdGl0bGUgbmUgJGNfdGl0bGUpCisJICAmJiAoJGRlcHRoIDwgJGNfZGVwdGgpCisJICAmJiAoJGZpbGUgbmUgJGNfZmlsZSkpCisJeyBzcGxpY2UgQGNvbnRlbnRzX2xpc3QsICRpLCAwLCAkcmVmX2NfdGRmOworCSAgaWYgKGRlZmluZWQgJGNvbnRlbnRzX2hhc2h7JGNfdGl0bGV9KQorCSAgICB7ICRjb250ZW50c19maXh1cHN7JGNfdGl0bGV9ID0gMTsgfQorCSAgZWxzZQorCSAgICB7ICRjb250ZW50c19oYXNoeyRjX3RpdGxlfSA9IDE7IH0KKwkgIG5leHQ7IH0KKworICAgICAgaWYgKCgkdGl0bGUgbmUgJGNfdGl0bGUpCisJICB8fCAoJGRlcHRoICE9ICRjX2RlcHRoKQorCSAgfHwgKCRmaWxlIG5lICRjX2ZpbGUpKQorCXsgZGllICgid2hpbGUgcHJvY2Vzc2luZyAkIHskY3VycmVudF9yZWZfdGRmfVsyXSBhdCBkZXB0aCAkIHskY3VycmVudF9yZWZfdGRmfVsxXSwgbWlzbWF0Y2ggYXQgaW5kZXggJGk6IiwKKwkgICAgICAgIlxuICBtYWluOiAgPDw8JHRpdGxlPj4+ICRkZXB0aCAkZmlsZSIsCisJICAgICAgICJcbiAgY3VycjogIDw8PCRjX3RpdGxlPj4+ICRjX2RlcHRoICRjX2ZpbGUiKTsgfQorICAgIH0KKyAgQGN1cnJlbnRfY29udGVudHNfbGlzdCA9ICgpOworfQorCisKKworIyBTZXQgQGN1cnJlbnRfY29udGVudHNfbGlzdCB0byBhIGxpc3Qgb2YgKHRpdGxlLCBocmVmLCBzZWN0aW9ubGV2ZWwpOworIyAgdGhlbiBtZXJnZSB0aGF0IGxpc3QgaW50byBAY29udGVudHNfbGlzdC4KKyMgTWF5YmUgdGhpcyBmdW5jdGlvbiBzaG91bGQgYWxzbyBwcm9kdWNlIGEgbWFwCisjICBmcm9tIHRpdGxlIChvciBocmVmKSB0byBzZWN0aW9ubGV2ZWwgKGVnICJjaGFwdGVyIj8pLgorc3ViIHByb2Nlc3NfY2hpbGRfbGlua3MgKCAkICkKK3sgbXkgKCRoZSkgPSBjaGVja19hcmdzKDEsIEBfKTsKKworICAjICRoZS0+ZHVtcCgpOworICBpZiAoc2NhbGFyKEBjdXJyZW50X2NvbnRlbnRzX2xpc3QpICE9IDApCisgICAgeyBkaWUgImN1cnJlbnRfY29udGVudHNfbGlzdCBub25lbXB0eTogQGN1cnJlbnRfY29udGVudHNfbGlzdCI7IH0KKyAgJGhlLT50cmF2ZXJzZShcJmluY3JlbWVudF9jdXJyZW50X2NvbnRlbnRzX2xpc3QsICdpZ25vcmUgdGV4dCcpOworCisgICMgTm9ybWFsaXplIHRoZSBkZXB0aHM7IGZvciBpbnN0YW5jZSwgY29udmVydCAxLDMsNSBpbnRvIDAsMSwyLgorICBteSAlZGVwdGhzID0gKCk7CisgIGZvciBteSAkcmVmX3RkZiAoQGN1cnJlbnRfY29udGVudHNfbGlzdCkKKyAgICB7ICRkZXB0aHN7JCB7JHJlZl90ZGZ9WzFdfSA9IDE7IH0KKyAgbXkgQHNvcnRlZF9kZXB0aHMgPSBzb3J0IGtleXMgJWRlcHRoczsKKyAgbXkgJGN1cnJlbnRfZGVwdGggPSBzY2FsYXIoQHNlY3Rpb25fc3RhY2spLTE7CisgIG15ICRjdXJyZW50X2RlcHRoXzIgPSAkIHskY3VycmVudF9yZWZfdGRmfVsxXTsKKyAgaWYgKCRjdXJyZW50X2RlcHRoICE9ICRjdXJyZW50X2RlcHRoXzIpCisgICAgeyBkaWUgIm1pc21hdGNoIGluIGN1cnJlbnQgZGVwdGhzOiAkY3VycmVudF9kZXB0aCAkY3VycmVudF9kZXB0aF8yOyAiLCBqb2luKCIsICIsIEBzZWN0aW9uX3N0YWNrKTsgfQorICBmb3IgKG15ICRpPTA7ICRpPHNjYWxhcihAc29ydGVkX2RlcHRocyk7ICRpKyspCisgICAgeyAkZGVwdGhzeyRzb3J0ZWRfZGVwdGhzWyRpXX0gPSAkaSArICRjdXJyZW50X2RlcHRoKzE7IH0KKyAgZm9yIG15ICRyZWZfdGRmIChAY3VycmVudF9jb250ZW50c19saXN0KQorICAgIHsgJCB7JHJlZl90ZGZ9WzFdID0gJGRlcHRoc3skIHskcmVmX3RkZn1bMV19OyB9CisKKyAgIyBFbGltaW5hdGUgdW5pbnRlcmVzdGluZyBzZWN0aW9ucy4gIEhhcmQtY29kZWQgaGFjayBmb3Igbm93LgorICBpZiAoJCB7JGN1cnJlbnRfY29udGVudHNfbGlzdFstMV19WzBdIGVxICJBYm91dCB0aGlzIGRvY3VtZW50IC4uLiIpCisgICAgeyBwb3AgQGN1cnJlbnRfY29udGVudHNfbGlzdDsgfQorICBpZiAoKHNjYWxhcihAY3VycmVudF9jb250ZW50c19saXN0KSA+IDEpCisgICAgICAmJiAoJCB7JGN1cnJlbnRfY29udGVudHNfbGlzdFsxXX1bMF0gZXEgIkNvbnRlbnRzIikpCisgICAgeyBteSAkcmVmX2ZpcnN0X3RkZiA9IHNoaWZ0IEBjdXJyZW50X2NvbnRlbnRzX2xpc3Q7CisgICAgICAkY3VycmVudF9jb250ZW50c19saXN0WzBdID0gJHJlZl9maXJzdF90ZGY7IH0KKworICBmb3IgKG15ICRpPTA7ICRpPHNjYWxhcihAY3VycmVudF9jb250ZW50c19saXN0KTsgJGkrKykKKyAgICB7IG15ICRyZWZfdGRmID0gJGN1cnJlbnRfY29udGVudHNfbGlzdFskaV07CisgICAgICBteSAkdGl0bGUgPSAkIHskcmVmX3RkZn1bMF07CisgICAgICBpZiAoZXhpc3RzICRpbmRleF9pbmZveyR0aXRsZX0pCisJeyBteSAkaW5kZXhfZmlsZSA9ICQgeyRyZWZfdGRmfVsyXTsKKwkgIG15ICgkaW5kZXhpbmdfY29tbWFuZCwgJHN1ZmZpeCkgPSBAeyRpbmRleF9pbmZveyR0aXRsZX19OworCSAgcHJvY2Vzc19pbmRleF9maWxlKCRpbmRleF9maWxlLCAkaW5kZXhpbmdfY29tbWFuZCk7CisJICBwcmludCBURVhJICJcblxAZGVmaW5kZXggJHN1ZmZpeFxuIjsKKwkgIHB1c2ggQGluZGV4X3RpdGxlcywgJHRpdGxlOworCSAgc3BsaWNlIEBjdXJyZW50X2NvbnRlbnRzX2xpc3QsICRpLCAxOworCSAgJGktLTsgfQorICAgICAgZWxzaWYgKCR0aXRsZSA9fiAvXGJJbmRleCQvKQorCXsgcHJpbnQgU1RERVJSICJXYXJuaW5nOiBcIiR0aXRsZVwiIG1pZ2h0IGJlIGFuIGluZGV4OyBpZiBzbywgZWRpdCBcJWluZGV4X2luZm8uXG4iOyB9IH0KKworICBtZXJnZV9jb250ZW50c19saXN0cygpOworCisgICMgcHJpbnRfY29udGVudHNfbGlzdCgpOworICAjIHByaW50X2luZGV4X2luZm8oKTsKK30KKworCitzdWIgaW5jcmVtZW50X2N1cnJlbnRfY29udGVudHNfbGlzdCAoICQkJCApCit7IG15ICgkaGUsICRzdGFydGZsYWcsICRkZXB0aCkgPSBjaGVja19hcmdzKDMsIEBfKTsKKyAgaWYgKCEkc3RhcnRmbGFnKQorICAgIHsgcmV0dXJuOyB9CisKKyAgaWYgKCRoZS0+dGFnIGVxICJsaSIpCisgICAgeyBteSBAbGlfY29udGVudCA9IEB7JGhlLT5jb250ZW50fTsKKyAgICAgIGlmICgkbGlfY29udGVudFswXS0+dGFnIG5lICJhIikKKwl7IGRpZSAiZmlyc3QgZWxlbWVudCBvZiA8TEk+IHNob3VsZCBiZSA8QT4iOyB9CisgICAgICBteSAoJG5hbWUsICRocmVmLCBAY29udGVudCkgPSBhbmNob3JfaW5mbygkbGlfY29udGVudFswXSk7CisgICAgICAjIHVudXNlZCAkbmFtZQorICAgICAgbXkgJHRpdGxlID0gam9pbigiIiwgY29sbGVjdF90ZXh0cygkbGlfY29udGVudFswXSkpOworICAgICAgJHRpdGxlID0gdGV4aV9yZW1vdmVfcHVuY3R1YXRpb24oJHRpdGxlKTsKKyAgICAgICMgVGhlIHByb2JsZW0gd2l0aCB0aGVzZSBpcyB0aGF0IHRoZXkgYXJlIGZvcm1hdHRlZCBkaWZmZXJlbnRseSBpbgorICAgICAgIyBAbWVudSBhbmQgQG5vZGUhCisgICAgICAkdGl0bGUgPX4gcy9gYC9cIi9nOworICAgICAgJHRpdGxlID1+IHMvJycvXCIvZzsKKyAgICAgICR0aXRsZSA9fiBzLyAtLSAvIC9nOworICAgICAgcHVzaCBAY3VycmVudF9jb250ZW50c19saXN0LCBbICR0aXRsZSwgJGRlcHRoLCAkaHJlZiBdOyB9CisgIHJldHVybiAxOworfQorCisjIFNpbXBsZSB2ZXJzaW9uIGZvciBzZWN0aW9uIHRpdGxlcworc3ViIGh0bWxfdG9fdGV4aSAoICQgKQoreyBteSAoJGhlKSA9IGNoZWNrX2FyZ3MoMSwgQF8pOworICBpZiAoIXJlZiAkaGUpCisgICAgeyByZXR1cm4gJGhlOyB9CisKKyAgbXkgJHRhZyA9ICRoZS0+dGFnOworICBpZiAoZXhpc3RzICRpbmxpbmVfbWFya3VweyR0YWd9KQorICAgIHsgbXkgJHJlc3VsdCA9ICJcQCRpbmxpbmVfbWFya3VweyR0YWd9XHsiOworICAgICAgZm9yIG15ICRlbHQgKEB7JGhlLT5jb250ZW50fSkKKwl7ICRyZXN1bHQgLj0gaHRtbF90b190ZXhpKCRlbHQpOyB9CisgICAgICAkcmVzdWx0IC49ICJcfSI7CisgICAgICByZXR1cm4gJHJlc3VsdDsgfQorICBlbHNlCisgICAgeyAkaGUtPmR1bXAoKTsKKyAgICAgIGRpZSAiaHRtbF90b190ZXhpIGNvbmZ1c2VkIGJ5IDwkdGFnPiI7IH0KK30KKworCisKK3N1YiBwcmludF9jb250ZW50c19saXN0ICgpCit7IGNoZWNrX2FyZ3MoMCwgQF8pOworICBwcmludCBTVERFUlIgIkNvbnRlbnRzIGxpc3Q6XG4iOworICBmb3IgbXkgJHJlZl90ZGYgKEBjb250ZW50c19saXN0KQorICAgIHsgbXkgKCR0aXRsZSwgJGRlcHRoLCAkZmlsZSkgPSBAeyRyZWZfdGRmfTsKKyAgICAgIHByaW50IFNUREVSUiAiJHRpdGxlICRkZXB0aCAkZmlsZVxuIjsgfQorfQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMgSW5kZXgKKyMjIworCitteSAkbDJoX2Jyb2tlbl9saW5rX25hbWUgPSAibDJoLSI7CisKKworIyBtYXAgZnJvbSBmaWxlIHRvIChtYXAgZnJvbSBhbmNob3IgbmFtZSB0byAobGlzdCBvZiBpbmRleCB0ZXh0cykpCisjIChUaGUgbGlzdCBpcyBuZWVkZWQgd2hlbiBhIHNpbmdsZSBMYVRlWCBjb21tYW5kIGxpa2UgXGVudnZhcgorIyBleHBhbmRzIHRvIG11bHRpcGxlIFxpbmRleCBjb21tYW5kcy4pCitteSAlZmlsZV9pbmRleF9lbnRyaWVzID0gKCk7CitteSAldGhpc19pbmRleF9lbnRyaWVzOwkJIyBtYXAgZnJvbSBhbmNob3IgbmFtZSB0byAobGlzdCBvZiBpbmRleCB0ZXh0cykKKworbXkgJWZpbGVfaW5kZXhfZW50cmllc19icm9rZW4gPSAoKTsgIyBtYXAgZnJvbSBmaWxlIHRvIChsaXN0IG9mIGluZGV4IHRleHRzKQorbXkgQHRoaXNfaW5kZXhfZW50cmllc19icm9rZW47CisKK215ICRpbmRleF9wcmVmaXggPSAiIjsKK215IEBpbmRleF9wcmVmaXhlcyA9ICgpOworCitteSAkdGhpc19pbmRleGluZ19jb21tYW5kOworCitzdWIgcHJpbnRfaW5kZXhfaW5mbyAoKQoreyBjaGVja19hcmdzKDAsIEBfKTsKKyAgbXkgKCRrZXksICR2YWwpOworICBmb3IgbXkgJGZpbGUgKHNvcnQga2V5cyAlZmlsZV9pbmRleF9lbnRyaWVzKQorICAgIHsgbXkgJWluZGV4X2VudHJpZXMgPSAleyRmaWxlX2luZGV4X2VudHJpZXN7JGZpbGV9fTsKKyAgICAgIHByaW50IFNUREVSUiAiZmlsZTogJGZpbGVcbiI7CisgICAgICBmb3IgbXkgJGFuYW1lIChzb3J0IGtleXMgJWluZGV4X2VudHJpZXMpCisJeyBteSBAZW50cmllcyA9IEB7JGluZGV4X2VudHJpZXN7JGFuYW1lfX07CisJICBpZiAoc2NhbGFyKEBlbnRyaWVzKSA9PSAxKQorCSAgICB7IHByaW50IFNUREVSUiAiICAkYW5hbWUgOiAkZW50cmllc1swXVxuIjsgfQorCSAgZWxzZQorCSAgICB7IHByaW50IFNUREVSUiAiICAkYW5hbWUgOiAiLCBqb2luKCJcbiAgICAgIiAuICgiICIgeCBsZW5ndGgoJGFuYW1lKSksIEBlbnRyaWVzKSwgIlxuIjsgfSB9IH0KKyAgZm9yIG15ICRmaWxlIChzb3J0IGtleXMgJWZpbGVfaW5kZXhfZW50cmllc19icm9rZW4pCisgICAgeyBteSBAZW50cmllcyA9IEB7JGZpbGVfaW5kZXhfZW50cmllc19icm9rZW57JGZpbGV9fTsKKyAgICAgIHByaW50IFNUREVSUiAiZmlsZTogJGZpbGVcbiI7CisgICAgICBmb3IgbXkgJGVudHJ5IChAZW50cmllcykKKwl7IHByaW50IFNUREVSUiAiICAkZW50cnlcbiI7IH0KKyAgICB9Cit9CisKKworc3ViIHByb2Nlc3NfaW5kZXhfZmlsZSAoICQkICkKK3sgbXkgKCRmaWxlLCAkaW5kZXhpbmdfY29tbWFuZCkgPSBjaGVja19hcmdzKDIsIEBfKTsKKyAgIyBwcmludCAicHJvY2Vzc19pbmRleF9maWxlICRmaWxlICRpbmRleGluZ19jb21tYW5kXG4iOworCisgIG15ICRoZSA9IGZpbGVfdG9fdHJlZSgkaHRtbF9kaXJlY3RvcnkgLiAkZmlsZSk7CisgICMgJGhlLT5kdW1wKCk7CisKKyAgJHRoaXNfaW5kZXhpbmdfY29tbWFuZCA9ICRpbmRleGluZ19jb21tYW5kOworICAkaGUtPnRyYXZlcnNlKFwmcHJvY2Vzc19pZl9pbmRleF9kbF9jb21wYWN0LCAnaWdub3JlIHRleHQnKTsKKyAgdW5kZWYgJHRoaXNfaW5kZXhpbmdfY29tbWFuZDsKKyAgIyBwcmludCAicHJvY2Vzc19pbmRleF9maWxlIGRvbmVcbiI7Cit9CisKKworc3ViIHByb2Nlc3NfaWZfaW5kZXhfZGxfY29tcGFjdCAoICQkJCApCit7IG15ICgkaGUsICRzdGFydGZsYWcpID0gKGNoZWNrX2FyZ3MoMywgQF8pKVswLDFdOyAjICBpZ25vcmUgZGVwdGggYXJndW1lbnQKKyAgaWYgKCEkc3RhcnRmbGFnKQorICAgIHsgcmV0dXJuOyB9CisKKyAgaWYgKCgkaGUtPnRhZygpIGVxICJkbCIpICYmIChkZWZpbmVkICRoZS0+YXR0cignY29tcGFjdCcpKSkKKyAgICB7IHByb2Nlc3NfaW5kZXhfZGxfY29tcGFjdCgkaGUpOworICAgICAgcmV0dXJuIDA7IH0KKyAgZWxzZQorICAgIHsgcmV0dXJuIDE7IH0KK30KKworCisjIFRoZSBlbGVtZW50cyBvZiBhIDxETCBDT01QQUNUPiBsaXN0IGZyb20gYSBMYVRlWDJIVE1MIGluZGV4OgorIyAgKiBhIHNpbmdsZSBzcGFjZTogdGV4dCB0byBiZSBpZ25vcmVkCisjICAqIDxEVD4gZWxlbWVudHMgd2l0aCBhbiBvcHRpb25hbCA8REQ+IGVsZW1lbnQgZm9sbG93aW5nIGVhY2ggb25lCisjICAgIFR3byB0eXBlcyBvZiA8RFQ+IGVsZW1lbnRzOgorIyAgICAgKiBGb2xsb3dlZCBieSBhIDxERD4gZWxlbWVudDogIHRoZSA8RFQ+IGNvbnRhaW5zIGEgc2luZ2xlCisjICAgICAgIHN0cmluZywgYW5kIHRoZSA8REQ+IGNvbnRhaW5zIGEgd2hpdGVzcGFjZSBzdHJpbmcgdG8gYmUgaWdub3JlZCwgYQorIyAgICAgICA8REwgQ09NUEFDVD4gdG8gYmUgcmVjdXJzaXZlbHkgcHJvY2Vzc2VkICh3aXRoIHRoZSA8RFQ+IHN0cmluZyBhcyBhCisjICAgICAgIHByZWZpeCksIGFuZCBhIHdoaXRlc3BhY2Ugc3RyaW5nIHRvIGJlIGlnbm9yZWQuCisjICAgICAqIE5vdCBmb2xsb3dlZCBieSBhIDxERD4gZWxlbWVudDogIGNvbnRhaW5zIGEgbGlzdCBvZiBhbmNob3JzCisjICAgICAgIGFuZCB0ZXh0cyAoaWdub3JlIHRoZSB0ZXh0cywgd2hpY2ggYXJlIG9ubHkgd2hpdGVzcGFjZSBhbmQgY29tbWFzKS4KKyMgICAgICAgT3B0aW9uYWxseSBjb250YWlucyBhIDxETCBDT01QQUNUPiB0byBiZSByZWN1cnNpdmVseSBwcm9jZXNzZWQgKHdpdGgKKyMgICAgICAgdGhlIDxEVD4gc3RyaW5nIGFzIGEgcHJlZml4KQorc3ViIHByb2Nlc3NfaW5kZXhfZGxfY29tcGFjdCAoICQgKQoreyBteSAoJGgpID0gY2hlY2tfYXJncygxLCBAXyk7CisgIG15IEBjb250ZW50ID0gQHskaC0+Y29udGVudCgpfTsKKyAgZm9yIChteSAkaSA9IDA7ICRpIDwgc2NhbGFyKEBjb250ZW50KTsgJGkrKykKKyAgICB7IG15ICR0aGlzX2hlID0gJGNvbnRlbnRbJGldOworICAgICAgaWYgKCR0aGlzX2hlLT50YWcgbmUgImR0IikKKwl7ICR0aGlzX2hlLT5kdW1wKCk7CisJICBkaWUgIkV4cGVjdGVkIDxEVD4gdGFnOiAiIC4gJHRoaXNfaGUtPnRhZzsgfQorICAgICAgaWYgKCgkaSA8IHNjYWxhcihAY29udGVudCkgLSAxKSAmJiAoJGNvbnRlbnRbJGkrMV0tPnRhZyBlcSAiZGQiKSkKKwl7IHByb2Nlc3NfaW5kZXhfZHRfYW5kX2RkKCR0aGlzX2hlLCAkY29udGVudFskaSsxXSk7CisJICAkaSsrOwl9CisgICAgICBlbHNlCisJeyBwcm9jZXNzX2luZGV4X2xvbmVfZHQoJHRoaXNfaGUpOyB9IH0gfQorCisKKworIyBBcmd1bWVudCBpcyBhIDxEVD4gZWxlbWVudC4gIElmIGl0IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYW5jaG9yLCB0aGVuCisjIHRoZSB0ZXh0cyBvZiBhbGwgc3Vic2VxdWVudCBvbmVzIGFyZSAiW0xpbmtdIi4gIEV4YW1wbGU6CisjICAgICAgIDxEVD4KKyMgICAgICAgICA8QSBIUkVGPSJlbWJlZGRpbmcuaHRtbCNsMmgtMjAxIj4KKyMgICAgICAgICAgICIkUEFUSCIKKyMgICAgICAgICAiLCAiCisjICAgICAgICAgPEEgSFJFRj0iZW1iZWRkaW5nLmh0bWwjbDJoLTIwNSI+CisjICAgICAgICAgICAiW0xpbmtdIgorIyBPcHRpb25hbGx5IGNvbnRhaW5zIGEgPERMIENPTVBBQ1Q+IGFzIHdlbGwuICBFeGFtcGxlOgorIyA8RFQ+CisjICAgPEEgSFJFRj0idHlwZXMuaHRtbCNsMmgtNjE2Ij4KKyMgICAgICJhdHRyaWJ1dGUiCisjICAgPERMIENPTVBBQ1Q+CisjICAgICA8RFQ+CisjICAgICAgIDxBIEhSRUY9ImFzc2lnbm1lbnQuaHRtbCNsMmgtMzA3NCI+CisjICAgICAgICAgImFzc2lnbm1lbnQiCisjICAgICAgICIsICIKKyMgICAgICAgPEEgSFJFRj0iYXNzaWdubWVudC5odG1sI2wyaC0zMDk5Ij4KKyMgICAgICAgICAiW0xpbmtdIgorIyAgICAgPERUPgorIyAgICAgICA8QSBIUkVGPSJ0eXBlcy5odG1sI2wyaC0iPgorIyAgICAgICAgICJhc3NpZ25tZW50LCBjbGFzcyIKKworc3ViIHByb2Nlc3NfaW5kZXhfbG9uZV9kdCAoICQgKQoreyBteSAoJGR0KSA9IGNoZWNrX2FyZ3MoMSwgQF8pOworICBteSBAZHRjb250ZW50ID0gQHskZHQtPmNvbnRlbnQoKX07CisgIG15ICRhY29udGVudDsKKyAgbXkgJGFjb250ZW50X3N1ZmZpeDsKKyAgZm9yIG15ICRhIChAZHRjb250ZW50KQorICAgIHsgaWYgKCRhIGVxICIsICIpCisJeyBuZXh0OyB9CisgICAgICBpZiAoIXJlZiAkYSkKKwl7ICRkdC0+ZHVtcDsKKwkgIGRpZSAiVW5leHBlY3RlZCA8RFQ+IHN0cmluZyBlbGVtZW50OiAkYSI7IH0KKworICAgICAgaWYgKCRhLT50YWcgZXEgImRsIikKKwl7IHB1c2ggQGluZGV4X3ByZWZpeGVzLCAkaW5kZXhfcHJlZml4OworCSAgaWYgKCFkZWZpbmVkICRhY29udGVudF9zdWZmaXgpCisJICAgIHsgZGllICJhY29udGVudF9zdWZmaXggbm90IHlldCBkZWZpbmVkIjsgfQorCSAgJGluZGV4X3ByZWZpeCAuPSAkYWNvbnRlbnRfc3VmZml4IC4gIiwgIjsKKwkgIHByb2Nlc3NfaW5kZXhfZGxfY29tcGFjdCgkYSk7CisJICAkaW5kZXhfcHJlZml4ID0gcG9wKEBpbmRleF9wcmVmaXhlcyk7CisJICByZXR1cm47IH0KKworICAgICAgaWYgKCRhLT50YWcgbmUgImEiKQorCXsgJGR0LT5kdW1wOworCSAgJGEtPmR1bXA7CisJICBkaWUgIkV4cGVjdGVkIGFuY2hvciBpbiBsb25lIDxEVD4iOyB9CisKKyAgICAgIG15ICgkYW5hbWUsICRhaHJlZiwgQGFjb250ZW50KSA9IGFuY2hvcl9pbmZvKCRhKTsKKyAgICAgICMgdW51c2VkICRhbmFtZQorICAgICAgaWYgKHNjYWxhcihAYWNvbnRlbnQpICE9IDEpCisJeyBkaWUgIkV4cGVjdGVkIGp1c3Qgb25lIGNvbnRlbnQgb2YgPEE+IGluIDxEVD46IEBhY29udGVudCI7IH0KKyAgICAgIGlmIChyZWYgJGFjb250ZW50WzBdKQorCXsgJGFjb250ZW50WzBdLT5kdW1wOworCSAgZGllICJFeHBlY3RlZCBzdHJpbmcgY29udGVudCBvZiA8QT4gaW4gPERUPjogJGFjb250ZW50WzBdIjsgfQorICAgICAgaWYgKCFkZWZpbmVkKCRhY29udGVudCkpCisJeyAkYWNvbnRlbnQgPSAkaW5kZXhfcHJlZml4IC4gJGFjb250ZW50WzBdOworCSAgJGFjb250ZW50X3N1ZmZpeCA9ICRhY29udGVudFswXTsgfQorICAgICAgZWxzaWYgKCgkYWNvbnRlbnRbMF0gbmUgIltMaW5rXSIpICYmICgkYWNvbnRlbnQgbmUgKCRpbmRleF9wcmVmaXggLiAkYWNvbnRlbnRbMF0pKSkKKwl7IGRpZSAiRGlmZmVyaW5nIGNvbnRlbnQ6IDw8PCRhY29udGVudD4+PiwgPDw8JGFjb250ZW50WzBdPj4+IjsgfQorCisgICAgICBpZiAoIWRlZmluZWQgJGFocmVmKQorCXsgJGR0LT5kdW1wOworCSAgZGllICJubyBIUkVGIGluIG5hY2hvciBpbiA8RFQ+IjsgfQorICAgICAgbXkgKCRhaHJlZl9maWxlLCAkYWhyZWZfbmFtZSkgPSBzcGxpdCgvXCMvLCAkYWhyZWYpOworICAgICAgaWYgKCFkZWZpbmVkICRhaHJlZl9uYW1lKQorCXsgIyBSZWZlcmVuY2UgdG8gZW50aXJlIGZpbGUKKwkgICRhaHJlZl9uYW1lID0gIiI7IH0KKworICAgICAgaWYgKCRhaHJlZl9uYW1lIGVxICRsMmhfYnJva2VuX2xpbmtfbmFtZSkKKwl7IGlmICghZXhpc3RzICRmaWxlX2luZGV4X2VudHJpZXNfYnJva2VueyRhaHJlZl9maWxlfSkKKwkgICAgeyAkZmlsZV9pbmRleF9lbnRyaWVzX2Jyb2tlbnskYWhyZWZfZmlsZX0gPSBbXTsgfQorCSAgcHVzaCBAeyRmaWxlX2luZGV4X2VudHJpZXNfYnJva2VueyRhaHJlZl9maWxlfX0sICIkdGhpc19pbmRleGluZ19jb21tYW5kICRhY29udGVudCI7CisJICBuZXh0OyB9CisKKyAgICAgIGlmICghZXhpc3RzICRmaWxlX2luZGV4X2VudHJpZXN7JGFocmVmX2ZpbGV9KQorCXsgJGZpbGVfaW5kZXhfZW50cmllc3skYWhyZWZfZmlsZX0gPSB7fTsgfQorICAgICAgIyBEb24ndCBkbyB0aGlzISAgSXQgYXBwZWFycyB0byBtYWtlIGEgY29weSwgd2hpY2ggaXMgbm90IGRlc2lyZWQuCisgICAgICAjIG15ICVpbmRleF9lbnRyaWVzID0gJXskZmlsZV9pbmRleF9lbnRyaWVzeyRhaHJlZl9maWxlfX07CisgICAgICBpZiAoIWV4aXN0cyAkIHskZmlsZV9pbmRleF9lbnRyaWVzeyRhaHJlZl9maWxlfX17JGFocmVmX25hbWV9KQorCXsgJCB7JGZpbGVfaW5kZXhfZW50cmllc3skYWhyZWZfZmlsZX19eyRhaHJlZl9uYW1lfSA9IFtdOyB9CisgICAgICAjIAl7IG15ICRvbGRjb250ZW50ID0gJCB7JGZpbGVfaW5kZXhfZW50cmllc3skYWhyZWZfZmlsZX19eyRhaHJlZl9uYW1lfTsKKyAgICAgICMgCSAgaWYgKCRhY29udGVudCBlcSAkb2xkY29udGVudCkKKyAgICAgICMgCSAgICB7IGRpZSAiTXVsdGlwbGUgaWRlbnRpY2FsIGluZGV4IGVudHJpZXM/IjsgfQorICAgICAgIyAJICBkaWUgIlRyeWluZyB0byBhZGQgJGFjb250ZW50LCBidXQgYWxyZWFkeSBoYXZlIGluZGV4IGVudHJ5IHBvaW50aW5nIGF0ICRhaHJlZl9maWxlXCMkYWhyZWZfbmFtZTogJHskZmlsZV9pbmRleF9lbnRyaWVzeyRhaHJlZl9maWxlfX17JGFocmVmX25hbWV9IjsgfQorCisgICAgICBwdXNoIEB7JCB7JGZpbGVfaW5kZXhfZW50cmllc3skYWhyZWZfZmlsZX19eyRhaHJlZl9uYW1lfX0sICIkdGhpc19pbmRleGluZ19jb21tYW5kICRhY29udGVudCI7CisgICAgICAjIHByaW50IFNUREVSUiAia2V5czogIiwga2V5cyAleyRmaWxlX2luZGV4X2VudHJpZXN7JGFocmVmX2ZpbGV9fSwgIlxuIjsKKyAgICB9Cit9CisKK3N1YiBwcm9jZXNzX2luZGV4X2R0X2FuZF9kZCAoICQkICkKK3sgbXkgKCRkdCwgJGRkKSA9IGNoZWNrX2FyZ3MoMiwgQF8pOworICBteSAkZHRjb250ZW50OworICB7IG15IEBkdGNvbnRlbnQgPSBAeyRkdC0+Y29udGVudCgpfTsKKyAgICBpZiAoKHNjYWxhcihAZHRjb250ZW50KSAhPSAxKSB8fCAocmVmICRkdGNvbnRlbnRbMF0pKQorICAgICAgeyAkZGQtPmR1bXA7CisJJGR0LT5kdW1wOworCWRpZSAiRXhwZWN0ZWQgc2luZ2xlIHN0cmluZyAoYWN0dWFsIHNpemUgPSAiIC4gc2NhbGFyKEBkdGNvbnRlbnQpIC4gIikgaW4gY29udGVudCBvZiA8RFQ+OiBAZHRjb250ZW50IjsgfQorICAgICRkdGNvbnRlbnQgPSAkZHRjb250ZW50WzBdOworICAgICRkdGNvbnRlbnQgPX4gcy8gKyQvLzsgfQorICBteSAkZGRjb250ZW50OworICB7IG15IEBkZGNvbnRlbnQgPSBAeyRkZC0+Y29udGVudCgpfTsKKyAgICBpZiAoc2NhbGFyKEBkZGNvbnRlbnQpICE9IDEpCisgICAgICB7IGRpZSAiRXhwZWN0ZWQgc2luZ2xlIDxERD4gY29udGVudCwgZ290ICIsIHNjYWxhcihAZGRjb250ZW50KSwgIiBlbGVtZW50czpcbiIsIGpvaW4oIlxuIiwgQGRkY29udGVudCksICJcbiAiOyB9CisgICAgJGRkY29udGVudCA9ICRkZGNvbnRlbnRbMF07IH0KKyAgaWYgKCRkZGNvbnRlbnQtPnRhZyBuZSAiZGwiKQorICAgIHsgZGllICJFeHBlY3RlZCA8REw+IGFzIGNvbnRlbnQgb2YgPEREPiwgYnV0IHNhdzogJGRkY29udGVudCI7IH0KKworICBwdXNoIEBpbmRleF9wcmVmaXhlcywgJGluZGV4X3ByZWZpeDsKKyAgJGluZGV4X3ByZWZpeCAuPSAkZHRjb250ZW50IC4gIiwgIjsKKyAgcHJvY2Vzc19pbmRleF9kbF9jb21wYWN0KCRkZGNvbnRlbnQpOworICAkaW5kZXhfcHJlZml4ID0gcG9wKEBpbmRleF9wcmVmaXhlcyk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMgT3JkaW5hcnkgc2VjdGlvbnMKKyMjIworCitzdWIgcHJvY2Vzc19zZWN0aW9uX2ZpbGUgKCAkJCQgKQoreyBteSAoJGZpbGUsICRkZXB0aCwgJG5vZGV0aXRsZSkgPSBjaGVja19hcmdzKDMsIEBfKTsKKyAgbXkgJGhlID0gZmlsZV90b190cmVlKCgkZmlsZSA9fiAvXlwvLykgPyAkZmlsZSA6ICRodG1sX2RpcmVjdG9yeSAuICRmaWxlKTsKKworICAjIHByaW50IFNUREVSUiAicHJvY2Vzc19zZWN0aW9uX2ZpbGU6ICRmaWxlICRkZXB0aCAkbm9kZXRpdGxlXG4iOworCisgICMgRXF1aXZhbGVudGx5OgorICAjICAgd2hpbGUgKCRkZXB0aCA+PSBzY2FsYXIoQHNlY3Rpb25fc3RhY2spKSB7IHBvcChAc2VjdGlvbl9zdGFjayk7IH0KKyAgQHNlY3Rpb25fc3RhY2sgPSBAc2VjdGlvbl9zdGFja1swLi4kZGVwdGgtMV07CisKKyAgIyBOb3QgYSBncmVhdCBub2RlbmFtZSBmaXh1cCBzY2hlbWU7IG5lZWQgYSBtb3JlIGdsb2JhbCB2aWV3CisgIGlmICgoZGVmaW5lZCAkY29udGVudHNfZml4dXBzeyRub2RldGl0bGV9KQorICAgICAgJiYgKHNjYWxhcihAc2VjdGlvbl9zdGFjaykgPiAwKSkKKyAgICB7IG15ICR1cF90aXRsZSA9ICRzZWN0aW9uX3N0YWNrWyQjc2VjdGlvbl9zdGFja107CisgICAgICAjIGhhY2sgZm9yIFB5dGhvbiBTdGFuZGFyZCBMaWJyYXJ5CisgICAgICAkdXBfdGl0bGUgPX4gcy9eKEJ1aWx0LWlufFN0YW5kYXJkKSBNb2R1bGUgLy9nOworICAgICAgbXkgKCR1cF9maXJzdF93b3JkKSA9IHNwbGl0KC8gLywgJHVwX3RpdGxlKTsKKyAgICAgICRub2RldGl0bGUgPSAiJHVwX2ZpcnN0X3dvcmQgJG5vZGV0aXRsZSI7CisgICAgfQorCisgIHB1c2ggQHNlY3Rpb25fc3RhY2ssICRub2RldGl0bGU7CisgICMgcHJpbnQgU1RERVJSICJuZXcgc2VjdGlvbl9zdGFjazogIiwgam9pbigiLCAiLCBAc2VjdGlvbl9zdGFjayksICJcbiI7CisKKyAgJGhlLT50cmF2ZXJzZShcJnByb2Nlc3NfaWZfY2hpbGRfbGlua3MsICdpZ25vcmUgdGV4dCcpOworICAlZm9vdG5vdGVzID0gKCk7CisgICMgJGhlLT5kdW1wOworICAkaGUtPnRyYXZlcnNlKFwmcHJvY2Vzc19pZl9mb290bm90ZXMsICdpZ25vcmUgdGV4dCcpOworCisgICMgJGhlLT5kdW1wOworCisgIGlmIChleGlzdHMgJGZpbGVfaW5kZXhfZW50cmllc3skZmlsZX0pCisgICAgeyAldGhpc19pbmRleF9lbnRyaWVzID0gJXskZmlsZV9pbmRleF9lbnRyaWVzeyRmaWxlfX07CisgICAgICAjIHByaW50IFNUREVSUiAidGhpc19pbmRleF9lbnRyaWVzOlxuICIsIGpvaW4oIlxuICIsIGtleXMgJXRoaXNfaW5kZXhfZW50cmllcyksICJcbiI7CisgICAgfQorICBlbHNlCisgICAgeyAjIHByaW50IFNUREVSUiAiV2FybmluZzogbm8gaW5kZXggZW50cmllcyBmb3IgZmlsZSAkZmlsZVxuIjsKKyAgICAgICV0aGlzX2luZGV4X2VudHJpZXMgPSAoKTsgfQorCisgIGlmIChleGlzdHMgJGZpbGVfaW5kZXhfZW50cmllc19icm9rZW57JGZpbGV9KQorICAgIHsgQHRoaXNfaW5kZXhfZW50cmllc19icm9rZW4gPSBAeyRmaWxlX2luZGV4X2VudHJpZXNfYnJva2VueyRmaWxlfX07IH0KKyAgZWxzZQorICAgIHsgIyBwcmludCBTVERFUlIgIldhcm5pbmc6IG5vIGluZGV4IGVudHJpZXMgZm9yIGZpbGUgJGZpbGVcbiI7CisgICAgICBAdGhpc19pbmRleF9lbnRyaWVzX2Jyb2tlbiA9ICgpOyB9CisKKworICBpZiAoJGhlLT50YWcoKSBuZSAiaHRtbCIpCisgICAgeyBkaWUgIkV4cGVjdGVkIDxIVE1MPiBhdCB0b3AgbGV2ZWwiOyB9CisgIG15IEBjb250ZW50ID0gQHskaGUtPmNvbnRlbnQoKX07CisgIGlmICgoIXJlZiAkY29udGVudFswXSkgb3IgKCRjb250ZW50WzBdLT50YWcgbmUgImhlYWQiKSkKKyAgICB7ICRoZS0+ZHVtcDsKKyAgICAgIGRpZSAiPEhFQUQ+IG5vdCBmaXJzdCBlbGVtZW50IG9mIDxIVE1MPiI7IH0KKyAgaWYgKCghcmVmICRjb250ZW50WzFdKSBvciAoJGNvbnRlbnRbMV0tPnRhZyBuZSAiYm9keSIpKQorICAgIHsgJGhlLT5kdW1wOworICAgICAgZGllICI8Qk9EWT4gbm90IHNlY29uZCBlbGVtZW50IG9mIDxIVE1MPiI7IH0KKworICAkY29udGVudFsxXS0+dHJhdmVyc2UoXCZvdXRwdXRfYm9keSk7Cit9CisKKyMgc3RhY2sgb2YgdGhpbmdzIHdlJ3JlIGluc2lkZSB0aGF0IGFyZSBwcmV2ZW50aW5nIGluZGV4aW5nIGZyb20gb2NjdXJyaW5nIG5vdy4KKyMgVGhlc2UgYXJlICJoMSIsICJoMiIsICJoMyIsICJoNCIsICJoNSIsICJoNiIsICJkdCIgKGFuZCBwb3NzaWJseSBvdGhlcnM/KQorbXkgQGluZGV4X2RlZmVycmVycyA9ICgpOworCitzdWIgcHVzaF9vcl9wb3BfaW5kZXhfZGVmZXJyZXJzICggJCQgKQoreyBteSAoJHRhZywgJHN0YXJ0ZmxhZykgPSBjaGVja19hcmdzKDIsIEBfKTsKKyAgaWYgKCRzdGFydGZsYWcpCisgICAgeyBwdXNoIEBpbmRleF9kZWZlcnJlcnMsICR0YWc7IH0KKyAgZWxzZQorICAgIHsgbXkgJG9sZF9kZWZlcnJlciA9IHBvcCBAaW5kZXhfZGVmZXJyZXJzOworICAgICAgaWYgKCR0YWcgbmUgJG9sZF9kZWZlcnJlcikKKwl7IGRpZSAiRXhwZWN0ZWQgJHRhZyBhdCB0b3Agb2YgaW5kZXhfZGVmZXJyZXJzIGJ1dCBzYXcgJG9sZF9kZWZlcnJlcjsgcmVtYWluZGVyID0gIiwgam9pbigiICIsIEBpbmRleF9kZWZlcnJlcnMpOyB9CisgICAgICBkb19kZWZlcnJlZF9pbmRleF9lbnRyaWVzKCk7IH0KK30KKworCitzdWIgbGFiZWxfYWRkX2luZGV4X2VudHJpZXMgKCAkOyQgKQoreyBteSAoJGxhYmVsLCAkaGUpID0gY2hlY2tfYXJnc19yYW5nZSgxLCAyLCBAXyk7CisgICMgcHJpbnQgKChleGlzdHMgJHRoaXNfaW5kZXhfZW50cmllc3skbGFiZWx9KSA/ICIqIiA6ICIgIiksICIgbGFiZWxfYWRkX2luZGV4X2VudHJpZXMgJGxhYmVsXG4iOworICAjICRoZSBpcyB0aGUgYW5jaG9yIGVsZW1lbnQKKyAgaWYgKGV4aXN0cyAkdGhpc19pbmRleF9lbnRyaWVzeyRsYWJlbH0pCisgICAgeyBwdXNoIEBkZWZlcnJlZF9pbmRleF9lbnRyaWVzLCBAeyR0aGlzX2luZGV4X2VudHJpZXN7JGxhYmVsfX07CisgICAgICByZXR1cm47IH0KKworICBpZiAoJGxhYmVsIGVxICRsMmhfYnJva2VuX2xpbmtfbmFtZSkKKyAgICB7ICMgVHJ5IHRvIGZpbmQgc29tZSB0ZXh0IHRvIHVzZSBpbiBndWVzc2luZyB3aGljaCBsaW5rcyBzaG91bGQgcG9pbnQgaGVyZQorICAgICAgIyBJIHNob3VsZCBwcm9iYWJseSBvbmx5IGxvb2sgYXQgdGhlIHByZXZpb3VzIGVsZW1lbnQsIG9yIGlmIHRoYXQgaXMKKyAgICAgICMgYWxsIHB1bmN0dWF0aW9uLCB0aGUgb25lIGJlZm9yZSBpdDsgY29sbGVjdGluZyBhbGwgdGhlIHByZXZpb3VzIHRleHRzCisgICAgICAjIGlzIGEgYml0IG9mIG92ZXJraWxsLgorICAgICAgbXkgQGFuY2hvcl90ZXh0cyA9IGNvbGxlY3RfdGV4dHMoJGhlKTsKKyAgICAgIG15IEBwcmV2aW91c190ZXh0cyA9IGNvbGxlY3RfdGV4dHMoJGhlLT5wYXJlbnQsICRoZSk7CisgICAgICAjIDQgZWxlbWVudHMgaXMgYXJiaXRyYXJ5OyBvdWdodCB0byBmaWx0ZXIgb3V0IHB1bmN0dWF0aW9uIGFuZCBzbWFsbCB3b3JkcworICAgICAgIyBmaXJzdCwgdGhlbiBwZXJoYXBzIGtlZXAgZmV3ZXIuICBQZXJoYXBzIGFsc28gZmlsdGVyIG91dCBmb3JtYXR0aW5nIHNvCisgICAgICAjIHRoYXQgd2UgY2FuIHNlZSBhIGxhcmdlciBjaHVuayBvZiB0ZXh0PyAgKFByb2JhYmx5IG5vdC4pCisgICAgICAjIEFsc28gcGVyaGFwcyBzaG91bGQgZG8gZnVydGhlciBjaHVua2luZyBpbnRvIHdvcmRzLCBpbiBjYXNlIHRoZQorICAgICAgIyBpbmRleCB0ZXJtIGlzbid0IGEgY2h1bmsgb2YgaXRzIG93biAoZWcsIHdhcyBpbiA8dHQ+Li4uPC90dD4uCisgICAgICBteSBAY2FuZGlkYXRlX3RleHRzID0gKEBhbmNob3JfdGV4dHMsIChyZXZlcnNlKEBwcmV2aW91c190ZXh0cykpWzAuLm1pbigzLCQjcHJldmlvdXNfdGV4dHMpXSk7CisKKyAgICAgIG15ICRndWVzc2VkID0gMDsKKyAgICAgIGZvciBteSAkdGV4dCAoQGNhbmRpZGF0ZV90ZXh0cykKKwl7ICMgbXkgJG9yaWdfdGV4dCA9ICR0ZXh0OworCSAgaWYgKCR0ZXh0ID1+IC9eW1wiXGBcJygpLj8hIF0qJC8pCisJICAgIHsgbmV4dDsgfQorCSAgaWYgKGxlbmd0aCgkdGV4dCkgPD0gMikKKwkgICAgeyBuZXh0OyB9CisJICAjIGhhY2sgZm9yIFB5dGhvbiBtYW51YWw7IG1heWJlIGRlZmVyIHVudGlsIGZhaWx1cmUgZmlyc3QgdGltZSBhcm91bmQ/CisJICAkdGV4dCA9fiBzL15zeXNcLi8vZzsKKwkgIGZvciBteSAkaXRlcm0gKEB0aGlzX2luZGV4X2VudHJpZXNfYnJva2VuKQorCSAgICB7ICMgSSBjb3VsZCB0ZXN0IGZvciB6ZXJvOiAgTGFUZVgySFRNTCdzIGZhaWx1cmVzIGluIHRoZSBQeXRob24KKwkgICAgICAjIGRvY3VtZW50YXRpb24gYXJlIG9ubHkgZm9yIGl0ZW1zIG9mIHRoZSBmb3JtICIuLi4gKGJ1aWx0LWluLi4uKSIKKwkgICAgICBpZiAoaW5kZXgoJGl0ZXJtLCAkdGV4dCkgIT0gLTEpCisJCXsgcHVzaCBAZGVmZXJyZWRfaW5kZXhfZW50cmllcywgJGl0ZXJtOworCQkgICMgcHJpbnQgU1RERVJSICJHdWVzc2luZyBpbmRleCB0ZXJtIGAkaXRlcm0nIGZvciB0ZXh0IGAkb3JpZ190ZXh0J1xuIjsKKwkJICAkZ3Vlc3NlZCA9IDE7CisJCX0gfSB9CisgICAgICBpZiAoISRndWVzc2VkKQorCXsgIyBwcmludCBTVERFUlIgIk5vIGd1ZXNzIGluIGAiLCBqb2luKCInOyBgIiwgQHRoaXNfaW5kZXhfZW50cmllc19icm9rZW4pLCAiJyBmb3IgdGV4dHM6XG4gYCIsIGpvaW4oIidcbiBgIiwgQGNhbmRpZGF0ZV90ZXh0cyksICInXG4iOworCX0KKyAgICB9Cit9CisKKworIyBOZWVkIHRvIGFkZCBjYWxscyB0byB0aGlzIGF0IHZhcmlvdXMgcGxhY2VzLgorIyBQZXJoYXBzIGFkZCBIVE1MOjpFbGVtZW50IGFyZ3VtZW50IGFuZCBkbyB0aGUgY2hlY2sgZm9yIGFwcHJvcHJpYXRlbmVzcworIyBoZXJlIChpZSwgbm8gYWN0aW9uIGlmIGluc2lkZSA8SDE+LCBldGMuKS4KK3N1YiBkb19kZWZlcnJlZF9pbmRleF9lbnRyaWVzICgpCit7IGNoZWNrX2FyZ3MoMCwgQF8pOworICBpZiAoKHNjYWxhcihAZGVmZXJyZWRfaW5kZXhfZW50cmllcykgPiAwKQorICAgICAgJiYgKHNjYWxhcihAaW5kZXhfZGVmZXJyZXJzKSA9PSAwKSkKKyAgICB7IHByaW50IFRFWEkgIlxuIiwgam9pbigiXG4iLCBAZGVmZXJyZWRfaW5kZXhfZW50cmllcyksICJcbiI7CisgICAgICBAZGVmZXJyZWRfaW5kZXhfZW50cmllcyA9ICgpOyB9Cit9CisKK215ICR0YWJsZV9jb2x1bW5zOwkJIyB1bmRlZmluZWQgaWYgbm90IGluIGEgdGFibGUKK215ICR0YWJsZV9maXJzdF9jb2x1bW47CQkjIGJvb2xlYW4KKworc3ViIG91dHB1dF9ib2R5ICggJCQkICkKK3sgbXkgKCRoZSwgJHN0YXJ0ZmxhZykgPSAoY2hlY2tfYXJncygzLCBAXykpWzAsMV07ICMgIGlnbm9yZSBkZXB0aCBhcmd1bWVudAorCisgIGlmICghcmVmICRoZSkKKyAgICB7IG15ICRzcGFjZV9pbmRleCA9IGluZGV4KCRoZSwgIiAiKTsKKyAgICAgIGlmICgkc3BhY2VfaW5kZXggIT0gLTEpCisJeyAjIFdoeSBkb2VzCisJICAjICAgcHJpbnQgVEVYSSB0ZXhpX3F1b3RlKHN1YnN0cigkaGUsIDAsICRzcGFjZV9pbmRleCsxKSk7CisJICAjIGdpdmU6ICBDYW4ndCBsb2NhdGUgb2JqZWN0IG1ldGhvZCAiVEVYSSIgdmlhIHBhY2thZ2UgInRleGlfcXVvdGUiCisJICAjIChCZWNhdXNlIHRoZSBkZWZpbml0aW9uIHRleGlfcXVvdGUgaGFzbid0IGJlZW4gc2VlbiB5ZXQuKQorCSAgcHJpbnQgVEVYSSAmdGV4aV9xdW90ZShzdWJzdHIoJGhlLCAwLCAkc3BhY2VfaW5kZXgrMSkpOworCSAgZG9fZGVmZXJyZWRfaW5kZXhfZW50cmllcygpOworCSAgcHJpbnQgVEVYSSAmdGV4aV9xdW90ZShzdWJzdHIoJGhlLCAkc3BhY2VfaW5kZXgrMSkpOyB9CisgICAgICBlbHNlCisJeyBwcmludCBURVhJICZ0ZXhpX3F1b3RlKCRoZSk7IH0KKyAgICAgIHJldHVybjsgfQorCisgIG15ICR0YWcgPSAkaGUtPnRhZygpOworCisgICMgT3JkaW5hcnkgdGV4dCBtYXJrdXAgZmlyc3QKKyAgaWYgKGV4aXN0cyAkaW5saW5lX21hcmt1cHskdGFnfSkKKyAgICB7IGlmICgkc3RhcnRmbGFnKQorCXsgcHJpbnQgVEVYSSAiXEAkaW5saW5lX21hcmt1cHskdGFnfVx7IjsgfQorICAgICAgZWxzZQorCXsgcHJpbnQgVEVYSSAiXH0iOyB9IH0KKyAgZWxzaWYgKCR0YWcgZXEgImEiKQorICAgIHsgbXkgKCRuYW1lLCAkaHJlZiwgQGNvbnRlbnQpID0gYW5jaG9yX2luZm8oJGhlKTsKKyAgICAgIGlmICghJGhyZWYpCisJeyAjIFRoaXMgYW5jaG9yIGlzIG9ubHkgaGVyZSBmb3IgaW5kZXhpbmcvY3Jvc3MgcmVmZXJlbmNpbmcgcHVycG9zZXMuCisJICBpZiAoJHN0YXJ0ZmxhZykKKwkgICAgeyBsYWJlbF9hZGRfaW5kZXhfZW50cmllcygkbmFtZSwgJGhlKTsgfQorCX0KKyAgICAgIGVsc2lmICgkaHJlZiA9fiAiXihmdHB8aHR0cHxuZXdzKToiKQorCXsgaWYgKCRzdGFydGZsYWcpCisJICAgIHsgIyBTaG91bGQgYXZvaWQgc2Vjb25kIGFyZ3VtZW50IGlmIGl0J3MgaWRlbnRpY2FsIHRvIHRoZSBVUkwuCisJICAgICAgcHJpbnQgVEVYSSAiXEB1cmVmXHskaHJlZiwgIjsgfQorCSAgZWxzZQorCSAgICB7IHByaW50IFRFWEkgIlx9IjsgfQorCX0KKyAgICAgIGVsc2lmICgkaHJlZiA9fiAvXlwjKGZvb3RbMC05XSspJC8pCisJeyAjIEZvb3Rub3RlCisJICBpZiAoJHN0YXJ0ZmxhZykKKwkgICAgeyAjIENvdWxkIGRvdWJsZS1jaGVjayBuYW1lIGFuZCBjb250ZW50LCBidXQgSSdtIG5vdAorCSAgICAgICMgY3VycmVudGx5IHN0b3JpbmcgdGhhdCBpbmZvcm1hdGlvbi4KKwkgICAgICBwcmludCBURVhJICJcQGZvb3Rub3RlXHsiOworCSAgICAgICRmb290bm90ZXN7JDF9LT50cmF2ZXJzZShcJm91dHB1dF9ib2R5KTsKKwkgICAgICBwcmludCBURVhJICJcfSI7CisJICAgICAgcmV0dXJuIDA7IH0gfQorICAgICAgZWxzZQorCXsgaWYgKCRzdGFydGZsYWcpCisJICAgIHsgIyBjcm9zcy1yZWZlcmVuY2VzIGFyZSBub3QgYWN0aXZlIEluZm8gbGlua3MsIGJ1dCBubyB0ZXh0IGlzIGxvc3QKKwkgICAgICBwcmludCBTVERFUlIgIkNhbid0IGRlYWwgd2l0aCBpbnRlcm5hbCBIUkVGIGFuY2hvcnMgeWV0OlxuIjsKKwkgICAgICAkaGUtPmR1bXA7IH0KKwl9CisgICAgfQorICBlbHNpZiAoJHRhZyBlcSAiYnIiKQorICAgIHsgcHJpbnQgVEVYSSAiXEBcbiI7IH0KKyAgZWxzaWYgKCR0YWcgZXEgImJvZHkiKQorICAgIHsgfQorICBlbHNpZiAoJHRhZyBlcSAiY2VudGVyIikKKyAgICB7IGlmIChoYXNfc2luZ2xlX2NvbnRlbnRfc3RyaW5nKCRoZSkKKwkgICYmICgkIHskaGUtPmNvbnRlbnR9WzBdID1+IC9eICokLykpCisJeyByZXR1cm4gMDsgfQorICAgICAgaWYgKCRzdGFydGZsYWcpCisJeyBwcmludCBURVhJICJcblxAY2VudGVyXG4iOyB9CisgICAgICBlbHNlCisJeyBwcmludCBURVhJICJcblxAZW5kIGNlbnRlclxuIjsgfQorICAgIH0KKyAgZWxzaWYgKCR0YWcgZXEgImRpdiIpCisgICAgeyBteSAkYWxpZ24gPSAkaGUtPmF0dHIoJ2FsaWduJyk7CisgICAgICBpZiAoZGVmaW5lZCgkYWxpZ24pICYmICgkYWxpZ24gZXEgImNlbnRlciIpKQorCXsgaWYgKGhhc19zaW5nbGVfY29udGVudF9zdHJpbmcoJGhlKQorCSAgICAgICYmICgkIHskaGUtPmNvbnRlbnR9WzBdID1+IC9eICokLykpCisJICAgIHsgcmV0dXJuIDA7IH0KKwkgIGlmICgkc3RhcnRmbGFnKQorCSAgICB7IHByaW50IFRFWEkgIlxuXEBjZW50ZXJcbiI7IH0KKwkgIGVsc2UKKwkgICAgeyBwcmludCBURVhJICJcblxAZW5kIGNlbnRlclxuIjsgfSB9CisgICAgfQorICBlbHNpZiAoJHRhZyBlcSAiZGwiKQorICAgIHsgIyBSZWNvZ25pemUgIjxkbD48ZGQ+PHByZT4gLi4uIDwvcHJlPjwvZGw+IiBwYXJhZGlnbSBmb3IgIkBleGFtcGxlIgorICAgICAgaWYgKGhhc19zaW5nbGVfY29udGVudF93aXRoX3RhZygkaGUsICJkZCIpKQorCXsgbXkgJGhlX2RkID0gJCB7JGhlLT5jb250ZW50fVswXTsKKwkgIGlmIChoYXNfc2luZ2xlX2NvbnRlbnRfd2l0aF90YWcoJGhlX2RkLCAicHJlIikpCisJICAgIHsgbXkgJGhlX3ByZSA9ICQgeyRoZV9kZC0+Y29udGVudH1bMF07CisJICAgICAgcHJpbnRfcHJlKCRoZV9wcmUpOworCSAgICAgIHJldHVybiAwOyB9IH0KKyAgICAgIGlmICgkc3RhcnRmbGFnKQorCXsgIyBDb3VsZCBleGFtaW5lIHRoZSBlbGVtZW50cywgdG8gYmUgY2xldmVyZXIgYWJvdXQgZm9ybWF0dGluZy4KKwkgICMgKEFsc28gdG8gdXNlIGZ0YWJsZSwgdnRhYmxlLi4uKQorCSAgcHJpbnQgVEVYSSAiXG5cQHRhYmxlIFxAYXNpc1xuIjsgfQorICAgICAgZWxzZQorCXsgcHJpbnQgVEVYSSAiXG5cQGVuZCB0YWJsZVxuIjsgfQorICAgIH0KKyAgZWxzaWYgKCR0YWcgZXEgImR0IikKKyAgICB7IHB1c2hfb3JfcG9wX2luZGV4X2RlZmVycmVycygkdGFnLCAkc3RhcnRmbGFnKTsKKyAgICAgIGlmICgkc3RhcnRmbGFnKQorCXsgcHJpbnQgVEVYSSAiXG5cQGl0ZW0gIjsgfQorICAgICAgZWxzZQorCXsgfSB9CisgIGVsc2lmICgkdGFnIGVxICJkZCIpCisgICAgeyBpZiAoJHN0YXJ0ZmxhZykKKwl7IHByaW50IFRFWEkgIlxuIjsgfQorICAgICAgZWxzZQorCXsgfQorICAgICAgaWYgKHNjYWxhcihAaW5kZXhfZGVmZXJyZXJzKSAhPSAwKQorCXsgJGhlLT5kdW1wOworCSAgZGllICJVbmV4cGVjdGVkIDwkdGFnPiB3aGlsZSBpbnNpZGU6ICgiIC4gam9pbigiICIsIEBpbmRleF9kZWZlcnJlcnMpIC4gIik7IGJhZCBIVE1MPyI7IH0KKyAgICAgIGRvX2RlZmVycmVkX2luZGV4X2VudHJpZXMoKTsKKyAgICB9CisgIGVsc2lmICgkdGFnID1+IC9eKGZvbnR8YmlnfHNtYWxsKSQvKQorICAgIHsgIyBEbyBub3RoaW5nIGZvciBub3cuCisgICAgfQorICBlbHNpZiAoJHRhZyA9fiAvXmhbMS02XSQvKQorICAgIHsgIyBXZSBkb24ndCBuZWVkIHRoaXMgYmVjYXVzZSB3ZSBuZXZlciByZWN1cnNpdmVseSBlbnRlciB0aGUgaGVhZGluZyBjb250ZW50LgorICAgICAgIyBwdXNoX29yX3BvcF9pbmRleF9kZWZlcnJlcnMoJHRhZywgJHN0YXJ0ZmxhZyk7CisgICAgICBteSAkc2VjbmFtZSA9ICIiOworICAgICAgbXkgQHNlY2xhYmVscyA9ICgpOworICAgICAgZm9yIG15ICRlbHQgKEB7JGhlLT5jb250ZW50fSkKKwl7IGlmICghcmVmICRlbHQpCisJICAgIHsgJHNlY25hbWUgLj0gJGVsdDsgfQorCSAgZWxzaWYgKCRlbHQtPnRhZyBlcSAiYnIiKQorCSAgICB7IH0KKwkgIGVsc2lmICgkZWx0LT50YWcgZXEgImEiKQorCSAgICB7IG15ICgkbmFtZSwgJGhyZWYsIEBhY29udGVudCkgPSBhbmNob3JfaW5mbygkZWx0KTsKKyAgICAgICAgICAgICAgaWYgKCRocmVmKQorICAgICAgICAgICAgICAgIHsgJGhlLT5kdW1wOworICAgICAgICAgICAgICAgICAgJGVsdC0+ZHVtcDsKKyAgICAgICAgICAgICAgICAgIGRpZSAiTm9uc2ltcGxlIGFuY2hvciBpbiA8JHRhZz4iOyB9CisJICAgICAgaWYgKCFkZWZpbmVkICRuYW1lKQorCQl7IGRpZSAiTm8gTkFNRSBmb3IgYW5jaG9yIGluICR0YWciOyB9CisJICAgICAgcHVzaCBAc2VjbGFiZWxzLCAkbmFtZTsKKwkgICAgICBmb3IgbXkgJHN1YmVsdCAoQGFjb250ZW50KQorCQl7ICRzZWNuYW1lIC49IGh0bWxfdG9fdGV4aSgkc3ViZWx0KTsgfSB9CisJICBlbHNlCisJICAgIHsgJHNlY25hbWUgLj0gaHRtbF90b190ZXhpKCRlbHQpOyB9IH0KKyAgICAgIGlmICgkc2VjbmFtZSBlcSAiIikKKwl7IGRpZSAiTm8gc2VjdGlvbiBuYW1lIGluIDwkdGFnPiI7IH0KKyAgICAgIGlmIChzY2FsYXIoQHNlY3Rpb25fc3RhY2spID09IDEpCisJeyBpZiAoJHNlY3Rpb25fc3RhY2tbLTFdIG5lICJUb3AiKQorCSAgICB7IGRpZSAiTm90IHRvcD8gJHNlY3Rpb25fc3RhY2tbLTFdIjsgfQorCSAgcHJpbnQgVEVYSSAiXEBzZXR0aXRsZSAkc2VjbmFtZVxuIjsKKwkgIHByaW50IFRFWEkgIlxAYyAlKiplbmQgb2YgaGVhZGVyXG4iOworCSAgcHJpbnQgVEVYSSAiXG4iOworCSAgcHJpbnQgVEVYSSAiXEBub2RlIFRvcFxuIjsKKwkgIHByaW50IFRFWEkgIlxuIjsgfQorICAgICAgZWxzZQorCXsgcHJpbnQgVEVYSSAiXG5cQG5vZGUgJHNlY3Rpb25fc3RhY2tbLTFdXG4iOworCSAgcHJpbnQgVEVYSSAiXEAkc2VjdGlvbm1hcmtlcltzY2FsYXIoQHNlY3Rpb25fc3RhY2spLTFdICIsIHRleGlfcmVtb3ZlX3B1bmN0dWF0aW9uKCRzZWNuYW1lKSwgIlxuIjsgfQorICAgICAgZm9yIG15ICRzZWNsYWJlbCAoQHNlY2xhYmVscykKKwl7IGxhYmVsX2FkZF9pbmRleF9lbnRyaWVzKCRzZWNsYWJlbCk7IH0KKyAgICAgICMgVGhpcyBzaG91bGQgb25seSBoYXBwZW4gb25jZSBwZXIgZmlsZS4KKyAgICAgIGxhYmVsX2FkZF9pbmRleF9lbnRyaWVzKCIiKTsKKyAgICAgIGlmIChzY2FsYXIoQGluZGV4X2RlZmVycmVycykgIT0gMCkKKwl7ICRoZS0+ZHVtcDsKKwkgIGRpZSAiVW5leHBlY3RlZCA8JHRhZz4gd2hpbGUgaW5zaWRlOiAoIiAuIGpvaW4oIiAiLCBAaW5kZXhfZGVmZXJyZXJzKSAuICIpOyBiYWQgSFRNTD8iOyB9CisgICAgICBkb19kZWZlcnJlZF9pbmRleF9lbnRyaWVzKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2lmICgkdGFnIGVxICJociIpCisgICAgeyB9CisgIGVsc2lmICgkdGFnIGVxICJpZ25vcmUiKQorICAgIHsgIyBIYWNrIGZvciBpZ25vcmVkIGVsZW1lbnRzCisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGVsc2lmICgkdGFnIGVxICJsaSIpCisgICAgeyBpZiAoJHN0YXJ0ZmxhZykKKwl7IHByaW50IFRFWEkgIlxuXG5cQGl0ZW1cbiI7CisJICBkb19kZWZlcnJlZF9pbmRleF9lbnRyaWVzKCk7IH0gfQorICBlbHNpZiAoJHRhZyBlcSAib2wiKQorICAgIHsgaWYgKCRzdGFydGZsYWcpCisJeyBwcmludCBURVhJICJcblxAZW51bWVyYXRlIFxAYnVsbGV0XG4iOyB9CisgICAgICBlbHNlCisJeyBwcmludCBURVhJICJcblxAZW5kIGVudW1lcmF0ZVxuIjsgfSB9CisgIGVsc2lmICgkdGFnIGVxICJwIikKKyAgICB7IGlmICgkc3RhcnRmbGFnKQorCXsgcHJpbnQgVEVYSSAiXG5cbiI7IH0KKyAgICAgIGlmIChzY2FsYXIoQGluZGV4X2RlZmVycmVycykgIT0gMCkKKwl7ICRoZS0+ZHVtcDsKKwkgIGRpZSAiVW5leHBlY3RlZCA8JHRhZz4gd2hpbGUgaW5zaWRlOiAoIiAuIGpvaW4oIiAiLCBAaW5kZXhfZGVmZXJyZXJzKSAuICIpOyBiYWQgSFRNTD8iOyB9CisgICAgICBkb19kZWZlcnJlZF9pbmRleF9lbnRyaWVzKCk7IH0KKyAgZWxzaWYgKCR0YWcgZXEgInByZSIpCisgICAgeyBwcmludF9wcmUoJGhlKTsKKyAgICAgIHJldHVybiAwOyB9CisgIGVsc2lmICgkdGFnIGVxICJ0YWJsZSIpCisgICAgeyAjIENvdWxkIGFsc28gaW5kaWNhdGUgY29tbW9uIGZvcm1hdHRpbmcgZm9yIGZpcnN0IGNvbHVtbiwgb3IKKyAgICAgICMgZGV0ZXJtaW5lIHJlbGF0aXZlIHdpZHRocyBmb3IgY29sdW1ucyAob3IgZGV0ZXJtaW5lIGEgcHJvdG90eXBlIHJvdykKKyAgICAgIGlmICgkc3RhcnRmbGFnKQorCXsgaWYgKGRlZmluZWQgJHRhYmxlX2NvbHVtbnMpCisJICAgIHsgJGhlLT5kdW1wOworCSAgICAgIGRpZSAiQ2FuJ3QgZGVhbCB3aXRoIHRhYmxlIG5lc3RlZCBpbnNpZGUgJHRhYmxlX2NvbHVtbnMtY29sdW1uIHRhYmxlIjsgfQorCSAgJHRhYmxlX2NvbHVtbnMgPSB0YWJsZV9jb2x1bW5zKCRoZSk7CisJICBpZiAoJHRhYmxlX2NvbHVtbnMgPCAyKQorCSAgICB7ICRoZS0+ZHVtcDsKKwkgICAgICBkaWUgIkNvbHVtbiB3aXRoICR0YWJsZV9jb2x1bW5zIGNvbHVtbnM/IjsgfQorCSAgZWxzaWYgKCR0YWJsZV9jb2x1bW5zID09IDIpCisJICAgIHsgcHJpbnQgVEVYSSAiXG5cQHRhYmxlIFxAYXNpc1xuIjsgfQorCSAgZWxzZQorCSAgICB7IHByaW50IFRFWEkgIlxuXEBtdWx0aXRhYmxlIFxAY29sdW1uZnJhY3Rpb25zIjsKKwkgICAgICBmb3IgKG15ICRpPTA7ICRpPCR0YWJsZV9jb2x1bW5zOyAkaSsrKQorCQl7IHByaW50IFRFWEkgIiAiLCAxLjAvJHRhYmxlX2NvbHVtbnM7IH0KKwkgICAgICBwcmludCBURVhJICJcbiI7IH0gfQorICAgICAgZWxzZQorCXsgaWYgKCR0YWJsZV9jb2x1bW5zID09IDIpCisJICAgIHsgcHJpbnQgVEVYSSAiXG5cQGVuZCB0YWJsZVxuIjsgfQorCSAgZWxzZQorCSAgICB7IHByaW50IFRFWEkgIlxuXEBlbmQgbXVsdGl0YWJsZVxuIjsgfQorCSAgdW5kZWYgJHRhYmxlX2NvbHVtbnM7IH0gfQorICBlbHNpZiAoKCR0YWcgZXEgInRkIikgfHwgKCR0YWcgZXEgInRoIikpCisgICAgeyBpZiAoJHN0YXJ0ZmxhZykKKwl7IGlmICgkdGFibGVfZmlyc3RfY29sdW1uKQorCSAgICB7IHByaW50IFRFWEkgIlxuXEBpdGVtICI7CisJICAgICAgJHRhYmxlX2ZpcnN0X2NvbHVtbiA9IDA7IH0KKwkgIGVsc2lmICgkdGFibGVfY29sdW1ucyA+IDIpCisJICAgIHsgcHJpbnQgVEVYSSAiXG5cQHRhYiAiOyB9IH0KKyAgICAgIGVsc2UKKwl7IHByaW50IFRFWEkgIlxuIjsgfSB9CisgIGVsc2lmICgkdGFnIGVxICJ0ciIpCisgICAgeyBpZiAoJHN0YXJ0ZmxhZykKKwl7ICR0YWJsZV9maXJzdF9jb2x1bW4gPSAxOyB9IH0KKyAgZWxzaWYgKCR0YWcgZXEgInVsIikKKyAgICB7IGlmICgkc3RhcnRmbGFnKQorCXsgcHJpbnQgVEVYSSAiXG5cQGl0ZW1pemUgXEBidWxsZXRcbiI7IH0KKyAgICAgIGVsc2UKKwl7IHByaW50IFRFWEkgIlxuXEBlbmQgaXRlbWl6ZVxuIjsgfSB9CisgIGVsc2UKKyAgICB7ICMgSSB1c2VkIHRvIGhhdmUgYSBuZXdsaW5lIGJlZm9yZSAib3V0cHV0X2JvZHkiIGhlcmUuCisgICAgICBwcmludCBTVERFUlIgIm91dHB1dF9ib2R5OiBpZ25vcmluZyA8JHRhZz4gdGFnXG4iOworICAgICAgJGhlLT5kdW1wOworICAgICAgcmV0dXJuIDA7IH0KKworICByZXR1cm4gMTsKK30KKworc3ViIHByaW50X3ByZSAoICQgKQoreyBteSAoJGhlX3ByZSkgPSBjaGVja19hcmdzKDEsIEBfKTsKKyAgaWYgKCFoYXNfc2luZ2xlX2NvbnRlbnRfc3RyaW5nKCRoZV9wcmUpKQorICAgIHsgZGllICJNdWx0aXBsZSBvciBub24tc3RyaW5nIGNvbnRlbnQgZm9yIDxQUkU+OiAiLCBAeyRoZV9wcmUtPmNvbnRlbnR9OyB9CisgIG15ICRwcmVfY29udGVudCA9ICQgeyRoZV9wcmUtPmNvbnRlbnR9WzBdOworICBwcmludCBURVhJICJcblxAZXhhbXBsZSI7CisgIHByaW50IFRFWEkgJnRleGlfcXVvdGUoJHByZV9jb250ZW50KTsKKyAgcHJpbnQgVEVYSSAiXEBlbmQgZXhhbXBsZVxuIjsKK30KKworc3ViIHRhYmxlX2NvbHVtbnMgKCAkICkKK3sgbXkgKCR0YWJsZSkgPSBjaGVja19hcmdzKDEsIEBfKTsKKyAgbXkgJHJlc3VsdCA9IDA7CisgIGZvciBteSAkcm93IChAeyR0YWJsZS0+Y29udGVudH0pCisgICAgeyBpZiAoJHJvdy0+dGFnIG5lICJ0ciIpCisJeyAkdGFibGUtPmR1bXA7CisJICAkcm93LT5kdW1wOworCSAgZGllICJFeHBlY3RlZCA8VFI+IGFzIHRhYmxlIHJvdy4iOyB9CisgICAgICAkcmVzdWx0ID0gbWF4KCRyZXN1bHQsIHNjYWxhcihAeyRyb3ctPmNvbnRlbnR9KSk7IH0KKyAgcmV0dXJuICRyZXN1bHQ7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMgVXRpbGl0aWVzCisjIyMKKworc3ViIG1pbiAoICQkICkKK3sgbXkgKCR4LCAkeSkgPSBjaGVja19hcmdzKDIsIEBfKTsKKyAgcmV0dXJuICgkeCA8ICR5KSA/ICR4IDogJHk7Cit9CisKK3N1YiBtYXggKCAkJCApCit7IG15ICgkeCwgJHkpID0gY2hlY2tfYXJncygyLCBAXyk7CisgIHJldHVybiAoJHggPiAkeSkgPyAkeCA6ICR5OworfQorCitzdWIgZmlsZV90b190cmVlICggJCApCit7IG15ICgkZmlsZSkgPSBjaGVja19hcmdzKDEsIEBfKTsKKworICBteSAkdHJlZSA9IG5ldyBIVE1MOjpUcmVlQnVpbGRlcjsKKyAgJHRyZWUtPmlnbm9yZV91bmtub3duKDEpOworICAjICR0cmVlLT53YXJuKDEpOworICAkdHJlZS0+cGFyc2VfZmlsZSgkZmlsZSk7CisgIGNsZWFudXBfcGFyc2VfdHJlZSgkdHJlZSk7CisgIHJldHVybiAkdHJlZQorfQorCisKK3N1YiBoYXNfc2luZ2xlX2NvbnRlbnQgKCAkICkKK3sgbXkgKCRoZSkgPSBjaGVja19hcmdzKDEsIEBfKTsKKyAgaWYgKCFyZWYgJGhlKQorICAgIHsgIyByZXR1cm4gMDsKKyAgICAgIGRpZSAiTm9uLXJlZmVyZW5jZSBhcmd1bWVudDogJGhlIjsgfQorICBteSAkcmVmX2NvbnRlbnQgPSAkaGUtPmNvbnRlbnQ7CisgIGlmICghZGVmaW5lZCAkcmVmX2NvbnRlbnQpCisgICAgeyByZXR1cm4gMDsgfQorICBteSBAY29udGVudCA9IEB7JHJlZl9jb250ZW50fTsKKyAgaWYgKHNjYWxhcihAY29udGVudCkgIT0gMSkKKyAgICB7IHJldHVybiAwOyB9CisgIHJldHVybiAxOworfQorCisKKyMgUmV0dXJuIHRydWUgaWYgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgY29udGFpbnMgb25seSBvbmUgZWxlbWVudCBpdHNlbGYsCisjIGFuZCB0aGF0IGlubmVyIGVsZW1lbnQgaGFzIHRoZSBzcGVjaWZpZWQgdGFnLgorc3ViIGhhc19zaW5nbGVfY29udGVudF93aXRoX3RhZyAoICQkICkKK3sgbXkgKCRoZSwgJHRhZykgPSBjaGVja19hcmdzKDIsIEBfKTsKKyAgaWYgKCFoYXNfc2luZ2xlX2NvbnRlbnQoJGhlKSkKKyAgICB7IHJldHVybiAwOyB9CisgIG15ICRjb250ZW50ID0gJCB7JGhlLT5jb250ZW50fVswXTsKKyAgaWYgKCFyZWYgJGNvbnRlbnQpCisgICAgeyByZXR1cm4gMDsgfQorICBteSAkY29udGVudF90YWcgPSAkY29udGVudC0+dGFnOworICBpZiAoIWRlZmluZWQgJGNvbnRlbnRfdGFnKQorICAgIHsgcmV0dXJuIDA7IH0KKyAgcmV0dXJuICRjb250ZW50X3RhZyBlcSAkdGFnOworfQorCitzdWIgaGFzX3NpbmdsZV9jb250ZW50X3N0cmluZyAoICQgKQoreyBteSAoJGhlKSA9IGNoZWNrX2FyZ3MoMSwgQF8pOworICBpZiAoIWhhc19zaW5nbGVfY29udGVudCgkaGUpKQorICAgIHsgcmV0dXJuIDA7IH0KKyAgbXkgJGNvbnRlbnQgPSAkIHskaGUtPmNvbnRlbnR9WzBdOworICBpZiAocmVmICRjb250ZW50KQorICAgIHsgcmV0dXJuIDA7IH0KKyAgcmV0dXJuIDE7Cit9CisKKworIyBSZXR1cm4gbmFtZSwgaHJlZiwgY29udGVudC4gIEZpcnN0IHR3byBtYXkgYmUgdW5kZWZpbmVkOyB0aGlyZCBpcyBhbiBhcnJheS4KKyMgSSBkb24ndCBzZWUgaG93IHRvIGRldGVybWluZSBpZiB0aGVyZSBhcmUgbW9yZSBhdHRyaWJ1dGVzLgorc3ViIGFuY2hvcl9pbmZvICggJCApCit7IG15ICgkaGUpID0gY2hlY2tfYXJncygxLCBAXyk7CisgIGlmICgkaGUtPnRhZyBuZSAiYSIpCisgICAgeyAkaGUtPmR1bXA7CisgICAgICBkaWUgInBhc3NlZCBub24tYW5jaG9yIHRvIGFuY2hvcl9pbmZvIjsgfQorICBteSAkbmFtZSA9ICRoZS0+YXR0cignbmFtZScpOworICBteSAkaHJlZiA9ICRoZS0+YXR0cignaHJlZicpOworICBteSBAY29udGVudCA9ICgpOworICB7IG15ICRyZWZfY29udGVudCA9ICRoZS0+Y29udGVudDsKKyAgICBpZiAoZGVmaW5lZCAkcmVmX2NvbnRlbnQpCisgICAgICB7IEBjb250ZW50ID0gQHskcmVmX2NvbnRlbnR9OyB9IH0KKyAgcmV0dXJuICgkbmFtZSwgJGhyZWYsIEBjb250ZW50KTsKK30KKworCitzdWIgdGV4aV9xdW90ZSAoICQgKQoreyBteSAoJHRleHQpID0gY2hlY2tfYXJncygxLCBAXyk7CisgICR0ZXh0ID1+IHMvKFtcQFx7XH1dKS9cQCQxL2c7CisgICR0ZXh0ID1+IHMvIC0tIC8gLS0tIC9nOworICByZXR1cm4gJHRleHQ7Cit9CisKKyMgRWxpbWluYXRlIGJhZCBwdW5jdHVhdGlvbiAodGhhdCBjb25mdXNlcyBNYWtlaW5mbyBvciBJbmZvKSBmb3Igc2VjdGlvbiB0aXRsZXMuCitzdWIgdGV4aV9yZW1vdmVfcHVuY3R1YXRpb24gKCAkICkKK3sgbXkgKCR0ZXh0KSA9IGNoZWNrX2FyZ3MoMSwgQF8pOworCisgICR0ZXh0ID1+IHMvXiArLy9nOworICAkdGV4dCA9fiBzL1sgOl0rJC8vZzsKKyAgJHRleHQgPX4gcy9eWzEtOV1bMC05Ll0qICsvL2c7CisgICR0ZXh0ID1+IHMvLC8vZzsKKyAgIyBCb3RoIGVtYmVkZGVkIGNvbG9ucyBhbmQgIiAtLSAiIGNvbmZ1c2UgbWFrZWluZm8uICAoUGVyaGFwcyAiIC0tICIKKyAgIyBnZXRzIGNvbnZlcnRlZCBpbnRvICIgLSAiLCBqdXN0IGFzICItLS0iIHdvdWxkIGJlIGNvbnZlcnRlZCBpbnRvICIgLS0gIiwKKyAgIyBzbyB0aGUgbmFtZXMgZW5kIHVwIGRpZmZlcmluZy4pCisgICMgJHRleHQgPX4gcy86LyAtLSAvZzsKKyAgJHRleHQgPX4gcy86Ly9nOworICByZXR1cm4gJHRleHQ7Cit9CisKKworIyMgRG8gbm90IHVzZSB0aGlzIGluc2lkZSBgdHJhdmVyc2UnOiAgaXQgdGhyb3dzIG9mZiB0aGUgdHJhdmVyc2FsLiAgVXNlCisjIyBodG1sX3JlcGxhY2VfYnlfaWdub3JlIG9yIGh0bWxfcmVwbGFjZV9ieV9tZXRhIGluc3RlYWQuCisjIFJldHVybnMgMSBpZiBzdWNjZXNzLCAwIGlmIGZhaWx1cmUuCitzdWIgaHRtbF9yZW1vdmUgKCAkOyQgKQoreyBteSAoJGhlLCAkcGFyZW50KSA9IGNoZWNrX2FyZ3NfcmFuZ2UoMSwgMiwgQF8pOworICBpZiAoIWRlZmluZWQgJHBhcmVudCkKKyAgICB7ICRwYXJlbnQgPSAkaGUtPnBhcmVudDsgfQorICBteSAkcmVmX3Bjb250ZW50ID0gJHBhcmVudC0+Y29udGVudDsKKyAgbXkgQHBjb250ZW50ID0gQHskcmVmX3Bjb250ZW50fTsKKyAgZm9yIChteSAkaT0wOyAkaTxzY2FsYXIoQHBjb250ZW50KTsgJGkrKykKKyAgICB7IGlmICgkcGNvbnRlbnRbJGldIGVxICRoZSkKKwl7IHNwbGljZSBAeyRyZWZfcGNvbnRlbnR9LCAkaSwgMTsKKwkgICRoZS0+cGFyZW50KHVuZGVmKTsKKwkgIHJldHVybiAxOyB9IH0KKyAgZGllICJEaWRuJ3QgZmluZCAkaGUgaW4gJHBhcmVudCI7Cit9CisKKworc3ViIGh0bWxfcmVwbGFjZSAoICQkOyQgKQoreyBteSAoJG9yaWcsICRuZXcsICRwYXJlbnQpID0gY2hlY2tfYXJnc19yYW5nZSgyLCAzLCBAXyk7CisgIGlmICghZGVmaW5lZCAkcGFyZW50KQorICAgIHsgJHBhcmVudCA9ICRvcmlnLT5wYXJlbnQ7IH0KKyAgbXkgJHJlZl9wY29udGVudCA9ICRwYXJlbnQtPmNvbnRlbnQ7CisgIG15IEBwY29udGVudCA9IEB7JHJlZl9wY29udGVudH07CisgIGZvciAobXkgJGk9MDsgJGk8c2NhbGFyKEBwY29udGVudCk7ICRpKyspCisgICAgeyBpZiAoJHBjb250ZW50WyRpXSBlcSAkb3JpZykKKwl7ICQgeyRyZWZfcGNvbnRlbnR9WyRpXSA9ICRuZXc7CisJICAkbmV3LT5wYXJlbnQoJHBhcmVudCk7CisJICAkb3JpZy0+cGFyZW50KHVuZGVmKTsKKwkgIHJldHVybiAxOyB9IH0KKyAgZGllICJEaWRuJ3QgZmluZCAkb3JpZyBpbiAkcGFyZW50IjsKK30KKworc3ViIGh0bWxfcmVwbGFjZV9ieV9tZXRhICggJDskICkKK3sgbXkgKCRvcmlnLCAkcGFyZW50KSA9IGNoZWNrX2FyZ3NfcmFuZ2UoMSwgMiwgQF8pOworICBteSAkbWV0YSA9IG5ldyBIVE1MOjpFbGVtZW50ICJtZXRhIjsKKyAgaWYgKCFkZWZpbmVkICRwYXJlbnQpCisgICAgeyAkcGFyZW50ID0gJG9yaWctPnBhcmVudDsgfQorICByZXR1cm4gaHRtbF9yZXBsYWNlKCRvcmlnLCAkbWV0YSwgJHBhcmVudCk7Cit9CisKK3N1YiBodG1sX3JlcGxhY2VfYnlfaWdub3JlICggJDskICkKK3sgbXkgKCRvcmlnLCAkcGFyZW50KSA9IGNoZWNrX2FyZ3NfcmFuZ2UoMSwgMiwgQF8pOworICBteSAkaWdub3JlID0gbmV3IEhUTUw6OkVsZW1lbnQgImlnbm9yZSI7CisgIGlmICghZGVmaW5lZCAkcGFyZW50KQorICAgIHsgJHBhcmVudCA9ICRvcmlnLT5wYXJlbnQ7IH0KKyAgcmV0dXJuIGh0bWxfcmVwbGFjZSgkb3JpZywgJGlnbm9yZSwgJHBhcmVudCk7Cit9CisKKworCisjIyMKKyMjIyBDb2xsZWN0IHRleHQgZWxlbWVudHMKKyMjIworCitteSBAY29sbGVjdGVkX3RleHRzOworbXkgJGNvbGxlY3RfdGV4dHNfc3RvcHBvaW50OworbXkgJGRvbmVfY29sbGVjdGluZzsKKworc3ViIGNvbGxlY3RfdGV4dHMgKCAkOyQgKQoreyBteSAoJHJvb3QsICRzdG9wKSA9IGNoZWNrX2FyZ3NfcmFuZ2UoMSwgMiwgQF8pOworICAjIHByaW50IFNUREVSUiAiY29sbGVjdF90ZXh0czogJHJvb3QgJHN0b3BcbiI7CisgICRjb2xsZWN0X3RleHRzX3N0b3Bwb2ludCA9ICRzdG9wOworICAkZG9uZV9jb2xsZWN0aW5nID0gMDsKKyAgQGNvbGxlY3RlZF90ZXh0cyA9ICgpOworICAkcm9vdC0+dHJhdmVyc2UoXCZjb2xsZWN0X2lmX3RleHQpOyAjIHByb2Nlc3MgdGV4dHMKKyAgIyBwcmludCBTVERFUlIgImNvbGxlY3RfdGV4dHMgPT4gIiwgam9pbigiOzs7IiwgQGNvbGxlY3RlZF90ZXh0cyksICJcbiI7CisgIHJldHVybiBAY29sbGVjdGVkX3RleHRzOworfQorCitzdWIgY29sbGVjdF9pZl90ZXh0ICggJCQkICkKK3sgbXkgJGhlID0gKGNoZWNrX2FyZ3MoMywgQF8pKVswXTsgIyAgaWdub3JlIGRlcHRoIGFuZCBzdGFydGZsYWcgYXJndW1lbnRzCisgIGlmICgkZG9uZV9jb2xsZWN0aW5nKQorICAgIHsgcmV0dXJuIDA7IH0KKyAgaWYgKCFkZWZpbmVkICRoZSkKKyAgICB7IHJldHVybiAwOyB9CisgIGlmICghcmVmICRoZSkKKyAgICB7IHB1c2ggQGNvbGxlY3RlZF90ZXh0cywgJGhlOworICAgICAgcmV0dXJuIDA7IH0KKyAgaWYgKChkZWZpbmVkICRjb2xsZWN0X3RleHRzX3N0b3Bwb2ludCkgJiYgKCRoZSBlcSAkY29sbGVjdF90ZXh0c19zdG9wcG9pbnQpKQorICAgIHsgJGRvbmVfY29sbGVjdGluZyA9IDE7CisgICAgICByZXR1cm4gMDsgfQorICByZXR1cm4gMTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyBDbGVhbiB1cCBwYXJzZSB0cmVlCisjIyMKKworc3ViIGNsZWFudXBfcGFyc2VfdHJlZSAoICQgKQoreyBteSAoJGhlKSA9IGNoZWNrX2FyZ3MoMSwgQF8pOworICAkaGUtPnRyYXZlcnNlKFwmZGVsZXRlX2lmX25hdmlnYXRpb24sICdpZ25vcmUgdGV4dCcpOworICAkaGUtPnRyYXZlcnNlKFwmZGVsZXRlX2V4dHJhX3NwYWNlcywgJ2lnbm9yZSB0ZXh0Jyk7CisgICRoZS0+dHJhdmVyc2UoXCZtZXJnZV9kbCwgJ2lnbm9yZSB0ZXh0Jyk7CisgICRoZS0+dHJhdmVyc2UoXCZyZW9yZGVyX2R0X2FuZF9kbCwgJ2lnbm9yZSB0ZXh0Jyk7CisgIHJldHVybiAkaGU7Cit9CisKKworIyMgU2ltcGxlciB2ZXJzaW9uIHRoYXQgZGVsZXRlcyBjb250ZW50cyBidXQgbm90IHRoZSBlbGVtZW50IGl0c2VsZi4KKyMgc3ViIGRlbGV0ZV9pZl9uYXZpZ2F0aW9uICggJCQkICkKKyMgeyBteSAkaGUgPSAoY2hlY2tfYXJncygzLCBAXykpWzBdOyAjIGlnbm9yZSBzdGFydGZsYWcgYW5kIGRlcHRoCisjICAgaWYgKCgkaGUtPnRhZygpIGVxICJkaXYiKSAmJiAoJGhlLT5hdHRyKCdjbGFzcycpIGVxICduYXZpZ2F0aW9uJykpCisjICAgICB7ICRoZS0+ZGVsZXRlKCk7CisjICAgICAgIHJldHVybiAwOyB9CisjICAgZWxzZQorIyAgICAgeyByZXR1cm4gMTsgfQorIyB9CisKK3N1YiBkZWxldGVfaWZfbmF2aWdhdGlvbiAoICQkJCApCit7IG15ICgkaGUsICRzdGFydGZsYWcpID0gKGNoZWNrX2FyZ3MoMywgQF8pKVswLDFdOyAjICBpZ25vcmUgZGVwdGggYXJndW1lbnQKKyAgaWYgKCEkc3RhcnRmbGFnKQorICAgIHsgcmV0dXJuOyB9CisKKyAgaWYgKCgkaGUtPnRhZygpIGVxICJkaXYiKSAmJiAoZGVmaW5lZCAkaGUtPmF0dHIoJ2NsYXNzJykpICYmICgkaGUtPmF0dHIoJ2NsYXNzJykgZXEgJ25hdmlnYXRpb24nKSkKKyAgICB7IG15ICRyZWZfcGNvbnRlbnQgPSAkaGUtPnBhcmVudCgpLT5jb250ZW50KCk7CisgICAgICAjIERvbid0IHRyeSB0byBtb2RpZnkgQHBjb250ZW50LCB3aGljaCBhcHBlYXJzIHRvIGJlIGEgQ09QWS4KKyAgICAgICMgbXkgQHBjb250ZW50ID0gQHskcmVmX3Bjb250ZW50fTsKKyAgICAgIGZvciAobXkgJGkgPSAwOyAkaTxzY2FsYXIoQHskcmVmX3Bjb250ZW50fSk7ICRpKyspCisJeyBpZiAoJHskcmVmX3Bjb250ZW50fVskaV0gZXEgJGhlKQorCSAgICB7IHNwbGljZShAeyRyZWZfcGNvbnRlbnR9LCAkaSwgMSk7CisJICAgICAgbGFzdDsgfSB9CisgICAgICAkaGUtPmRlbGV0ZSgpOworICAgICAgcmV0dXJuIDA7IH0KKyAgZWxzZQorICAgIHsgcmV0dXJuIDE7IH0KK30KKworc3ViIGRlbGV0ZV9leHRyYV9zcGFjZXMgKCAkJCQgKQoreyBteSAoJGhlLCAkc3RhcnRmbGFnKSA9IChjaGVja19hcmdzKDMsIEBfKSlbMCwxXTsgIyAgaWdub3JlIGRlcHRoIGFyZ3VtZW50CisgIGlmICghJHN0YXJ0ZmxhZykKKyAgICB7IHJldHVybjsgfQorCisgIG15ICR0YWcgPSAkaGUtPnRhZzsKKyAgaWYgKCR0YWcgPX4gL14oaGVhZHxodG1sfHRhYmxlfHRyfHVsKSQvKQorICAgIHsgZGVsZXRlX2NoaWxkX3NwYWNlcygkaGUpOyB9CisgIGRlbGV0ZV90cmFpbGluZ19zcGFjZXMoJGhlKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3ViIGRlbGV0ZV9jaGlsZF9zcGFjZXMgKCAkICkKK3sgbXkgKCRoZSkgPSBjaGVja19hcmdzKDEsIEBfKTsKKyAgbXkgJHJlZl9jb250ZW50ID0gJGhlLT5jb250ZW50KCk7CisgIGZvciAobXkgJGkgPSAwOyAkaTxzY2FsYXIoQHskcmVmX2NvbnRlbnR9KTsgJGkrKykKKyAgICB7IGlmICgkIHskcmVmX2NvbnRlbnR9WyRpXSA9fiAvXiAqJC8pCisJeyBzcGxpY2UoQHskcmVmX2NvbnRlbnR9LCAkaSwgMSk7CisJICAkaS0tOyB9IH0KK30KKworc3ViIGRlbGV0ZV90cmFpbGluZ19zcGFjZXMgKCAkICkKK3sgbXkgKCRoZSkgPSBjaGVja19hcmdzKDEsIEBfKTsKKyAgbXkgJHJlZl9jb250ZW50ID0gJGhlLT5jb250ZW50KCk7CisgIGlmICghIGRlZmluZWQgJHJlZl9jb250ZW50KQorICAgIHsgcmV0dXJuOyB9CisgICMgQ291bGQgYWxzbyBjaGVjayBmb3IgcHJldmlvdXMgZWxlbWVudCA9IC9eaFsxLTZdJC8uCisgIGZvciAobXkgJGkgPSAwOyAkaTxzY2FsYXIoQHskcmVmX2NvbnRlbnR9KS0xOyAkaSsrKQorICAgIHsgaWYgKCQgeyRyZWZfY29udGVudH1bJGldID1+IC9eICokLykKKwl7IG15ICRuZXh0X2VsdCA9ICQgeyRyZWZfY29udGVudH1bJGkrMV07CisJICBpZiAoKHJlZiAkbmV4dF9lbHQpICYmICgkbmV4dF9lbHQtPnRhZyA9fiAvXihicnxkZHxkbHxkdHxocnxwfHVsKSQvKSkKKwkgICAgeyBzcGxpY2UoQHskcmVmX2NvbnRlbnR9LCAkaSwgMSk7CisJICAgICAgJGktLTsgfSB9IH0KKyAgaWYgKCRoZS0+dGFnID1+IC9eKGRkfGR0fF5oWzEtNl18bGl8cCkkLykKKyAgICB7IG15ICRsYXN0X2VsdCA9ICQgeyRyZWZfY29udGVudH1bJCN7JHJlZl9jb250ZW50fV07CisgICAgICBpZiAoKGRlZmluZWQgJGxhc3RfZWx0KSAmJiAoJGxhc3RfZWx0ID1+IC9eICokLykpCisJeyBwb3AgQHskcmVmX2NvbnRlbnR9OyB9IH0KK30KKworCisjIExhVGVYMkhUTUwgc29tZXRpbWVzIGNyZWF0ZXMKKyMgICA8RFQ+dGV4dAorIyAgIDxETCBDT01QQUNUPjxERD50ZXh0CisjIHdoaWNoIHNob3VsZCBhY3R1YWxseSBiZToKKyMgICA8REwgQ09NUEFDVD4KKyMgICA8RFQ+dGV4dAorIyAgIDxERD50ZXh0CisjIFNpbmNlIGEgPERMPiBnZXRzIGFkZGVkLCB0aGlzIGVuZHMgdXAgbG9va2luZyBsaWtlCisjIDxQPgorIyAgIDxETD4KKyMgICAgIDxEVD4KKyMgICAgICAgdGV4dDEuLi4KKyMgICAgICAgPERMIENPTVBBQ1Q+CisjICAgICAgICAgPEREPgorIyAgICAgICAgICAgdGV4dDIuLi4KKyMgICAgICAgICBkdF9vcl9kZDEuLi4KKyMgICAgIGR0X29yX2RkMi4uLgorIyB3aGljaCBzaG91bGQgYmVjb21lCisjIDxQPgorIyAgIDxETCBDT01QQUNUPgorIyAgICAgPERUPgorIyAgICAgICB0ZXh0MS4uLgorIyAgICAgPEREPgorIyAgICAgICB0ZXh0Mi4uLgorIyAgICAgZHRfb3JfZGQxLi4uCisjICAgICBkdF9vcl9kZDIuLi4KKworc3ViIHJlb3JkZXJfZHRfYW5kX2RsICggJCQkICkKK3sgbXkgKCRoZSwgJHN0YXJ0ZmxhZykgPSAoY2hlY2tfYXJncygzLCBAXykpWzAsMV07ICMgIGlnbm9yZSBkZXB0aCBhcmd1bWVudAorICBpZiAoISRzdGFydGZsYWcpCisgICAgeyByZXR1cm47IH0KKworICBpZiAoJGhlLT50YWcoKSBlcSAicCIpCisgICAgeyBteSAkcmVmX3Bjb250ZW50ID0gJGhlLT5jb250ZW50KCk7CisgICAgICBpZiAoZGVmaW5lZCAkcmVmX3Bjb250ZW50KQorCXsgbXkgQHBjb250ZW50ID0gQHskcmVmX3Bjb250ZW50fTsKKwkgICMgcHJpbnQgInJlb3JkZXJfZHRfYW5kX2RsIGZvdW5kIGEgPHA+XG4iOyAkaGUtPmR1bXAoKTsKKwkgIGlmICgoc2NhbGFyKEBwY29udGVudCkgPj0gMSkKKwkgICAgICAmJiAocmVmICRwY29udGVudFswXSkgJiYgKCRwY29udGVudFswXS0+dGFnKCkgZXEgImRsIikKKwkgICAgICAmJiAkcGNvbnRlbnRbMF0tPmltcGxpY2l0KCkpCisJICAgIHsgbXkgJHJlZl9kbGNvbnRlbnQgPSAkcGNvbnRlbnRbMF0tPmNvbnRlbnQoKTsKKwkgICAgICAjIHByaW50ICJyZW9yZGVyX2R0X2FuZF9kbCBmb3VuZCBhIDxwPiBhbmQgaW1wbGljaXQgPGRsPlxuIjsKKwkgICAgICBpZiAoZGVmaW5lZCAkcmVmX2RsY29udGVudCkKKwkJeyBteSBAZGxjb250ZW50ID0gQHskcmVmX2RsY29udGVudH07CisJCSAgaWYgKChzY2FsYXIoQGRsY29udGVudCkgPj0gMSkKKwkJICAgICAgJiYgKHJlZiAkZGxjb250ZW50WzBdKSAmJiAoJGRsY29udGVudFswXS0+dGFnKCkgZXEgImR0IikpCisJCSAgICB7IG15ICRyZWZfZHRjb250ZW50ID0gJGRsY29udGVudFswXS0+Y29udGVudCgpOworCQkgICAgICAjIHByaW50ICJyZW9yZGVyX2R0X2FuZF9kbCBmb3VuZCBhIDxwPiwgaW1wbGljaXQgPGRsPiwgYW5kIDxkdD5cbiI7CisJCSAgICAgIGlmIChkZWZpbmVkICRyZWZfZHRjb250ZW50KQorCQkJeyBteSBAZHRjb250ZW50ID0gQHskcmVmX2R0Y29udGVudH07CisJCQkgIGlmICgoc2NhbGFyKEBkdGNvbnRlbnQpID4gMCkKKwkJCSAgICAgICYmIChyZWYgJGR0Y29udGVudFskI2R0Y29udGVudF0pCisJCQkgICAgICAmJiAoJGR0Y29udGVudFskI2R0Y29udGVudF0tPnRhZygpIGVxICJkbCIpKQorCQkJICAgIHsgbXkgJHJlZl9kbDJjb250ZW50ID0gJGR0Y29udGVudFskI2R0Y29udGVudF0tPmNvbnRlbnQoKTsKKwkJCSAgICAgICMgcHJpbnQgInJlb3JkZXJfZHRfYW5kX2RsIGZvdW5kIGEgPHA+LCBpbXBsaWNpdCA8ZGw+LCA8ZHQ+LCBhbmQgPGRsPlxuIjsKKwkJCSAgICAgIGlmIChkZWZpbmVkICRyZWZfZGwyY29udGVudCkKKwkJCQl7IG15IEBkbDJjb250ZW50ID0gQHskcmVmX2RsMmNvbnRlbnR9OworCQkJCSAgaWYgKChzY2FsYXIoQGRsMmNvbnRlbnQpID4gMCkKKwkJCQkgICAgICAmJiAocmVmICgkZGwyY29udGVudFswXSkpCisJCQkJICAgICAgJiYgKCRkbDJjb250ZW50WzBdLT50YWcoKSBlcSAiZGQiKSkKKwkJCSAgICB7CisJCQkgICAgICAjIHByaW50ICJyZW9yZGVyX2R0X2FuZF9kbCBmb3VuZCBhIDxwPiwgaW1wbGljaXQgPGRsPiwgPGR0PiwgPGRsPiwgYW5kIDxkZD5cbiI7CisJCQkgICAgICAjIHByaW50IFNUREVSUiAiQ0hBTkdJTkdcbiI7ICRoZS0+ZHVtcCgpOworCQkJICAgICAgaHRtbF9yZXBsYWNlX2J5X2lnbm9yZSgkZHRjb250ZW50WyQjZHRjb250ZW50XSk7CisJCQkgICAgICBzcGxpY2UoQHskcmVmX2RsY29udGVudH0sIDEsIDAsIEBkbDJjb250ZW50KTsKKwkJCSAgICAgICMgcHJpbnQgU1RERVJSICJDSEFOR0VEIFRPOlxuIjsgJGhlLT5kdW1wKCk7CisJCQkgICAgICByZXR1cm4gMDsgIyBkb24ndCB0cmF2ZXJzZSBjaGlsZHJlbgorCQkJICAgIH0gfSB9IH0gfSB9IH0gfSB9CisgIHJldHVybiAxOworfQorCisKKyMgSWYgd2UgZmluZCBhIHBhcmFncmFwaCB0aGF0IGxvb2tzIGxpa2UKKyMgPFA+CisjICAgPEhSPgorIyAgIDxVTD4KKyMgdGhlbiBhY2N1bXVsYXRlIGl0cyBsaW5rcyBpbnRvIGEgY29udGVudHNfbGlzdCBhbmQgZGVsZXRlIHRoZSBwYXJhZ3JhcGguCitzdWIgcHJvY2Vzc19pZl9jaGlsZF9saW5rcyAoICQkJCApCit7IG15ICgkaGUsICRzdGFydGZsYWcpID0gKGNoZWNrX2FyZ3MoMywgQF8pKVswLDFdOyAjICBpZ25vcmUgZGVwdGggYXJndW1lbnQKKyAgaWYgKCEkc3RhcnRmbGFnKQorICAgIHsgcmV0dXJuOyB9CisKKyAgaWYgKCRoZS0+dGFnKCkgZXEgInAiKQorICAgIHsgbXkgJHJlZl9jb250ZW50ID0gJGhlLT5jb250ZW50KCk7CisgICAgICBpZiAoZGVmaW5lZCAkcmVmX2NvbnRlbnQpCisJeyBteSBAY29udGVudCA9IEB7JHJlZl9jb250ZW50fTsKKwkgIGlmICgoc2NhbGFyKEBjb250ZW50KSA9PSAyKQorCSAgICAgICYmIChyZWYgJGNvbnRlbnRbMF0pICYmICRjb250ZW50WzBdLT50YWcoKSBlcSAiaHIiCisJICAgICAgJiYgKHJlZiAkY29udGVudFsxXSkgJiYgJGNvbnRlbnRbMV0tPnRhZygpIGVxICJ1bCIpCisJICAgIHsgcHJvY2Vzc19jaGlsZF9saW5rcygkaGUpOworCSAgICAgICRoZS0+ZGVsZXRlKCk7CisJICAgICAgcmV0dXJuIDA7IH0gfSB9CisgIHJldHVybiAxOworfQorCisKKyMgSWYgd2UgZmluZAorIyAgICAgPEg0PgorIyAgICAgICAiRm9vdG5vdGVzIgorIyAgICAgPERMPgorIyAgICAgICA8RFQ+CisjICAgICAgICAgPEEgTkFNRT0iZm9vdDU2MCI+CisjICAgICAgICAgICAiLi4uYm9ycm93IgorIyAgICAgICAgIDxBIEhSRUY9InJlZmNvdW50c0luUHl0aG9uLmh0bWwjdGV4Mmh0bWwyIiBOQU1FPSJmb290NTYwIj4KKyMgICAgICAgICAgICIxLjIiCisjICAgICAgIDxERD4KKyMgICAgICAgICAiVGhlIG1ldGFwaG9yIG9mIGBgYm9ycm93aW5nJycgYSByZWZlcmVuY2UgaXMgbm90IGNvbXBsZXRlbHkgY29ycmVjdDogdGhlIG93bmVyIHN0aWxsIGhhcyBhIGNvcHkgb2YgdGhlIHJlZmVyZW5jZS4gIgorIyAgICAgICAuLi4KKyMgdGhlbiByZWNvcmQgdGhlIGZvb3Rub3RlIGluZm9ybWF0aW9uIGFuZCBkZWxldGUgdGhlIHNlY3Rpb24gYW5kIGxpc3QuCisKK215ICRwcm9jZXNzX2lmX2Zvb3Rub3Rlc19leHBlY3RfZGxfbmV4dCA9IDA7CisKK3N1YiBwcm9jZXNzX2lmX2Zvb3Rub3RlcyAoICQkJCApCit7IG15ICgkaGUsICRzdGFydGZsYWcpID0gKGNoZWNrX2FyZ3MoMywgQF8pKVswLDFdOyAjICBpZ25vcmUgZGVwdGggYXJndW1lbnQKKyAgaWYgKCEkc3RhcnRmbGFnKQorICAgIHsgcmV0dXJuOyB9CisKKyAgaWYgKCgkaGUtPnRhZygpIGVxICJoNCIpCisgICAgICAmJiBoYXNfc2luZ2xlX2NvbnRlbnRfc3RyaW5nKCRoZSkKKyAgICAgICYmICgkIHskaGUtPmNvbnRlbnR9WzBdIGVxICJGb290bm90ZXMiKSkKKyAgICB7IGh0bWxfcmVwbGFjZV9ieV9pZ25vcmUoJGhlKTsKKyAgICAgICRwcm9jZXNzX2lmX2Zvb3Rub3Rlc19leHBlY3RfZGxfbmV4dCA9IDE7CisgICAgICByZXR1cm4gMDsgfQorCisgIGlmICgkcHJvY2Vzc19pZl9mb290bm90ZXNfZXhwZWN0X2RsX25leHQgJiYgKCRoZS0+dGFnKCkgZXEgImRsIikpCisgICAgeyBteSAkcmVmX2NvbnRlbnQgPSAkaGUtPmNvbnRlbnQoKTsKKyAgICAgIGlmIChkZWZpbmVkICRyZWZfY29udGVudCkKKwl7ICRwcm9jZXNzX2lmX2Zvb3Rub3Rlc19leHBlY3RfZGxfbmV4dCA9IDA7CisJICBteSBAY29udGVudCA9IEB7JHJlZl9jb250ZW50fTsKKwkgIGZvciAobXkgJGk9MDsgJGk8JCNjb250ZW50OyAkaSs9MikKKwkgICAgeyBteSAkaGVfZHQgPSAkY29udGVudFskaV07CisJICAgICAgbXkgJGhlX2RkID0gJGNvbnRlbnRbJGkrMV07CisJICAgICAgaWYgKCgkaGVfZHQtPnRhZyBuZSAiZHQiKSB8fCAoJGhlX2RkLT50YWcgbmUgImRkIikpCisJCXsgJGhlLT5kdW1wOworCQkgIGRpZSAiZXhwZWN0ZWQgPERUPiBhbmQgPEREPiBhdCBwb3NpdGlvbnMgJGkgYW5kICIsICRpKzE7IH0KKwkgICAgICBteSBAZHRfY29udGVudCA9IEB7JGhlX2R0LT5jb250ZW50KCl9OworCSAgICAgIGlmICgoc2NhbGFyKEBkdF9jb250ZW50KSAhPSAyKQorCQkgIHx8ICgkZHRfY29udGVudFswXS0+dGFnIG5lICJhIikKKwkJICB8fCAoJGR0X2NvbnRlbnRbMV0tPnRhZyBuZSAiYSIpKQorCQl7ICRoZV9kdC0+ZHVtcDsKKwkJICBkaWUgIkV4cGVjdGVkIDIgYW5jaG9ycyBhcyBjb250ZW50IG9mIDxEVD4iOyB9CisJICAgICAgbXkgKCRkdDFfbmFtZSwgJGR0MV9ocmVmLCAkZHQxX2NvbnRlbnQpID0gYW5jaG9yX2luZm8oJGR0X2NvbnRlbnRbMF0pOworCSAgICAgIG15ICgkZHQyX25hbWUsICRkdDJfaHJlZiwgJGR0Ml9jb250ZW50KSA9IGFuY2hvcl9pbmZvKCRkdF9jb250ZW50WzBdKTsKKwkgICAgICAjIHVudXNlZDogJGR0MV9ocmVmLCAkZHQxX2NvbnRlbnQsICRkdDJfaHJlZiwgJGR0Ml9jb250ZW50CisJICAgICAgaWYgKCRkdDFfbmFtZSBuZSAkZHQyX25hbWUpCisJCXsgJGhlX2R0LT5kdW1wOworCQkgIGRpZSAiRXhwZWN0ZWQgaWRlbnRpY2FsIG5hbWVzIGZvciBhbmNob3JzIjsgfQorCSAgICAgIGh0bWxfcmVwbGFjZV9ieV9pZ25vcmUoJGhlX2RkKTsKKwkgICAgICAkaGVfZGQtPnRhZygiZGl2Iik7ICMgaGFzIG5vIGVmZmVjdAorCSAgICAgICRmb290bm90ZXN7JGR0MV9uYW1lfSA9ICRoZV9kZDsgfQorCSAgaHRtbF9yZXBsYWNlX2J5X2lnbm9yZSgkaGUpOworCSAgcmV0dXJuIDA7IH0gfQorCisgIGlmICgkcHJvY2Vzc19pZl9mb290bm90ZXNfZXhwZWN0X2RsX25leHQpCisgICAgeyAkaGUtPmR1bXA7CisgICAgICBkaWUgIkV4cGVjdGVkIDxETD4gZm9yIGZvb3Rub3RlcyBuZXh0IjsgfQorCisgIHJldHVybiAxOworfQorCisKKworIyMgTWVyZ2UgdHdvIGFkamFjZW50IHBhcmFncmFwaHMgY29udGFpbmluZyA8REw+IGl0ZW1zLCBzdWNoIGFzOgorIyAgICAgPFA+CisjICAgICAgIDxETD4KKyMgICAgICAgICA8RFQ+CisjICAgICAgICAgICAuLi4KKyMgICAgICAgICA8REQ+CisjICAgICAgICAgICAuLi4KKyMgICAgIDxQPgorIyAgICAgICA8REw+CisjICAgICAgICAgPERUPgorIyAgICAgICAgICAgLi4uCisjICAgICAgICAgPEREPgorIyAgICAgICAgICAgLi4uCisKK3N1YiBtZXJnZV9kbCAoICQkJCApCit7IG15ICgkaGUsICRzdGFydGZsYWcpID0gKGNoZWNrX2FyZ3MoMywgQF8pKVswLDFdOyAjICBpZ25vcmUgZGVwdGggYXJndW1lbnQKKyAgaWYgKCEkc3RhcnRmbGFnKQorICAgIHsgcmV0dXJuOyB9CisKKyAgbXkgJHJlZl9jb250ZW50ID0gJGhlLT5jb250ZW50OworICBpZiAoIWRlZmluZWQgJHJlZl9jb250ZW50KQorICAgIHsgcmV0dXJuOyB9CisgIG15ICRpID0gMDsKKyAgd2hpbGUgKCRpIDwgc2NhbGFyKEB7JHJlZl9jb250ZW50fSktMSkKKyAgICB7IG15ICRwMSA9ICQgeyRyZWZfY29udGVudH1bJGldOworICAgICAgaWYgKChyZWYgJHAxKSAmJiAoJHAxLT50YWcgZXEgInAiKQorCSAgJiYgaGFzX3NpbmdsZV9jb250ZW50X3dpdGhfdGFnKCRwMSwgImRsIikpCisJeyBteSAkZGwxID0gJCB7JHAxLT5jb250ZW50fVswXTsKKwkgICMgSW4gdGhpcyBsb29wLCByaHMsIG5vdCBsaHMsIG9mIDwgY29tcGFyaXNvbiBjaGFuZ2VzLAorCSAgIyBiZWNhdXNlIHdlIGFyZSByZW1vdmluZyBlbGVtZW50cyBmcm9tIHRoZSBjb250ZW50IG9mICRoZS4KKwkgIHdoaWxlICgkaSA8IHNjYWxhcihAeyRyZWZfY29udGVudH0pLTEpCisJICAgIHsgbXkgJHAyID0gJCB7JHJlZl9jb250ZW50fVskaSsxXTsKKwkgICAgICBpZiAoISgocmVmICRwMikgJiYgKCRwMi0+dGFnIGVxICJwIikKKwkJICAgICYmIGhhc19zaW5nbGVfY29udGVudF93aXRoX3RhZygkcDIsICJkbCIpKSkKKwkJeyBsYXN0OyB9CisJICAgICAgIyBNZXJnZSB0aGVzZSB0d28gZWxlbWVudHMuCisJICAgICAgc3BsaWNlKEB7JHJlZl9jb250ZW50fSwgJGkrMSwgMSk7ICMgcmVtb3ZlICRwMgorCSAgICAgIG15ICRkbDIgPSAkIHskcDItPmNvbnRlbnR9WzBdOworCSAgICAgICRkbDEtPnB1c2hfY29udGVudChAeyRkbDItPmNvbnRlbnR9KTsgIyBwdXQgJGRsMidzIGNvbnRlbnQgaW4gJGRsMQorCSAgICB9CisJICAjIGV4dHJhIGluY3JlbWVudCBiZWNhdXNlIG5leHQgZWxlbWVudCBpc24ndCBhIGNhbmRpZGF0ZSBmb3IgJHAxCisJICAkaSsrOyB9CisgICAgICAkaSsrOyB9CisgIHJldHVybiAxOworfQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMgVGVzdGluZworIyMjCisKK3N1YiB0ZXN0ICggJCQgKQoreyBteSAoJGFjdGlvbiwgJGZpbGUpID0gY2hlY2tfYXJncygyLCBAXyk7CisKKyAgIyBHZW5lcmFsIHRlc3RpbmcKKyAgaWYgKCgkYWN0aW9uIGVxICJ2aWV3IikgfHwgKCRhY3Rpb24gZXEgIiIpKQorICAgIHsgIyAjICRmaWxlID0gIi9ob21lcy9nd3MvbWVybnN0L3d3dy9saW5rcy5odG1sIjsKKyAgICAgICMgIyAkZmlsZSA9ICIvaG9tZXMvZ3dzL21lcm5zdC93d3cvaW5kZXguaHRtbCI7CisgICAgICAjICMgJGZpbGUgPSAiL2hvbWVzL2Zpc2gvbWVybnN0L2phdmEvZ3VkL2RvYy9tYW51YWwuaHRtbCI7CisgICAgICAjICMgJGZpbGUgPSAiL3Byb2plY3RzL2NlY2lsL2NlY2lsL2RvYy9tYW51YWxzL3N0ZGxpYi1tYW4vc3RkbGliL3N0ZGxpYi5odG1sIjsKKyAgICAgICMgIyAkZmlsZSA9ICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9pbmRleC5odG1sIjsKKyAgICAgICMgJGZpbGUgPSAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL2NvbXBsZXhPYmplY3RzLmh0bWwiOworICAgICAgbXkgJHRyZWUgPSBmaWxlX3RvX3RyZWUoJGZpbGUpOworCisgICAgICAjIyBUZXN0aW5nCisgICAgICAjIHByaW50IFNUREVSUiAkdHJlZS0+YXNfSFRNTDsKKyAgICAgICR0cmVlLT5kdW1wKCk7CisKKyAgICAgICMgcHJpbnQgU1RERVJSICR0cmVlLT50YWcoKSwgIlxuIjsKKyAgICAgICMgcHJpbnQgU1RERVJSIEB7JHRyZWUtPmNvbnRlbnQoKX0sICJcbiI7CisgICAgICAjIAorICAgICAgIyBmb3IgKEB7ICR0cmVlLT5leHRyYWN0X2xpbmtzKHF3KGEgaW1nKSkgfSkgeworICAgICAgIyAgIG15ICgkbGluaywgJGxpbmtlbGVtKSA9IEAkXzsKKyAgICAgICMgICBwcmludCBTVERFUlIgIiRsaW5rICIsICRsaW5rZWxlbS0+YXNfSFRNTDsKKyAgICAgICMgICB9CisgICAgICAjIAorICAgICAgIyBwcmludCBTVERFUlIgQHskdHJlZS0+ZXh0cmFjdF9saW5rcygpfSwgIlxuIjsKKworICAgICAgIyBteSBAdG9wX2xldmVsX2VsdHMgPSBAeyR0cmVlLT5jb250ZW50KCl9OworCisgICAgICAjIGlmIHNjYWxhcihAeyR0cmVlLT5jb250ZW50KCl9KQorICAgICAgcmV0dXJuOworICAgIH0KKworICBlbHNpZiAoJGFjdGlvbiBlcSAicmF3IikKKyAgICB7IG15ICR0cmVlID0gbmV3IEhUTUw6OlRyZWVCdWlsZGVyOworICAgICAgJHRyZWUtPmlnbm9yZV91bmtub3duKDEpOworICAgICAgIyAkdHJlZS0+d2FybigxKTsKKyAgICAgICR0cmVlLT5wYXJzZV9maWxlKCRmaWxlKTsKKworICAgICAgJHRyZWUtPmR1bXAoKTsKKworICAgICAgIyBjbGVhbnVwX3BhcnNlX3RyZWUoJHRyZWUpOworICAgICAgIyAkdHJlZS0+ZHVtcCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAjIFRlc3QgZGVhbGluZyB3aXRoIGEgc2VjdGlvbi4KKyAgZWxzaWYgKCRhY3Rpb24gZXEgInNlY3Rpb24iKQorICAgIHsgIyBteSAkZmlsZTsKKyAgICAgICMgJGZpbGUgPSAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL2ludHJvLmh0bWwiOworICAgICAgIyAkZmlsZSA9ICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvaW5jbHVkZXMuaHRtbCI7CisgICAgICAjICRmaWxlID0gIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9jb21wbGV4T2JqZWN0cy5odG1sIjsKKyAgICAgIHByb2Nlc3Nfc2VjdGlvbl9maWxlKCRmaWxlLCAwLCAiVGl0bGUiKTsKKyAgICB9CisKKyAgIyBUZXN0IGRlYWxpbmcgd2l0aCBtYW55IHNlY3Rpb25zCisgIGVsc2lmICgwKQorICAgIHsgbXkgQGZpbGVzID0gKCIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvYWJvdXQuaHRtbCIsCisJCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvYWJzdHJhY3QuaHRtbCIsCisJCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvYXBpLmh0bWwiLAorCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL2NPYmplY3RzLmh0bWwiLAorCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL2NvbXBsZXhPYmplY3RzLmh0bWwiLAorCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL2NvbmNyZXRlLmh0bWwiLAorCQkgICAjICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvY29udGVudHMuaHRtbCIsCisJCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvY291bnRpbmdSZWZzLmh0bWwiLAorCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL2RlYnVnZ2luZy5odG1sIiwKKwkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9kaWN0T2JqZWN0cy5odG1sIiwKKwkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9lbWJlZGRpbmcuaHRtbCIsCisJCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvZXhjZXB0aW9uSGFuZGxpbmcuaHRtbCIsCisJCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvZXhjZXB0aW9ucy5odG1sIiwKKwkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9maWxlT2JqZWN0cy5odG1sIiwKKwkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9mbG9hdE9iamVjdHMuaHRtbCIsCisJCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvZnJvbnQuaHRtbCIsCisJCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvZnVuZGFtZW50YWwuaHRtbCIsCisJCSAgICMgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9nZW5pbmRleC5odG1sIiwKKwkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9pbXBvcnRpbmcuaHRtbCIsCisJCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvaW5jbHVkZXMuaHRtbCIsCisJCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvaW5kZXguaHRtbCIsCisJCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvaW5pdGlhbGl6YXRpb24uaHRtbCIsCisJCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvaW50T2JqZWN0cy5odG1sIiwKKwkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9pbnRyby5odG1sIiwKKwkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9saXN0T2JqZWN0cy5odG1sIiwKKwkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9sb25nT2JqZWN0cy5odG1sIiwKKwkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9tYXBPYmplY3RzLmh0bWwiLAorCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL21hcHBpbmcuaHRtbCIsCisJCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvbmV3VHlwZXMuaHRtbCIsCisJCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvbm9kZTI0Lmh0bWwiLAorCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL25vbmVPYmplY3QuaHRtbCIsCisJCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvbnVtYmVyLmh0bWwiLAorCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL251bWVyaWNPYmplY3RzLmh0bWwiLAorCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL29iamVjdC5odG1sIiwKKwkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9vYmplY3RzLmh0bWwiLAorCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL29zLmh0bWwiLAorCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL290aGVyT2JqZWN0cy5odG1sIiwKKwkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9wcm9jZXNzQ29udHJvbC5odG1sIiwKKwkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9yZWZjb3VudERldGFpbHMuaHRtbCIsCisJCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvcmVmY291bnRzLmh0bWwiLAorCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL3NlcXVlbmNlLmh0bWwiLAorCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL3NlcXVlbmNlT2JqZWN0cy5odG1sIiwKKwkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS9zdGFuZGFyZEV4Y2VwdGlvbnMuaHRtbCIsCisJCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvc3RyaW5nT2JqZWN0cy5odG1sIiwKKwkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS90aHJlYWRzLmh0bWwiLAorCQkgICAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL3R1cGxlT2JqZWN0cy5odG1sIiwKKwkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS90eXBlT2JqZWN0cy5odG1sIiwKKwkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS90eXBlcy5odG1sIiwKKwkJICAgIi9ob21lcy9maXNoL21lcm5zdC90bXAvcHl0aG9uLWRvYy9odG1sL2FwaS91dGlsaXRpZXMuaHRtbCIsCisJCSAgICIvaG9tZXMvZmlzaC9tZXJuc3QvdG1wL3B5dGhvbi1kb2MvaHRtbC9hcGkvdmVyeWhpZ2guaHRtbCIpOworICAgICAgZm9yIG15ICRmaWxlIChAZmlsZXMpCisJeyBwcmludCBTVERFUlIgIlxuIiwgIj0iIHggNzUsICJcbiIsICIkZmlsZTpcbiI7CisJICBwcm9jZXNzX3NlY3Rpb25fZmlsZSgkZmlsZSwgMCwgIlRpdGxlIik7CisJfQorICAgIH0KKworICAjIFRlc3QgZGVhbGluZyB3aXRoIGluZGV4LgorICBlbHNpZiAoJGFjdGlvbiBlcSAiaW5kZXgiKQorICAgIHsgIyBteSAkZmlsZTsKKyAgICAgICMgJGZpbGUgPSAiL2hvbWVzL2Zpc2gvbWVybnN0L3RtcC9weXRob24tZG9jL2h0bWwvYXBpL2dlbmluZGV4Lmh0bWwiOworCisgICAgICBwcm9jZXNzX2luZGV4X2ZpbGUoJGZpbGUsICJcQGNpbmRleCIpOworICAgICAgcHJpbnRfaW5kZXhfaW5mbygpOworICAgIH0KKworICBlbHNlCisgICAgeyBkaWUgIlVucmVjb2duaXplZCBhY3Rpb24gYCRhY3Rpb24nIjsgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIE1haW4gbG9vcAorIyMjCisKK3N1YiBwcm9jZXNzX2NvbnRlbnRzX2ZpbGUgKCAkICkKK3sgbXkgKCRmaWxlKSA9IGNoZWNrX2FyZ3MoMSwgQF8pOworCisgICMgY291bGQgYWxzbyB1c2UgRmlsZTo6QmFzZW5hbWUKKyAgbXkgJGluZm9fZmlsZSA9ICRmaWxlOworICAkaW5mb19maWxlID1+IHMvKFwvP2luZGV4KT9cLmh0bWwkLy87CisgIGlmICgkaW5mb19maWxlIGVxICIiKQorICAgIHsgY2hvbXAoJGluZm9fZmlsZSA9IGBwd2RgKTsgfQorICAkaW5mb19maWxlID1+IHMvXi4qXC8vLzsJIyBub3QgdGhlIG1vc3QgZWZmaWNpZW50IHdheSB0byByZW1vdmUgZGlycworCisgICRodG1sX2RpcmVjdG9yeSA9ICRmaWxlOworICAkaHRtbF9kaXJlY3RvcnkgPX4gcy8oXC98XilbXlwvXSskLyQxLzsKKworICBteSAkdGV4aV9maWxlID0gIiRpbmZvX2ZpbGUudGV4aSI7CisgIG9wZW4oVEVYSSwgIj4kdGV4aV9maWxlIik7CisKKyAgcHJpbnQgVEVYSSAiXFxpbnB1dCB0ZXhpbmZvICAgXEBjIC0qLXRleGluZm8tKi1cbiI7CisgIHByaW50IFRFWEkgIlxAYyAlKipzdGFydCBvZiBoZWFkZXJcbiI7CisgIHByaW50IFRFWEkgIlxAc2V0ZmlsZW5hbWUgJGluZm9fZmlsZVxuIjsKKworICAjIDIuIFN1bW1hcnkgRGVzY3JpcHRpb24gYW5kIENvcHlyaWdodAorICAjICAgICAgVGhlICJTdW1tYXJ5IERlc2NyaXB0aW9uIGFuZCBDb3B5cmlnaHQiIHNlZ21lbnQgZGVzY3JpYmVzIHRoZQorICAjICAgICAgZG9jdW1lbnQgYW5kIGNvbnRhaW5zIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBjb3B5aW5nIHBlcm1pc3Npb25zCisgICMgICAgICBmb3IgdGhlIEluZm8gZmlsZS4gIFRoZSBzZWdtZW50IG11c3QgYmUgZW5jbG9zZWQgYmV0d2VlbiBgQGlmaW5mbycKKyAgIyAgICAgIGFuZCBgQGVuZCBpZmluZm8nIGNvbW1hbmRzIHNvIHRoYXQgdGhlIGZvcm1hdHRlcnMgcGxhY2UgaXQgb25seSBpbgorICAjICAgICAgdGhlIEluZm8gZmlsZS4KKyAgIyAKKyAgIyBUaGUgc3VtbWFyeSBkZXNjcmlwdGlvbiBhbmQgY29weXJpZ2h0IHNlZ21lbnQgZG9lcyBub3QgYXBwZWFyIGluIHRoZQorICAjIHByaW50ZWQgZG9jdW1lbnQuCisgICMgCisgICMgICAgICBAaWZpbmZvCisgICMgICAgICBUaGlzIGlzIGEgc2hvcnQgZXhhbXBsZSBvZiBhIGNvbXBsZXRlIFRleGluZm8gZmlsZS4KKyAgIyAgICAgIAorICAjICAgICAgQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAjICAgICAgQGVuZCBpZmluZm8KKworCisgICMgMy4gVGl0bGUgYW5kIENvcHlyaWdodAorICAjICAgICAgVGhlICJUaXRsZSBhbmQgQ29weXJpZ2h0IiBzZWdtZW50IGNvbnRhaW5zIHRoZSB0aXRsZSBhbmQgY29weXJpZ2h0CisgICMgICAgICBwYWdlcyBhbmQgY29weWluZyBwZXJtaXNzaW9ucyBmb3IgdGhlIHByaW50ZWQgbWFudWFsLiAgVGhlIHNlZ21lbnQKKyAgIyAgICAgIG11c3QgYmUgZW5jbG9zZWQgYmV0d2VlbiBgQHRpdGxlcGFnZScgYW5kIGBAZW5kIHRpdGxlcGFnZScKKyAgIyAgICAgIGNvbW1hbmRzLiAgVGhlIHRpdGxlIGFuZCBjb3B5cmlnaHQgcGFnZSBhcHBlYXIgb25seSBpbiB0aGUgcHJpbnRlZAorICAjICAgICAgbWFudWFsLgorICAjIAorICAjIFRoZSB0aXRsZXBhZ2Ugc2VnbWVudCBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIEluZm8gZmlsZS4KKyAgIyAKKyAgIyAgICAgIEB0aXRsZXBhZ2UKKyAgIyAgICAgIEBzcCAxMAorICAjICAgICAgQGNvbW1lbnQgVGhlIHRpdGxlIGlzIHByaW50ZWQgaW4gYSBsYXJnZSBmb250LgorICAjICAgICAgQGNlbnRlciBAdGl0bGVmb250e1NhbXBsZSBUaXRsZX0KKyAgIyAgICAgIAorICAjICAgICAgQGMgVGhlIGZvbGxvd2luZyB0d28gY29tbWFuZHMgc3RhcnQgdGhlIGNvcHlyaWdodCBwYWdlLgorICAjICAgICAgQHBhZ2UKKyAgIyAgICAgIEB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKKyAgIyAgICAgIENvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIyAgICAgIEBlbmQgdGl0bGVwYWdlCisKKworICAjIDQuIGBUb3AnIE5vZGUgYW5kIE1hc3RlciBNZW51CisgICMgICAgICBUaGUgIk1hc3RlciBNZW51IiBjb250YWlucyBhIGNvbXBsZXRlIG1lbnUgb2YgYWxsIHRoZSBub2RlcyBpbiB0aGUKKyAgIyAgICAgIHdob2xlIEluZm8gZmlsZS4gIEl0IGFwcGVhcnMgb25seSBpbiB0aGUgSW5mbyBmaWxlLCBpbiB0aGUgYFRvcCcKKyAgIyAgICAgIG5vZGUuCisgICMgCisgICMgVGhlIGBUb3AnIG5vZGUgY29udGFpbnMgdGhlIG1hc3RlciBtZW51IGZvciB0aGUgSW5mbyBmaWxlLiAgU2luY2UgYQorICAjIHByaW50ZWQgbWFudWFsIHVzZXMgYSB0YWJsZSBvZiBjb250ZW50cyByYXRoZXIgdGhhbiBhIG1lbnUsIHRoZSBtYXN0ZXIKKyAgIyBtZW51IGFwcGVhcnMgb25seSBpbiB0aGUgSW5mbyBmaWxlLgorICAjIAorICAjICAgICAgQG5vZGUgICAgVG9wLCAgICAgICBGaXJzdCBDaGFwdGVyLCAsICAgICAgICAgKGRpcikKKyAgIyAgICAgIEBjb21tZW50IG5vZGUtbmFtZSwgbmV4dCwgICAgICAgICAgcHJldmlvdXMsIHVwCisgICMgCisgICMgICAgICBAbWVudQorICAjICAgICAgKiBGaXJzdCBDaGFwdGVyOjogICAgVGhlIGZpcnN0IGNoYXB0ZXIgaXMgdGhlCisgICMgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IGNoYXB0ZXIgaW4gdGhpcyBzYW1wbGUuCisgICMgICAgICAqIENvbmNlcHQgSW5kZXg6OiAgICBUaGlzIGluZGV4IGhhcyB0d28gZW50cmllcy4KKyAgIyAgICAgIEBlbmQgbWVudQorCisKKworICAkY3VycmVudF9yZWZfdGRmID0gWyAiVG9wIiwgMCwgJEFSR1ZbMF0gXTsKKyAgcHJvY2Vzc19zZWN0aW9uX2ZpbGUoJGZpbGUsIDAsICJUb3AiKTsKKyAgd2hpbGUgKHNjYWxhcihAY29udGVudHNfbGlzdCkpCisgIHsgJGN1cnJlbnRfcmVmX3RkZiA9IHNoaWZ0IEBjb250ZW50c19saXN0OworICAgIHByb2Nlc3Nfc2VjdGlvbl9maWxlKCQgeyRjdXJyZW50X3JlZl90ZGZ9WzJdLCAkIHskY3VycmVudF9yZWZfdGRmfVsxXSwgJCB7JGN1cnJlbnRfcmVmX3RkZn1bMF0pOworICB9CisKKyAgcHJpbnQgVEVYSSAiXG4iOworICBmb3IgbXkgJGluZGV4dGl0bGUgKEBpbmRleF90aXRsZXMpCisgICAgeyBwcmludCBURVhJICJcQG5vZGUgJGluZGV4dGl0bGVcbiI7CisgICAgICBwcmludCBURVhJICJcQHVubnVtYmVyZWQgJGluZGV4dGl0bGVcbiI7CisgICAgICBwcmludCBURVhJICJcQHByaW50aW5kZXggJCB7JGluZGV4X2luZm97JGluZGV4dGl0bGV9fVsxXVxuIjsKKyAgICAgIHByaW50IFRFWEkgIlxuIjsgfQorCisgIHByaW50IFRFWEkgIlxAY29udGVudHNcbiI7CisgIHByaW50IFRFWEkgIlxAYnllXG4iOworICBjbG9zZShURVhJKTsKK30KKworIyBUaGlzIG5lZWRzIHRvIGJlIGxhc3Qgc28gZ2xvYmFsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9ucyBhcmUgcmVhY2hlZC4KKworaWYgKHNjYWxhcihAQVJHVikgPT0gMCkKK3sgZGllICJObyBhcmd1bWVudHMgc3VwcGxpZWQgdG8gaHRtbDJ0ZXhpLnBsIjsgfQorCitpZiAoJEFSR1ZbMF0gZXEgIi10ZXN0IikKK3sgbXkgQHRlc3RfYXJncyA9IEBBUkdWWzEuLiQjQVJHVl07CisgIGlmIChzY2FsYXIoQHRlc3RfYXJncykgPT0gMCkKKyAgICB7IHRlc3QoIiIsICJpbmRleC5odG1sIik7IH0KKyAgZWxzaWYgKHNjYWxhcihAdGVzdF9hcmdzKSA9PSAxKQorICAgIHsgdGVzdCgiIiwgJHRlc3RfYXJnc1swXSk7IH0KKyAgZWxzaWYgKHNjYWxhcihAdGVzdF9hcmdzKSA9PSAyKQorICAgIHsgdGVzdCgkdGVzdF9hcmdzWzBdLCAkdGVzdF9hcmdzWzFdKTsgfQorICBlbHNlCisgICAgeyBkaWUgIlRvbyBtYW55IHRlc3QgYXJndW1lbnRzIHBhc3NlZCB0byBodG1sMnRleGk6ICIsIGpvaW4oIiAiLCBAQVJHVik7IH0KKyAgZXhpdCgpOworfQorCitpZiAoc2NhbGFyKEBBUkdWKSAhPSAxKQoreyBkaWUgIlBhc3Mgb25lIGFyZ3VtZW50LCB0aGUgbWFpbi9jb250ZW50cyBwYWdlIjsgfQorCitwcm9jZXNzX2NvbnRlbnRzX2ZpbGUoJEFSR1ZbMF0pOworCisjIGVuZCBvZiBodG1sMnRleGkucGwKZGlmZiAtLWdpdCBhL2RvYy90b29scy9pbmRmaXgucHkgYi9kb2MvdG9vbHMvaW5kZml4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM4Zjk1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvaW5kZml4LnB5CkBAIC0wLDAgKzEsMTAxIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIkNvbWJpbmUgc2ltaWxhciBpbmRleCBlbnRyaWVzIGludG8gYW4gZW50cnkgYW5kIHN1YmVudHJpZXMuCisKK0ZvciBleGFtcGxlOgorCisgICAgXGl0ZW0ge2Zvb2Jhcn0gKGluIG1vZHVsZSBmbG90eiksIDIzCisgICAgXGl0ZW0ge2Zvb2Jhcn0gKGluIG1vZHVsZSB3aGFja2l0KSwgNDMyMworCitiZWNvbWVzCisKKyAgICBcaXRlbSB7Zm9vYmFyfQorICAgICAgXHN1Yml0ZW0gaW4gbW9kdWxlIGZsb3R6LCAyMworICAgICAgXHN1Yml0ZW0gaW4gbW9kdWxlIHdoYWNraXQsIDQzMjMKKworTm90ZSB0aGF0IGFuIGl0ZW0gd2hpY2ggbWF0Y2hlcyB0aGUgZm9ybWF0IG9mIGEgY29sbGFwc2FibGUgaXRlbSBidXQgd2hpY2gKK2lzbid0IHBhcnQgb2YgYSBncm91cCBvZiBzaW1pbGFyIGl0ZW1zIGlzIG5vdCBtb2RpZmllZC4KKyIiIgorX192ZXJzaW9uX18gPSAnJFJldmlzaW9uOiAxLjEuMS4xICQnCisKK2ltcG9ydCByZQoraW1wb3J0IHN0cmluZworaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgc3lzCisKKworZGVmIGNtcF9lbnRyaWVzKGUxLCBlMiwgbG93ZXI9c3RyaW5nLmxvd2VyKToKKyAgICByZXR1cm4gY21wKGxvd2VyKGUxWzFdKSwgbG93ZXIoZTJbMV0pKSBvciBjbXAoZTEsIGUyKQorCisKK2RlZiBkdW1wX2VudHJpZXMod3JpdGUsIGVudHJpZXMpOgorICAgIGlmIGxlbihlbnRyaWVzKSA9PSAxOgorICAgICAgICB3cml0ZSgiICBcXGl0ZW0gJXMgKCVzKSVzXG4iICUgZW50cmllc1swXSkKKyAgICAgICAgcmV0dXJuCisgICAgd3JpdGUoIiAgXGl0ZW0gJXNcbiIgJSBlbnRyaWVzWzBdWzBdKQorICAgICMgbm93IHNvcnQgdGhlc2UgaW4gYSBjYXNlIGluc2Vuc2l0aXZlIG1hbm5lcjoKKyAgICBpZiBsZW4oZW50cmllcykgPiAwOgorICAgICAgICBlbnRyaWVzLnNvcnQoY21wX2VudHJpZXMpCisgICAgZm9yIHh4eCwgc3ViaXRlbSwgcGFnZXMgaW4gZW50cmllczoKKyAgICAgICAgd3JpdGUoIiAgICBcc3ViaXRlbSAlcyVzXG4iICUgKHN1Yml0ZW0sIHBhZ2VzKSkKKworCiticmVha2FibGVfcmUgPSByZS5jb21waWxlKAorICAgIHIiICBcXGl0ZW0gKC4qKSBbKF0oLiopWyldKCg/Oig/OiwgXGQrKXwoPzosIFxcW2Etel0qXHtcZCtcfSkpKykiKQorCisKK2RlZiBwcm9jZXNzKGlmbiwgb2ZuPU5vbmUpOgorICAgIGlmIGlmbiA9PSAiLSI6CisgICAgICAgIGlmcCA9IHN5cy5zdGRpbgorICAgIGVsc2U6CisgICAgICAgIGlmcCA9IG9wZW4oaWZuKQorICAgIGlmIG9mbiBpcyBOb25lOgorICAgICAgICBvZm4gPSBpZm4KKyAgICBvZnAgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgZW50cmllcyA9IFtdCisgICAgbWF0Y2ggPSBicmVha2FibGVfcmUubWF0Y2gKKyAgICB3cml0ZSA9IG9mcC53cml0ZQorICAgIHdoaWxlIDE6CisgICAgICAgIGxpbmUgPSBpZnAucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIG0gPSBtYXRjaChsaW5lKQorICAgICAgICBpZiBtOgorICAgICAgICAgICAgZW50cnkgPSBtLmdyb3VwKDEsIDIsIDMpCisgICAgICAgICAgICBpZiBlbnRyaWVzIGFuZCBlbnRyaWVzWy0xXVswXSAhPSBlbnRyeVswXToKKyAgICAgICAgICAgICAgICBkdW1wX2VudHJpZXMod3JpdGUsIGVudHJpZXMpCisgICAgICAgICAgICAgICAgZW50cmllcyA9IFtdCisgICAgICAgICAgICBlbnRyaWVzLmFwcGVuZChlbnRyeSkKKyAgICAgICAgZWxpZiBlbnRyaWVzOgorICAgICAgICAgICAgZHVtcF9lbnRyaWVzKHdyaXRlLCBlbnRyaWVzKQorICAgICAgICAgICAgZW50cmllcyA9IFtdCisgICAgICAgICAgICB3cml0ZShsaW5lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd3JpdGUobGluZSkKKyAgICBkZWwgd3JpdGUKKyAgICBkZWwgbWF0Y2gKKyAgICBpZnAuY2xvc2UoKQorICAgIGRhdGEgPSBvZnAuZ2V0dmFsdWUoKQorICAgIG9mcC5jbG9zZSgpCisgICAgaWYgb2ZuID09ICItIjoKKyAgICAgICAgb2ZwID0gc3lzLnN0ZG91dAorICAgIGVsc2U6CisgICAgICAgIG9mcCA9IG9wZW4ob2ZuLCAidyIpCisgICAgb2ZwLndyaXRlKGRhdGEpCisgICAgb2ZwLmNsb3NlKCkKKworCitkZWYgbWFpbigpOgorICAgIGltcG9ydCBnZXRvcHQKKyAgICBvdXRmaWxlID0gTm9uZQorICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgIm86IikKKyAgICBmb3Igb3B0LCB2YWwgaW4gb3B0czoKKyAgICAgICAgaWYgb3B0IGluICgiLW8iLCAiLS1vdXRwdXQiKToKKyAgICAgICAgICAgIG91dGZpbGUgPSB2YWwKKyAgICBmaWxlbmFtZSA9IGFyZ3NbMF0KKyAgICBvdXRmaWxlID0gb3V0ZmlsZSBvciBmaWxlbmFtZQorICAgIHByb2Nlc3MoZmlsZW5hbWUsIG91dGZpbGUpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2RvYy90b29scy9pbmZvL01ha2VmaWxlIGIvZG9jL3Rvb2xzL2luZm8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRkNjA1NwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy9pbmZvL01ha2VmaWxlCkBAIC0wLDAgKzEsNzMgQEAKKyMgR2VuZXJhdGUgdGhlIFB5dGhvbiAiaW5mbyIgZG9jdW1lbnRhdGlvbi4KKworVE9QRElSPS4uCitUT09MU0RJUj0kKFRPUERJUikvdG9vbHMKK0hUTUxESVI9JChUT1BESVIpL2h0bWwKKworTUtJTkZPPSQoVE9PTFNESVIpL21raW5mbworU0NSSVBUUz0kKFRPT0xTRElSKS9odG1sMnRleGkucGwgJChUT09MU0RJUikvY2hlY2thcmdzLnBtICQoVE9PTFNESVIpL21raW5mbyBcCisJJChUT09MU0RJUikvZml4aW5mby5lbAorCithbGw6CXB5dGhvbi1hcGkuaW5mbyBweXRob24tZXh0LmluZm8gcHl0aG9uLWxpYi5pbmZvIFwKKwlweXRob24tcmVmLmluZm8gcHl0aG9uLXR1dC5pbmZvIFwKKwlweXRob24tZGlzdC5pbmZvIHB5dGhvbi1pbnN0LmluZm8KKworCitweXRob24tYXBpLmluZm86CSQoSFRNTERJUikvYXBpL2FwaS5odG1sICQoU0NSSVBUUykKKwkkKE1LSU5GTykgJDwKKworcHl0aG9uLWV4dC5pbmZvOgkkKEhUTUxESVIpL2V4dC9leHQuaHRtbCAkKFNDUklQVFMpCisJJChNS0lORk8pICQ8CisKK3B5dGhvbi1saWIuaW5mbzoJJChIVE1MRElSKS9saWIvbGliLmh0bWwgJChTQ1JJUFRTKQorCSQoTUtJTkZPKSAkPAorCisjIE5vdCBidWlsdCBieSBkZWZhdWx0OyB0aGUgY29udmVyc2lvbiBkb2Vzbid0IHJlYWxseSBoYW5kbGUgaXQgd2VsbC4KK3B5dGhvbi1tYWMuaW5mbzoJJChIVE1MRElSKS9tYWMvbWFjLmh0bWwgJChTQ1JJUFRTKQorCSQoTUtJTkZPKSAkPAorCitweXRob24tcmVmLmluZm86CSQoSFRNTERJUikvcmVmL3JlZi5odG1sICQoU0NSSVBUUykKKwkkKE1LSU5GTykgJDwKKworcHl0aG9uLXR1dC5pbmZvOgkkKEhUTUxESVIpL3R1dC90dXQuaHRtbCAkKFNDUklQVFMpCisJJChNS0lORk8pICQ8CisKK3B5dGhvbi1kaXN0LmluZm86CSQoSFRNTERJUikvZGlzdC9kaXN0Lmh0bWwgJChTQ1JJUFRTKQorCSQoTUtJTkZPKSAkPAorCitweXRob24taW5zdC5pbmZvOgkkKEhUTUxESVIpL2luc3QvaW5zdC5odG1sICQoU0NSSVBUUykKKwkkKE1LSU5GTykgJDwKKworY2xlYW46CisJcm0gLWYgKi50ZXhpfiAqLnRleGkKKworY2xvYmJlcjogY2xlYW4KKwlybSAtZiAqLnRleGkgcHl0aG9uLSouaW5mbyBweXRob24tKi5pbmZvLVswLTldKgorCisKKyMgVGhpcyBtYWtlcyBzdXJlIHdlIGNhbiBidWlsZCBpbmZvIGZpbGVzIGZyb20gYSAiY2xlYW4iIHRyZWUsCisjIGluIGNhc2Ugd2UgaGF2ZW4ndCBhbHJlYWR5IGJ1aWx0IHRoZSBIVE1MOgorCiskKEhUTUxESVIpL2FwaS9hcGkuaHRtbDoKKwkoY2QgJChIVE1MRElSKTsgJChNQUtFKSBhcGkpCisKKyQoSFRNTERJUikvZXh0L2V4dC5odG1sOgorCShjZCAkKEhUTUxESVIpOyAkKE1BS0UpIGV4dCkKKworJChIVE1MRElSKS9saWIvbGliLmh0bWw6CisJKGNkICQoSFRNTERJUik7ICQoTUFLRSkgbGliKQorCiskKEhUTUxESVIpL21hYy9tYWMuaHRtbDoKKwkoY2QgJChIVE1MRElSKTsgJChNQUtFKSBtYWMpCisKKyQoSFRNTERJUikvcmVmL3JlZi5odG1sOgorCShjZCAkKEhUTUxESVIpOyAkKE1BS0UpIHJlZikKKworJChIVE1MRElSKS90dXQvdHV0Lmh0bWw6CisJKGNkICQoSFRNTERJUik7ICQoTUFLRSkgdHV0KQorCiskKEhUTUxESVIpL2Rpc3QvZGlzdC5odG1sOgorCShjZCAkKEhUTUxESVIpOyAkKE1BS0UpIGRpc3QpCisKKyQoSFRNTERJUikvaW5zdC9pbnN0Lmh0bWw6CisJKGNkICQoSFRNTERJUik7ICQoTUFLRSkgaW5zdCkKZGlmZiAtLWdpdCBhL2RvYy90b29scy9pbmZvL1JFQURNRSBiL2RvYy90b29scy9pbmZvL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTQ5YTk5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL2luZm8vUkVBRE1FCkBAIC0wLDAgKzEsMjEgQEAKK1RoaXMgYXJjaGl2ZSBjb250YWlucyB0aGUgc3RhbmRhcmQgUHl0aG9uIGRvY3VtZW50YXRpb24gaW4gR05VIGluZm8KK2Zvcm1hdC4gIEZpdmUgbWFudWFscyBhcmUgaW5jbHVkZWQ6CisKKyAgICBweXRob24tcmVmLmluZm8qCVB5dGhvbiBSZWZlcmVuY2UgTWFudWFsCisgICAgcHl0aG9uLW1hYy5pbmZvKglQeXRob24gTWFjaW50b3NoIE1vZHVsZXMKKyAgICBweXRob24tbGliLmluZm8qCVB5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZQorICAgIHB5dGhvbi1leHQuaW5mbyoJRXh0ZW5kaW5nIGFuZCBFbWJlZGRpbmcgdGhlIFB5dGhvbiBJbnRlcnByZXRlcgorICAgIHB5dGhvbi1hcGkuaW5mbyoJUHl0aG9uL0MgQVBJIFJlZmVyZW5jZQorICAgIHB5dGhvbi10dXQuaW5mbyoJUHl0aG9uIFR1dG9yaWFsCisKK1RoZSBmaWxlIHB5dGhvbi5kaXIgaXMgYSBmcmFnbWVudCBvZiBhICJkaXIiIGZpbGUgdGhhdCBjYW4gYmUgdXNlZCB0bworaW5jb3Jwb3JhdGUgdGhlc2UgZG9jdW1lbnRzIGludG8gYW4gZXhpc3RpbmcgR05VIGluZm8gaW5zdGFsbGF0aW9uOgoraW5zZXJ0IHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgaW50byB0aGUgImRpciIgb3IgImxvY2FsZGlyIiBmaWxlIGF0CithbiBhcHByb3ByaWF0ZSBwb2ludCBhbmQgY29weSB0aGUgcHl0aG9uLSouaW5mbyogZmlsZXMgdG8gdGhlIHNhbWUKK2RpcmVjdG9yeS4KKworVGhhbmtzIGdvIHRvIE1pbGFuIFphbWF6YWwgPHBkbUBmcmVlc29mdC5jej4gZm9yIHByb3ZpZGluZyB0aGlzCitjb252ZXJzaW9uIHRvIHRoZSBpbmZvIGZvcm1hdC4KKworUXVlc3Rpb25zIGFuZCBjb21tZW50cyBvbiB0aGVzZSBkb2N1bWVudHMgc2hvdWxkIGJlIGRpcmVjdGVkIHRvCitweXRob24tZG9jc0BweXRob24ub3JnLgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2luZm8vcHl0aG9uLmRpciBiL2RvYy90b29scy9pbmZvL3B5dGhvbi5kaXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBlM2UzYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy9pbmZvL3B5dGhvbi5kaXIKQEAgLTAsMCArMSw5IEBACisKK1B5dGhvbiBTdGFuZGFyZCBEb2N1bWVudGF0aW9uCisKKyogUHl0aG9uIExpYnJhcnk6IChweXRob24tbGliKS4JCVB5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZQorKiBQeXRob24gTWFjIE1vZHVsZXM6IChweXRob24tbWFjKS4JUHl0aG9uIE1hY2ludG9zaCBNb2R1bGVzCisqIFB5dGhvbiBSZWZlcmVuY2U6IChweXRob24tcmVmKS4JUHl0aG9uIFJlZmVyZW5jZSBNYW51YWwKKyogUHl0aG9uIEFQSTogKHB5dGhvbi1hcGkpLgkJUHl0aG9uL0MgQVBJIFJlZmVyZW5jZSBNYW51YWwKKyogUHl0aG9uIEV4dGVuZGluZzogKHB5dGhvbi1leHQpLglFeHRlbmRpbmcgJiBFbWJlZGRpbmcgUHl0aG9uCisqIFB5dGhvbiBUdXRvcmlhbDogKHB5dGhvbi10dXQpLglQeXRob24gVHV0b3JpYWwKZGlmZiAtLWdpdCBhL2RvYy90b29scy9rZXl3b3Jkcy5weSBiL2RvYy90b29scy9rZXl3b3Jkcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGEzNTJhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL2tleXdvcmRzLnB5CkBAIC0wLDAgKzEsMjAgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworIyBUaGlzIFB5dGhvbiBwcm9ncmFtIHNvcnRzIGFuZCByZWZvcm1hdHMgdGhlIHRhYmxlIG9mIGtleXdvcmRzIGluIHJlZjIudGV4CisKK2ltcG9ydCBzdHJpbmcKK2wgPSBbXQordHJ5OgorCXdoaWxlIDE6CisJCWwgPSBsICsgc3RyaW5nLnNwbGl0KHJhd19pbnB1dCgpKQorZXhjZXB0IEVPRkVycm9yOgorCXBhc3MKK2wuc29ydCgpCitmb3IgeCBpbiBsWzpdOgorCXdoaWxlIGwuY291bnQoeCkgPiAxOiBsLnJlbW92ZSh4KQorbmNvbHMgPSA1Citucm93cyA9IChsZW4obCkrbmNvbHMtMSkvbmNvbHMKK2ZvciBpIGluIHJhbmdlKG5yb3dzKToKKwlmb3IgaiBpbiByYW5nZShpLCBsZW4obCksIG5yb3dzKToKKwkJcHJpbnQgc3RyaW5nLmxqdXN0KGxbal0sIDEwKSwKKwlwcmludApkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL2xpc3Rtb2R1bGVzIGIvZG9jL3Rvb2xzL2xpc3Rtb2R1bGVzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdhYzkwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvbGlzdG1vZHVsZXMKQEAgLTAsMCArMSwxODMgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyMgIC0qLSBQeXRob24gLSotCisjCisjICBUaGlzIHNjcmlwdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB1bmRvY3VtZW50ZWQgbW9kdWxlcyBpbiB0aGUgUHl0aG9uCisjICBzdGFuZGFyZCBsaWJyYXJ5LiAgVXNlIGl0IGxpa2UgdGhpczoKKyMKKyMgIC4uLi9Eb2MvdG9vbHMvbGlzdG1vZHVsZXMgLS1pZ25vcmUtZnJvbSAuLi4vRG9jL3BhcGVyLTxwYXBlcj4vbW9kbGliLmlkeAorCisiIiIlKHByb2dyYW0pcyAtIGxpc3QgbW9kdWxlcyBpbiB0aGUgUHl0aG9uIHN0YW5kYXJkIGxpYnJhcnkKKworLWEsIC0tYW5ub3RhdGUJICBBbm5vdGF0ZSB0aGUgbW9kdWxlIG5hbWVzIHdpdGggdGhlIHN1YmRpcmVjdG9yeSB0aGV5CisgICAgICAgICAgICAgICAgICBsaXZlIGluCistYywgLS1jYXRlZ29yaXplICBHcm91cCB0aGUgbW9kdWxlcyBieSBzdWJkaXJlY3RvcnkKKy1pIDxmaWxlPiwKKworLS1pZ25vcmUtZnJvbSA8ZmlsZT4JSWdub3JlIHRoZSBtb2R1bGVzIGxpc3RlZCBpbiA8ZmlsZT4uICA8ZmlsZT4gbWF5CisgICAgICAgICAgICAgICAgICBjb250YWluIGEgbGlzdCBvZiBtb2R1bGUgbmFtZXMgb3IgYSBtb2R1bGUgaW5kZXggZmlsZQorICAgICAgICAgICAgICAgICAgYXMgcHJvZHVjZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbgorICAgICAgICAgICAgICAgICAgKC5pZHggb3IgLmh0bWwgZmxhdm9yKS4KKworSWYgbmVpdGhlciAtYSBub3IgLWMgYXJlIGdpdmVuLCB0aGUgbW9kdWxlcyBhcmUgbGlzdGVkIGluIGFscGhhYmV0aWNhbAorb3JkZXIuCisKK05vdGUgdGhhdCAtYSBhbmQgLWMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KKworTGltaXRhdGlvbjogTW9kdWxlcyBsb2FkYWJsZSBhcyBzaGFyZWQgb2JqZWN0cyBtYXkgbm90IGJlIGxpc3RlZCwKK3Rob3VnaCB0aGlzIHNjcmlwdCBhdHRlbXB0cyB0byBsb2NhdGUgc3VjaCBtb2R1bGVzLgorCisiIiIKKworX192ZXJzaW9uX18gPSAnJFJldmlzaW9uOiAxLjEuMS4xICQnCisKK2ltcG9ydCBnZXRvcHQKK2ltcG9ydCBnbG9iCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN0cmluZworaW1wb3J0IHN5cworCisKK1JFTU9WRV9ESVJTID0gWyJkb3MtOHgzIiwgImVuY29kaW5ncyIsICJkaXN0dXRpbHMiLAorICAgICAgICAgICAgICAgImxpYi1vbGQiLCAibGliLXN0ZHdpbiIsICJ0ZXN0Il0KKworCitkZWYgbWFpbigpOgorICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KKyAgICBhbm5vdGF0ZSA9IDAKKyAgICBidWlsdGluID0gMAorICAgIGNhdGVnb3JpemUgPSAwCisgICAgaWdub3JlX2RpY3QgPSB7fQorICAgIGlnbm9yZSA9IGlnbm9yZV9kaWN0Lmhhc19rZXkKKyAgICB0cnk6CisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KAorICAgICAgICAgICAgYXJncywgImFiY2hpOiIsCisgICAgICAgICAgICBbImFubm90YXRlIiwgImJ1aWx0LWluIiwgImNhdGVnb3JpemUiLCAiaGVscCIsICJpZ25vcmUtZnJvbT0iXSkKKyAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6CisgICAgICAgIHN5cy5zdGRvdXQgPSBzeXMuc3RkZXJyCisgICAgICAgIHByaW50IG1zZworICAgICAgICBwcmludAorICAgICAgICB1c2FnZSgpCisgICAgICAgIHN5cy5leGl0KDIpCisgICAgZm9yIG9wdCwgYXJnIGluIG9wdHM6CisgICAgICAgIGlmIG9wdCBpbiAoIi1hIiwgIi0tYW5ub3RhdGUiKToKKyAgICAgICAgICAgIGFubm90YXRlID0gMQorICAgICAgICBlbGlmIG9wdCBpbiAoIi1iIiwgIi0tYnVpbHQtaW4iKToKKyAgICAgICAgICAgIGJ1aWx0aW4gPSAxCisgICAgICAgIGVsaWYgb3B0IGluICgiLWMiLCAiLS1jYXRlZ29yaXplIik6CisgICAgICAgICAgICBjYXRlZ29yaXplID0gMQorICAgICAgICBlbGlmIG9wdCBpbiAoIi1oIiwgIi0taGVscCIpOgorICAgICAgICAgICAgdXNhZ2UoKQorICAgICAgICAgICAgc3lzLmV4aXQoKQorICAgICAgICBlbGlmIG9wdCBpbiAoIi1pIiwgIi0taWdub3JlLWZyb20iKToKKyAgICAgICAgICAgIGRhdGEgPSBvcGVuKGFyZykucmVhZCgpCisgICAgICAgICAgICBpZiBkYXRhWzoxXSA9PSAiXFwiOgorICAgICAgICAgICAgICAgIGlnbm9yZV9mcm9tX2lkeChkYXRhLCBpZ25vcmVfZGljdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWdub3JlX2Zyb21fbW9kdWxlbGlzdChkYXRhLCBpZ25vcmVfZGljdCkKKyAgICBpZiBhcmdzIG9yIChhbm5vdGF0ZSBhbmQgY2F0ZWdvcml6ZSk6CisgICAgICAgIHVzYWdlKCkKKyAgICAgICAgc3lzLmV4aXQoMikKKyAgICAjCisgICAgIyBQb3B1bGF0ZSB0aGUgZGF0YWJhc2U6CisgICAgIworICAgIHNyY2RpciA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKAorICAgICAgICBvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pLCBvcy5wYXJkaXIsIG9zLnBhcmRpcikpCisgICAgb3MuY2hkaXIoc3JjZGlyKQorICAgIG1vZHVsZXNfYnlfbmFtZSA9IHt9CisgICAgbW9kdWxlc19ieV9kaXIgPSB7fQorICAgIGlmIGJ1aWx0aW46CisgICAgICAgIGwgPSBbXQorICAgICAgICBtb2R1bGVzX2J5X2RpclsiPGJ1aWx0aW4+Il0gPSBsCisgICAgICAgIGZvciBuYW1lIGluIHN5cy5idWlsdGluX21vZHVsZV9uYW1lczoKKyAgICAgICAgICAgIGlmIG5vdCBpZ25vcmUobmFtZSk6CisgICAgICAgICAgICAgICAgbW9kdWxlc19ieV9uYW1lW25hbWVdID0gIjxidWlsdC1pbj4iCisgICAgICAgICAgICAgICAgbC5hcHBlbmQobmFtZSkKKyAgICByeCA9IHJlLmNvbXBpbGUoIkxpYi9wbGF0LVthLXpBLVowLTldKi8iKQorICAgIGZwID0gb3MucG9wZW4oImZpbmQgTGliIC1uYW1lIFwqLnB5IC1wcmludCIsICJyIikKKyAgICB3aGlsZSAxOgorICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIG0gPSByeC5tYXRjaChsaW5lKQorICAgICAgICBpZiBtOgorICAgICAgICAgICAgbGluZSA9ICJMaWIvcGxhdC0qLyIgKyBsaW5lW20uZW5kKCk6XQorICAgICAgICBsaW5lID0gbGluZVs0Oi00XSAgICAgICAgICAgICAgICAjIHN0cmlwIG9mZiAnTGliLycgYW5kICcucHlcbicKKyAgICAgICAgZGlyLCBuYW1lID0gb3MucGF0aC5zcGxpdChsaW5lKQorICAgICAgICBkaXIgPSBkaXIgb3IgIjxzdGFuZGFyZD4iCisgICAgICAgIGlmIGlnbm9yZShuYW1lKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIGRpciBub3QgaW4gUkVNT1ZFX0RJUlM6CisgICAgICAgICAgICBtb2R1bGVzX2J5X25hbWVbbmFtZV0gPSBkaXIKKyAgICAgICAgICAgIGwgPSBtb2R1bGVzX2J5X2Rpci5nZXQoZGlyLCBbXSkKKyAgICAgICAgICAgIG1vZHVsZXNfYnlfZGlyW2Rpcl0gPSBsCisgICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBsOgorICAgICAgICAgICAgICAgIGwuYXBwZW5kKG5hbWUpCisgICAgIyBsb2FkIHVwIGV4dGVuc2lvbiBtb2R1bGVzOgorICAgIHB3ZCA9IG9zLmdldGN3ZCgpCisgICAgdHJ5OgorICAgICAgICBvcy5jaGRpcigiTW9kdWxlcyIpCisgICAgICAgIGRpciA9ICI8ZXh0ZW5zaW9uPiIKKyAgICAgICAgZm9yIGxpbmUgaW4gZ2xvYi5nbG9iKCIqbW9kdWxlLmMiKToKKyAgICAgICAgICAgIG5hbWUgPSBsaW5lWzotOF0KKyAgICAgICAgICAgIGlmIGlnbm9yZShuYW1lKSBvciBtb2R1bGVzX2J5X25hbWUuaGFzX2tleShuYW1lKSBvciBuYW1lID09ICJ4eCI6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG1vZHVsZXNfYnlfbmFtZVtuYW1lXSA9IGRpcgorICAgICAgICAgICAgbCA9IG1vZHVsZXNfYnlfZGlyLmdldChkaXIsIFtdKQorICAgICAgICAgICAgbW9kdWxlc19ieV9kaXJbZGlyXSA9IGwKKyAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIGw6CisgICAgICAgICAgICAgICAgbC5hcHBlbmQobmFtZSkKKyAgICBmaW5hbGx5OgorICAgICAgICBvcy5jaGRpcihwd2QpCisgICAgIworICAgICMgRHVtcCB0aGUgcmVzdWx0czoKKyAgICAjCisgICAgaWYgYW5ub3RhdGU6CisgICAgICAgIG1vZHVsZXMgPSBtb2R1bGVzX2J5X25hbWUuaXRlbXMoKQorICAgICAgICBtb2R1bGVzLnNvcnQoKQorICAgICAgICB3aWR0aCA9IG1heChtYXAobGVuLCBtb2R1bGVzX2J5X25hbWUua2V5cygpKSkKKyAgICAgICAgZm9ybWF0ID0gIiUlLSVkcyAgJSVzIiAlIHdpZHRoCisgICAgICAgIGZvciBuYW1lLCBkaXIgaW4gbW9kdWxlczoKKyAgICAgICAgICAgIGlmIGRpciBhbmQgZGlyWzBdICE9ICI8IjoKKyAgICAgICAgICAgICAgICBwcmludCBmb3JtYXQgJSAobmFtZSwgZGlyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCBuYW1lCisgICAgZWxpZiBjYXRlZ29yaXplOgorICAgICAgICBtb2R1bGVzID0gbW9kdWxlc19ieV9kaXIuaXRlbXMoKQorICAgICAgICBtb2R1bGVzLnNvcnQoKQorICAgICAgICB3aWR0aCA9IG1heChtYXAobGVuLCBtb2R1bGVzX2J5X2Rpci5rZXlzKCkpKQorICAgICAgICBmb3JtYXQgPSAiJSUtJWRzICAlJXMiICUgd2lkdGgKKyAgICAgICAgZm9yIGRpciwgbmFtZXMgaW4gbW9kdWxlczoKKyAgICAgICAgICAgIG5hbWVzLnNvcnQoKQorICAgICAgICAgICAgcHJpbnQgZm9ybWF0ICUgKGRpciwgbmFtZXNbMF0pCisgICAgICAgICAgICBmb3IgbmFtZSBpbiBuYW1lc1sxOl06CisgICAgICAgICAgICAgICAgcHJpbnQgZm9ybWF0ICUgKCcnLCBuYW1lKQorICAgICAgICAgICAgcHJpbnQKKyAgICBlbHNlOgorICAgICAgICBtb2R1bGVzID0gbW9kdWxlc19ieV9uYW1lLmtleXMoKQorICAgICAgICBtb2R1bGVzLnNvcnQoKQorICAgICAgICBwcmludCBzdHJpbmcuam9pbihtb2R1bGVzLCAiXG4iKQorCisKK2RlZiBpZ25vcmVfZnJvbV9tb2R1bGVsaXN0KGRhdGEsIGlnbm9yZV9kaWN0KToKKyAgICBmb3IgbmFtZSBpbiBzdHJpbmcuc3BsaXQoZGF0YSk6CisgICAgICAgIGlnbm9yZV9kaWN0W25hbWVdID0gbmFtZQorCitkZWYgaWdub3JlX2Zyb21faWR4KGRhdGEsIGlnbm9yZV9kaWN0KToKKyAgICBkYXRhID0gc3RyaW5nLnJlcGxhY2UoZGF0YSwgciJcaGFja3Njb3JlICB7fSIsICJfIikKKyAgICByeCA9IHJlLmNvbXBpbGUociJcXGluZGV4ZW50cnlccyp7KFteQF0qKUAiKQorICAgIGZvciBsaW5lIGluIHN0cmluZy5zcGxpdChkYXRhLCAiXG4iKToKKyAgICAgICAgbSA9IHJ4Lm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG06CisgICAgICAgICAgICBuYW1lID0gbS5ncm91cCgxKQorICAgICAgICAgICAgaWdub3JlX2RpY3RbbmFtZV0gPSBuYW1lCisKKworZGVmIHVzYWdlKCk6CisgICAgdmFycyA9IHt9CisgICAgdmFyc1sicHJvZ3JhbSJdID0gb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkKKyAgICBwcmludCBfX2RvY19fICUgdmFycworCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvbWthY2tzaHRtbCBiL2RvYy90b29scy9ta2Fja3NodG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkxN2IzMDMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvbWthY2tzaHRtbApAQCAtMCwwICsxLDY1IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisjICAtKi0gUHl0aG9uIC0qLQorCitpbXBvcnQgc3RyaW5nCitpbXBvcnQgc3VwcG9ydAoraW1wb3J0IHN5cworCisKK2RlZiBjb2xsZWN0KGZwKToKKyAgICBuYW1lcyA9IFtdCisgICAgd2hpbGUgMToKKyAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICBicmVhaworICAgICAgICBsaW5lID0gc3RyaW5nLnN0cmlwKGxpbmUpCisgICAgICAgIGlmIGxpbmU6CisgICAgICAgICAgICBuYW1lcy5hcHBlbmQobGluZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWVzID0gW10KKyAgICByZXR1cm4gbmFtZXMKKworCitkZWYgbWFpbigpOgorICAgIG9wdGlvbnMgPSBzdXBwb3J0Lk9wdGlvbnMoKQorICAgIG9wdGlvbnMuY29sdW1ucyA9IDQKKyAgICBvcHRpb25zLnZhcmlhYmxlc1sidGl0bGUiXSA9ICJBY2tub3dsZWRnZW1lbnRzIgorICAgIG9wdGlvbnMucGFyc2Uoc3lzLmFyZ3ZbMTpdKQorICAgIG5hbWVzID0gY29sbGVjdChzeXMuc3RkaW4pCisgICAgcGVyY29sID0gKGxlbihuYW1lcykgKyBvcHRpb25zLmNvbHVtbnMgLSAxKSAvIG9wdGlvbnMuY29sdW1ucworICAgIGNvbG51bXMgPSBbXQorICAgIGZvciBpIGluIHJhbmdlKG9wdGlvbnMuY29sdW1ucyk6CisgICAgICAgIGNvbG51bXMuYXBwZW5kKHBlcmNvbCppKQorICAgIGZwID0gb3B0aW9ucy5nZXRfb3V0cHV0X2ZpbGUoKQorICAgIGZwLndyaXRlKHN0cmluZy5yc3RyaXAob3B0aW9ucy5nZXRfaGVhZGVyKCkpICsgIlxuIikKKyAgICBmcC53cml0ZShUSEFOS1MgKyAiXG4iKQorICAgIGZwLndyaXRlKCc8dGFibGUgd2lkdGg9IjEwMCUiIGFsaWduPSJjZW50ZXIiPlxuJykKKyAgICBmb3IgaSBpbiByYW5nZShwZXJjb2wpOgorICAgICAgICBmcC53cml0ZSgiICA8dHI+XG4iKQorICAgICAgICBmb3IgaiBpbiBjb2xudW1zOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZwLndyaXRlKCIgICAgPHRkPiVzPC90ZD5cbiIgJSBuYW1lc1tpICsgal0pCisgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGZwLndyaXRlKCIgIDwvdHI+XG4iKQorICAgIGZwLndyaXRlKCI8L3RhYmxlPlxuIikKKyAgICBmcC53cml0ZShzdHJpbmcucnN0cmlwKG9wdGlvbnMuZ2V0X2Zvb3RlcigpKSArICJcbiIpCisgICAgZnAuY2xvc2UoKQorCitUSEFOS1MgPSAnJydcCisKKzxwPlRoZXNlIHBlb3BsZSBoYXZlIGNvbnRyaWJ1dGVkIGluIHNvbWUgd2F5IHRvIHRoZSBQeXRob24KK2RvY3VtZW50YXRpb24uICBUaGlzIGxpc3QgaXMgcHJvYmFibHkgbm90IGNvbXBsZXRlIC0tIGlmIHlvdSBmZWVsIHRoYXQKK3lvdSBvciBhbnlvbmUgZWxzZSBzaG91bGQgYmUgb24gdGhpcyBsaXN0LCBwbGVhc2UgbGV0IHVzIGtub3cgKHNlbmQKK2VtYWlsIHRvIDxhCitocmVmPSJtYWlsdG86cHl0aG9uLWRvY3NAcHl0aG9uLm9yZyI+cHl0aG9uLWRvY3NAcHl0aG9uLm9yZzwvYT4pLCBhbmQKK3dlIHdpbGwgYmUgZ2xhZCB0byBjb3JyZWN0IHRoZSBwcm9ibGVtLjwvcD4KKworPHA+SXQgaXMgb25seSB3aXRoIHRoZSBpbnB1dCBhbmQgY29udHJpYnV0aW9ucyBvZiB0aGUgUHl0aG9uIGNvbW11bml0eQordGhhdCBQeXRob24gaGFzIHN1Y2ggd29uZGVyZnVsIGRvY3VtZW50YXRpb24gLS0gPGI+VGhhbmsgWW91ITwvYj48L3A+CisKKycnJworCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvbWtob3d0byBiL2RvYy90b29scy9ta2hvd3RvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZlZWIwOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvbWtob3d0bwpAQCAtMCwwICsxLDU5NyBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorIyAgLSotIFB5dGhvbiAtKi0KKyIiInVzYWdlOiAlKHByb2dyYW0pcyBbb3B0aW9ucy4uLl0gZmlsZSAuLi4KKworT3B0aW9ucyBzcGVjaWZ5aW5nIGZvcm1hdHMgdG8gYnVpbGQ6CisgICAgLS1odG1sCQlIeXBlclRleHQgTWFya3VwIExhbmd1YWdlIChkZWZhdWx0KQorICAgIC0tcGRmCQlQb3J0YWJsZSBEb2N1bWVudCBGb3JtYXQKKyAgICAtLXBzCQlQb3N0U2NyaXB0CisgICAgLS1kdmkJCSdEZVZpY2UgSW5kZXBlbnRlbnQnIGZvcm1hdCBmcm9tIFRlWAorICAgIC0tdGV4dAkJQVNDSUkgdGV4dCAocmVxdWlyZXMgbHlueCkKKworICAgIE1vcmUgdGhhbiBvbmUgb3V0cHV0IGZvcm1hdCBtYXkgYmUgc3BlY2lmaWVkLCBvciAtLWFsbC4KKworSFRNTCBvcHRpb25zOgorICAgIC0tYWRkcmVzcywgLWEJU3BlY2lmeSBhbiBhZGRyZXNzIGZvciBwYWdlIGZvb3RlcnMuCisgICAgLS1saW5rCQlTcGVjaWZ5IHRoZSBudW1iZXIgb2YgbGV2ZWxzIHRvIGluY2x1ZGUgb24gZWFjaCBwYWdlLgorICAgIC0tc3BsaXQsIC1zCQlTcGVjaWZ5IGEgc2VjdGlvbiBsZXZlbCBmb3IgcGFnZSBzcGxpdHRpbmcsIGRlZmF1bHQ6ICUobWF4X3NwbGl0X2RlcHRoKXMuCisgICAgLS1pY29uc2VydmVyLCAtaQlTcGVjaWZ5IGxvY2F0aW9uIG9mIGljb25zIChkZWZhdWx0OiAuLi8pLgorICAgIC0taW1hZ2UtdHlwZQlTcGVjaWZ5IHRoZSBpbWFnZSB0eXBlIHRvIHVzZSBpbiBIVE1MIG91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogZ2lmIChkZWZhdWx0KSwgcG5nLgorICAgIC0tbnVtZXJpYyAgICAgICAgICAgRG9uJ3QgcmVuYW1lIHRoZSBIVE1MIGZpbGVzOyBqdXN0IGtlZXAgbm9kZSMuaHRtbCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlbmFtZXMuCisgICAgLS1zdHlsZSAgICAgICAgICAgICBTcGVjaWZ5IHRoZSBDU1MgZmlsZSB0byB1c2UgZm9yIHRoZSBvdXRwdXQgKGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbm90IGEgVVJMKS4KKyAgICAtLXVwLWxpbmsgICAgICAgICAgIFVSTCB0byBhIHBhcmVudCBkb2N1bWVudC4KKyAgICAtLXVwLXRpdGxlICAgICAgICAgIFRpdGxlIG9mIGEgcGFyZW50IGRvY3VtZW50LgorCitPdGhlciBvcHRpb25zOgorICAgIC0tYTQJCUZvcm1hdCBmb3IgQTQgcGFwZXIuCisgICAgLS1sZXR0ZXIJCUZvcm1hdCBmb3IgVVMgbGV0dGVyIHBhcGVyICh0aGUgZGVmYXVsdCkuCisgICAgLS1oZWxwLCAtSAkJU2hvdyB0aGlzIHRleHQuCisgICAgLS1sb2dnaW5nLCAtbAlMb2cgc3Rkb3V0IGFuZCBzdGRlcnIgdG8gYSBmaWxlICgqLmhvdykuCisgICAgLS1kZWJ1Z2dpbmcsIC1ECUVjaG8gY29tbWFuZHMgYXMgdGhleSBhcmUgZXhlY3V0ZWQuCisgICAgLS1rZWVwLCAtawkJS2VlcCB0ZW1wb3JhcnkgZmlsZXMgYXJvdW5kLgorICAgIC0tcXVpZXQsIC1xCQlEbyBub3QgcHJpbnQgY29tbWFuZCBvdXRwdXQgdG8gc3Rkb3V0LgorCQkJKHN0ZGVyciBpcyBhbHNvIGxvc3QsICBzb3JyeTsgc2VlICouaG93IGZvciBlcnJvcnMpCisiIiIKKworaW1wb3J0IGdldG9wdAoraW1wb3J0IGdsb2IKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3RyaW5nCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKKworCitNWURJUiA9IG9zLnBhdGguYWJzcGF0aChzeXMucGF0aFswXSkKKworSVNURklMRSA9IG9zLnBhdGguam9pbihNWURJUiwgInRleGlucHV0cyIsICJweXRob24uaXN0IikKK05PREUyTEFCRUxfU0NSSVBUID0gb3MucGF0aC5qb2luKE1ZRElSLCAibm9kZTJsYWJlbC5wbCIpCitMMkhfSU5JVF9GSUxFID0gb3MucGF0aC5qb2luKE1ZRElSLCAicGVybCIsICJsMmhpbml0LnBlcmwiKQorCitCSUJURVhfQklOQVJZID0gImJpYnRleCIKK0RWSVBTX0JJTkFSWSA9ICJkdmlwcyIKK0xBVEVYX0JJTkFSWSA9ICJsYXRleCIKK0xBVEVYMkhUTUxfQklOQVJZID0gImxhdGV4Mmh0bWwiCitMWU5YX0JJTkFSWSA9ICJseW54IgorTUFLRUlOREVYX0JJTkFSWSA9ICJtYWtlaW5kZXgiCitQREZMQVRFWF9CSU5BUlkgPSAicGRmbGF0ZXgiCitQRVJMX0JJTkFSWSA9ICJwZXJsIgorUFlUSE9OX0JJTkFSWSA9ICJweXRob24iCisKKworZGVmIHVzYWdlKG9wdGlvbnMpOgorICAgIHByaW50IF9fZG9jX18gJSBvcHRpb25zCisKK2RlZiBlcnJvcihvcHRpb25zLCBtZXNzYWdlLCBlcnI9Mik6CisgICAgc3lzLnN0ZG91dCA9IHN5cy5zdGRlcnIKKyAgICBwcmludCBtZXNzYWdlCisgICAgcHJpbnQKKyAgICB1c2FnZShvcHRpb25zKQorICAgIHN5cy5leGl0KDIpCisKKworY2xhc3MgT3B0aW9uczoKKyAgICBwcm9ncmFtID0gb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkKKyAgICAjCisgICAgYWRkcmVzcyA9ICcnCisgICAgYnVpbGRkaXIgPSBOb25lCisgICAgZGVidWdnaW5nID0gMAorICAgIGRpc2NhcmRfdGVtcHMgPSAxCisgICAgaGF2ZV90ZW1wcyA9IDAKKyAgICBpY29uX3NlcnZlciA9IE5vbmUKKyAgICBpbWFnZV90eXBlID0gImdpZiIKKyAgICBsb2dnaW5nID0gMAorICAgIG1heF9saW5rX2RlcHRoID0gMworICAgIG1heF9zcGxpdF9kZXB0aCA9IDYKKyAgICBwYXBlciA9ICJsZXR0ZXIiCisgICAgcXVpZXQgPSAwCisgICAgcnVucyA9IDAKKyAgICBudW1lcmljID0gMAorICAgIGdsb2JhbF9tb2R1bGVfaW5kZXggPSBOb25lCisgICAgc3R5bGVfZmlsZSA9IG9zLnBhdGguam9pbihNWURJUiwgImh0bWwiLCAic3R5bGUuY3NzIikKKyAgICBhYm91dF9maWxlID0gb3MucGF0aC5qb2luKE1ZRElSLCAiaHRtbCIsICJhYm91dC5kYXQiKQorICAgIHVwX2xpbmsgPSBOb25lCisgICAgdXBfdGl0bGUgPSBOb25lCisgICAgIworICAgIERFRkFVTFRfRk9STUFUUyA9ICgiaHRtbCIsKQorICAgIEFMTF9GT1JNQVRTID0gKCJkdmkiLCAiaHRtbCIsICJwZGYiLCAicHMiLCAidGV4dCIpCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZm9ybWF0cyA9IFtdCisgICAgICAgIHNlbGYubDJoX2luaXRfZmlsZXMgPSBbXQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICMgVGhpcyBpcyB1c2VkIHdoZW4gZm9ybWF0dGluZyB0aGUgdXNhZ2UgbWVzc2FnZS4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwga2V5KQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvciwga2V5CisKKyAgICBkZWYgcGFyc2Uoc2VsZiwgYXJncyk6CisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KGFyZ3MsICJIaTphOnM6bERrcXI6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJhbGwiLCAicG9zdHNjcmlwdCIsICJoZWxwIiwgImljb25zZXJ2ZXI9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRyZXNzPSIsICJhNCIsICJsZXR0ZXIiLCAibDJoLWluaXQ9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5rPSIsICJzcGxpdD0iLCAibG9nZ2luZyIsICJkZWJ1Z2dpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtlZXAiLCAicXVpZXQiLCAicnVucz0iLCAiaW1hZ2UtdHlwZT0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFib3V0PSIsICJudW1lcmljIiwgInN0eWxlPSIsICJwYXBlcj0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVwLWxpbms9IiwgInVwLXRpdGxlPSIsICJkaXI9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbG9iYWwtbW9kdWxlLWluZGV4PSJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGlzdChzZWxmLkFMTF9GT1JNQVRTKSkKKyAgICAgICAgZm9yIG9wdCwgYXJnIGluIG9wdHM6CisgICAgICAgICAgICBpZiBvcHQgPT0gIi0tYWxsIjoKKyAgICAgICAgICAgICAgICBzZWxmLmZvcm1hdHMgPSBsaXN0KHNlbGYuQUxMX0ZPUk1BVFMpCisgICAgICAgICAgICBlbGlmIG9wdCBpbiAoIi1IIiwgIi0taGVscCIpOgorICAgICAgICAgICAgICAgIHVzYWdlKHNlbGYpCisgICAgICAgICAgICAgICAgc3lzLmV4aXQoKQorICAgICAgICAgICAgZWxpZiBvcHQgPT0gIi0taWNvbnNlcnZlciI6CisgICAgICAgICAgICAgICAgc2VsZi5pY29uX3NlcnZlciA9IGFyZworICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCItYSIsICItLWFkZHJlc3MiKToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZHJlc3MgPSBhcmcKKyAgICAgICAgICAgIGVsaWYgb3B0ID09ICItLWE0IjoKKyAgICAgICAgICAgICAgICBzZWxmLnBhcGVyID0gImE0IgorICAgICAgICAgICAgZWxpZiBvcHQgPT0gIi0tbGV0dGVyIjoKKyAgICAgICAgICAgICAgICBzZWxmLnBhcGVyID0gImxldHRlciIKKyAgICAgICAgICAgIGVsaWYgb3B0ID09ICItLWxpbmsiOgorICAgICAgICAgICAgICAgIHNlbGYubWF4X2xpbmtfZGVwdGggPSBpbnQoYXJnKQorICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCItcyIsICItLXNwbGl0Iik6CisgICAgICAgICAgICAgICAgc2VsZi5tYXhfc3BsaXRfZGVwdGggPSBpbnQoYXJnKQorICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCItbCIsICItLWxvZ2dpbmciKToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ2dpbmcgPSBzZWxmLmxvZ2dpbmcgKyAxCisgICAgICAgICAgICBlbGlmIG9wdCBpbiAoIi1EIiwgIi0tZGVidWdnaW5nIik6CisgICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z2dpbmcgPSBzZWxmLmRlYnVnZ2luZyArIDEKKyAgICAgICAgICAgIGVsaWYgb3B0IGluICgiLWsiLCAiLS1rZWVwIik6CisgICAgICAgICAgICAgICAgc2VsZi5kaXNjYXJkX3RlbXBzID0gMAorICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCItcSIsICItLXF1aWV0Iik6CisgICAgICAgICAgICAgICAgc2VsZi5xdWlldCA9IDEKKyAgICAgICAgICAgIGVsaWYgb3B0IGluICgiLXIiLCAiLS1ydW5zIik6CisgICAgICAgICAgICAgICAgc2VsZi5ydW5zID0gaW50KGFyZykKKyAgICAgICAgICAgIGVsaWYgb3B0ID09ICItLWltYWdlLXR5cGUiOgorICAgICAgICAgICAgICAgIHNlbGYuaW1hZ2VfdHlwZSA9IGFyZworICAgICAgICAgICAgZWxpZiBvcHQgPT0gIi0tYWJvdXQiOgorICAgICAgICAgICAgICAgICMgYWx3YXlzIG1ha2UgdGhpcyBhYnNvbHV0ZToKKyAgICAgICAgICAgICAgICBzZWxmLmFib3V0X2ZpbGUgPSBvcy5wYXRoLm5vcm1wYXRoKAorICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmFic3BhdGgoYXJnKSkKKyAgICAgICAgICAgIGVsaWYgb3B0ID09ICItLW51bWVyaWMiOgorICAgICAgICAgICAgICAgIHNlbGYubnVtZXJpYyA9IDEKKyAgICAgICAgICAgIGVsaWYgb3B0ID09ICItLXN0eWxlIjoKKyAgICAgICAgICAgICAgICBzZWxmLnN0eWxlX2ZpbGUgPSBvcy5wYXRoLmFic3BhdGgoYXJnKQorICAgICAgICAgICAgZWxpZiBvcHQgPT0gIi0tbDJoLWluaXQiOgorICAgICAgICAgICAgICAgIHNlbGYubDJoX2luaXRfZmlsZXMuYXBwZW5kKG9zLnBhdGguYWJzcGF0aChhcmcpKQorICAgICAgICAgICAgZWxpZiBvcHQgPT0gIi0tdXAtbGluayI6CisgICAgICAgICAgICAgICAgc2VsZi51cF9saW5rID0gYXJnCisgICAgICAgICAgICBlbGlmIG9wdCA9PSAiLS11cC10aXRsZSI6CisgICAgICAgICAgICAgICAgc2VsZi51cF90aXRsZSA9IGFyZworICAgICAgICAgICAgZWxpZiBvcHQgPT0gIi0tZ2xvYmFsLW1vZHVsZS1pbmRleCI6CisgICAgICAgICAgICAgICAgc2VsZi5nbG9iYWxfbW9kdWxlX2luZGV4ID0gYXJnCisgICAgICAgICAgICBlbGlmIG9wdCA9PSAiLS1kaXIiOgorICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRkaXIgPSBhcmcKKyAgICAgICAgICAgIGVsaWYgb3B0ID09ICItLXBhcGVyIjoKKyAgICAgICAgICAgICAgICBzZWxmLnBhcGVyID0gYXJnCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIEZvcm1hdCBzcGVjaWZpZXJzOgorICAgICAgICAgICAgIworICAgICAgICAgICAgZWxpZiBvcHRbMjpdIGluIHNlbGYuQUxMX0ZPUk1BVFM6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfZm9ybWF0KG9wdFsyOl0pCisgICAgICAgICAgICBlbGlmIG9wdCA9PSAiLS1wb3N0c2NyaXB0IjoKKyAgICAgICAgICAgICAgICAjIHN5bm9ueW0gZm9yIC0tcHMKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9mb3JtYXQoInBzIikKKyAgICAgICAgc2VsZi5pbml0aWFsaXplKCkKKyAgICAgICAgIworICAgICAgICAjIHJldHVybiB0aGUgYXJncyB0byBhbGxvdyB0aGUgY2FsbGVyIGFjY2VzczoKKyAgICAgICAgIworICAgICAgICByZXR1cm4gYXJncworCisgICAgZGVmIGFkZF9mb3JtYXQoc2VsZiwgZm9ybWF0KToKKyAgICAgICAgIiIiQWRkIGEgZm9ybWF0IHRvIHRoZSBmb3JtYXRzIGxpc3QgaWYgbm90IHByZXNlbnQuIiIiCisgICAgICAgIGlmIG5vdCBmb3JtYXQgaW4gc2VsZi5mb3JtYXRzOgorICAgICAgICAgICAgc2VsZi5mb3JtYXRzLmFwcGVuZChmb3JtYXQpCisKKyAgICBkZWYgaW5pdGlhbGl6ZShzZWxmKToKKyAgICAgICAgIiIiQ29tcGxldGUgaW5pdGlhbGl6YXRpb24uICBUaGlzIGlzIG5lZWRlZCBpZiBwYXJzZSgpIGlzbid0IHVzZWQuIiIiCisgICAgICAgICMgYWRkIHRoZSBkZWZhdWx0IGZvcm1hdCBpZiBubyBmb3JtYXRzIHdlcmUgc3BlY2lmaWVkOgorICAgICAgICBpZiBub3Qgc2VsZi5mb3JtYXRzOgorICAgICAgICAgICAgc2VsZi5mb3JtYXRzID0gc2VsZi5ERUZBVUxUX0ZPUk1BVFMKKyAgICAgICAgIyBkZXRlcm1pbmUgdGhlIGJhc2Ugc2V0IG9mIHRleGlucHV0cyBkaXJlY3RvcmllczoKKyAgICAgICAgdGV4aW5wdXRzID0gc3RyaW5nLnNwbGl0KG9zLmVudmlyb24uZ2V0KCJURVhJTlBVVFMiLCAiIiksIG9zLnBhdGhzZXApCisgICAgICAgIGlmIG5vdCB0ZXhpbnB1dHM6CisgICAgICAgICAgICB0ZXhpbnB1dHMgPSBbJyddCisgICAgICAgIHNlbGYuYmFzZV90ZXhpbnB1dHMgPSBbCisgICAgICAgICAgICBvcy5wYXRoLmpvaW4oTVlESVIsICJwYXBlci0iICsgc2VsZi5wYXBlciksCisgICAgICAgICAgICBvcy5wYXRoLmpvaW4oTVlESVIsICJ0ZXhpbnB1dHMiKSwKKyAgICAgICAgICAgIF0gKyB0ZXhpbnB1dHMKKworCitjbGFzcyBKb2I6CisgICAgbGF0ZXhfcnVucyA9IDAKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb25zLCBwYXRoKToKKyAgICAgICAgc2VsZi5vcHRpb25zID0gb3B0aW9ucworICAgICAgICBzZWxmLmRvY3R5cGUgPSBnZXRfZG9jdHlwZShwYXRoKQorICAgICAgICBzZWxmLmZpbGVkaXIsIHNlbGYuZG9jID0gc3BsaXRfcGF0aG5hbWUocGF0aCkKKyAgICAgICAgc2VsZi5sb2dfZmlsZW5hbWUgPSBzZWxmLmRvYyArICIuaG93IgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmxvZ19maWxlbmFtZSk6CisgICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5sb2dfZmlsZW5hbWUpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuZG9jICsgIi5sMmgiKToKKyAgICAgICAgICAgIHNlbGYubDJoX2F1eF9pbml0X2ZpbGUgPSB0ZW1wZmlsZS5ta3RlbXAoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5sMmhfYXV4X2luaXRfZmlsZSA9IHNlbGYuZG9jICsgIi5sMmgiCisgICAgICAgIHNlbGYud3JpdGVfbDJoX2F1eF9pbml0X2ZpbGUoKQorCisgICAgZGVmIGJ1aWxkKHNlbGYpOgorICAgICAgICBzZWxmLnNldHVwX3RleGlucHV0cygpCisgICAgICAgIGZvcm1hdHMgPSBzZWxmLm9wdGlvbnMuZm9ybWF0cworICAgICAgICBpZiAiZHZpIiBpbiBmb3JtYXRzIG9yICJwcyIgaW4gZm9ybWF0czoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfZHZpKCkKKyAgICAgICAgaWYgInBkZiIgaW4gZm9ybWF0czoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfcGRmKCkKKyAgICAgICAgaWYgInBzIiBpbiBmb3JtYXRzOgorICAgICAgICAgICAgc2VsZi5idWlsZF9wcygpCisgICAgICAgIGlmICJodG1sIiBpbiBmb3JtYXRzOgorICAgICAgICAgICAgc2VsZi5yZXF1aXJlX3RlbXBzKCkKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfaHRtbChzZWxmLm9wdGlvbnMuYnVpbGRkaXIgb3Igc2VsZi5kb2MpCisgICAgICAgICAgICBpZiBzZWxmLm9wdGlvbnMuaWNvbl9zZXJ2ZXIgPT0gIi4iOgorICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBvcy5wYXRoLmpvaW4oTVlESVIsICJodG1sIiwgImljb25zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqLiIgKyBzZWxmLm9wdGlvbnMuaW1hZ2VfdHlwZSkKKyAgICAgICAgICAgICAgICBpbWdzID0gZ2xvYi5nbG9iKHBhdHRlcm4pCisgICAgICAgICAgICAgICAgaWYgbm90IGltZ3M6CisgICAgICAgICAgICAgICAgICAgIHNlbGYud2FybmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgbG9jYXRlIHN1cHBvcnQgaW1hZ2VzIG9mIHR5cGUgJXMuIgorICAgICAgICAgICAgICAgICAgICAgICAgJSBgc2VsZi5vcHRpb25zLmltYWdlX3R5cGVgKQorICAgICAgICAgICAgICAgIGZvciBmbiBpbiBpbWdzOgorICAgICAgICAgICAgICAgICAgICBuZXdfZm4gPSBvcy5wYXRoLmpvaW4oc2VsZi5kb2MsIG9zLnBhdGguYmFzZW5hbWUoZm4pKQorICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weWZpbGUoZm4sIG5ld19mbikKKyAgICAgICAgaWYgInRleHQiIGluIGZvcm1hdHM6CisgICAgICAgICAgICBzZWxmLnJlcXVpcmVfdGVtcHMoKQorICAgICAgICAgICAgdGVtcGRpciA9IHNlbGYuZG9jCisgICAgICAgICAgICBuZWVkX2h0bWwgPSAiaHRtbCIgbm90IGluIGZvcm1hdHMKKyAgICAgICAgICAgIGlmIHNlbGYub3B0aW9ucy5tYXhfc3BsaXRfZGVwdGggIT0gMToKKyAgICAgICAgICAgICAgICBmcCA9IG9wZW4oc2VsZi5sMmhfYXV4X2luaXRfZmlsZSwgImEiKQorICAgICAgICAgICAgICAgIGZwLndyaXRlKCIjIHJlLWhhY2sgdGhpcyBmaWxlIGZvciAtLXRleHQ6XG4iKQorICAgICAgICAgICAgICAgIGwyaG9wdGlvbihmcCwgIk1BWF9TUExJVF9ERVBUSCIsICIxIikKKyAgICAgICAgICAgICAgICBmcC53cml0ZSgiMTtcbiIpCisgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAgICAgICAgIHRlbXBkaXIgPSBzZWxmLmRvYyArICItdGVtcC1odG1sIgorICAgICAgICAgICAgICAgIG5lZWRfaHRtbCA9IDEKKyAgICAgICAgICAgIGlmIG5lZWRfaHRtbDoKKyAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkX2h0bWwodGVtcGRpciwgbWF4X3NwbGl0X2RlcHRoPTEpCisgICAgICAgICAgICBzZWxmLmJ1aWxkX3RleHQodGVtcGRpcikKKyAgICAgICAgaWYgc2VsZi5vcHRpb25zLmRpc2NhcmRfdGVtcHM6CisgICAgICAgICAgICBzZWxmLmNsZWFudXAoKQorCisgICAgZGVmIHNldHVwX3RleGlucHV0cyhzZWxmKToKKyAgICAgICAgdGV4aW5wdXRzID0gW3NlbGYuZmlsZWRpcl0gKyBsaXN0KHNlbGYub3B0aW9ucy5iYXNlX3RleGlucHV0cykKKyAgICAgICAgb3MuZW52aXJvblsiVEVYSU5QVVRTIl0gPSBzdHJpbmcuam9pbihbJy4nXSt0ZXhpbnB1dHMsIG9zLnBhdGhzZXApCisgICAgICAgIHNlbGYubWVzc2FnZSgiVEVYSU5QVVRTPSIgKyBvcy5lbnZpcm9uWyJURVhJTlBVVFMiXSkKKworICAgIGRlZiBidWlsZF9hdXgoc2VsZiwgYmluYXJ5PU5vbmUpOgorICAgICAgICBpZiBiaW5hcnkgaXMgTm9uZToKKyAgICAgICAgICAgIGJpbmFyeSA9IExBVEVYX0JJTkFSWQorICAgICAgICBuZXdfaW5kZXgoICAgIiVzLmluZCIgJSBzZWxmLmRvYywgImdlbmluZGV4IikKKyAgICAgICAgbmV3X2luZGV4KCJtb2Qlcy5pbmQiICUgc2VsZi5kb2MsICJtb2RpbmRleCIpCisgICAgICAgIHNlbGYucnVuKCIlcyAlcyIgJSAoYmluYXJ5LCBzZWxmLmRvYykpCisgICAgICAgIHNlbGYudXNlX2JpYnRleCA9IGNoZWNrX2Zvcl9iaWJ0ZXgoc2VsZi5kb2MgKyAiLmF1eCIpCisgICAgICAgIHNlbGYubGF0ZXhfcnVucyA9IDEKKworICAgIGRlZiBidWlsZF9kdmkoc2VsZik6CisgICAgICAgIHNlbGYudXNlX2xhdGV4KExBVEVYX0JJTkFSWSkKKworICAgIGRlZiBidWlsZF9wZGYoc2VsZik6CisgICAgICAgIHNlbGYudXNlX2xhdGV4KFBERkxBVEVYX0JJTkFSWSkKKworICAgIGRlZiB1c2VfbGF0ZXgoc2VsZiwgYmluYXJ5KToKKyAgICAgICAgc2VsZi5yZXF1aXJlX3RlbXBzKGJpbmFyeT1iaW5hcnkpCisgICAgICAgIGlmIHNlbGYubGF0ZXhfcnVucyA8IDI6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZSgibW9kJXMuaWR4IiAlIHNlbGYuZG9jKToKKyAgICAgICAgICAgICAgICBzZWxmLnJ1bigiJXMgbW9kJXMuaWR4IiAlIChNQUtFSU5ERVhfQklOQVJZLCBzZWxmLmRvYykpCisgICAgICAgICAgICB1c2VfaW5kZml4ID0gMAorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoc2VsZi5kb2MgKyAiLmlkeCIpOgorICAgICAgICAgICAgICAgIHVzZV9pbmRmaXggPSAxCisgICAgICAgICAgICAgICAgIyBjYWxsIHRvIERvYy90b29scy9maXhfaGFjayBvbWl0dGVkOyBkb2Vzbid0IGFwcGVhciBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICBzZWxmLnJ1bigiJXMgJXMuaWR4IiAlIChNQUtFSU5ERVhfQklOQVJZLCBzZWxmLmRvYykpCisgICAgICAgICAgICAgICAgaW1wb3J0IGluZGZpeAorICAgICAgICAgICAgICAgIGluZGZpeC5wcm9jZXNzKHNlbGYuZG9jICsgIi5pbmQiKQorICAgICAgICAgICAgaWYgc2VsZi51c2VfYmlidGV4OgorICAgICAgICAgICAgICAgIHNlbGYucnVuKCIlcyAlcyIgJSAoQklCVEVYX0JJTkFSWSwgc2VsZi5kb2MpKQorICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3N5bm9wc2lzX2ZpbGVzKCkKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgbGV0IHRoZSBkb2N0eXBlLXNwZWNpZmljIGhhbmRsZXIgZG8gc29tZSBpbnRlcm1lZGlhdGUgd29yazoKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgIHNlbGYucnVuKCIlcyAlcyIgJSAoYmluYXJ5LCBzZWxmLmRvYykpCisgICAgICAgICAgICBzZWxmLmxhdGV4X3J1bnMgPSBzZWxmLmxhdGV4X3J1bnMgKyAxCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZSgibW9kJXMuaWR4IiAlIHNlbGYuZG9jKToKKyAgICAgICAgICAgICAgICBzZWxmLnJ1bigiJXMgLXMgJXMgbW9kJXMuaWR4IgorICAgICAgICAgICAgICAgICAgICAgICAgICUgKE1BS0VJTkRFWF9CSU5BUlksIElTVEZJTEUsIHNlbGYuZG9jKSkKKyAgICAgICAgICAgIGlmIHVzZV9pbmRmaXg6CisgICAgICAgICAgICAgICAgc2VsZi5ydW4oIiVzIC1zICVzICVzLmlkeCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAlIChNQUtFSU5ERVhfQklOQVJZLCBJU1RGSUxFLCBzZWxmLmRvYykpCisgICAgICAgICAgICAgICAgaW5kZml4LnByb2Nlc3Moc2VsZi5kb2MgKyAiLmluZCIpCisgICAgICAgICAgICBzZWxmLnByb2Nlc3Nfc3lub3BzaXNfZmlsZXMoKQorICAgICAgICAjCisgICAgICAgICMgYW5kIG5vdyBmaW5pc2ggaXQgb2ZmOgorICAgICAgICAjCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNlbGYuZG9jICsgIi50b2MiKSBhbmQgYmluYXJ5ID09IFBERkxBVEVYX0JJTkFSWToKKyAgICAgICAgICAgIGltcG9ydCB0b2MyYmttCisgICAgICAgICAgICBpZiBzZWxmLmRvY3R5cGUgPT0gIm1hbnVhbCI6CisgICAgICAgICAgICAgICAgYmlncGFydCA9ICJjaGFwdGVyIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBiaWdwYXJ0ID0gInNlY3Rpb24iCisgICAgICAgICAgICB0b2MyYmttLnByb2Nlc3Moc2VsZi5kb2MgKyAiLnRvYyIsIHNlbGYuZG9jICsgIi5ia20iLCBiaWdwYXJ0KQorICAgICAgICBpZiBzZWxmLnVzZV9iaWJ0ZXg6CisgICAgICAgICAgICBzZWxmLnJ1bigiJXMgJXMiICUgKEJJQlRFWF9CSU5BUlksIHNlbGYuZG9jKSkKKyAgICAgICAgc2VsZi5ydW4oIiVzICVzIiAlIChiaW5hcnksIHNlbGYuZG9jKSkKKyAgICAgICAgc2VsZi5sYXRleF9ydW5zID0gc2VsZi5sYXRleF9ydW5zICsgMQorCisgICAgZGVmIHByb2Nlc3Nfc3lub3BzaXNfZmlsZXMoc2VsZik6CisgICAgICAgIHN5bm9wc2lzX2ZpbGVzID0gZ2xvYi5nbG9iKHNlbGYuZG9jICsgIiouc3luIikKKyAgICAgICAgZm9yIHBhdGggaW4gc3lub3BzaXNfZmlsZXM6CisgICAgICAgICAgICB1bmlxaWZ5X21vZHVsZV90YWJsZShwYXRoKQorCisgICAgZGVmIGJ1aWxkX3BzKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bigiJXMgLU4wIC1vICVzLnBzICVzIiAlIChEVklQU19CSU5BUlksIHNlbGYuZG9jLCBzZWxmLmRvYykpCisKKyAgICBkZWYgYnVpbGRfaHRtbChzZWxmLCBidWlsZGRpcj1Ob25lLCBtYXhfc3BsaXRfZGVwdGg9Tm9uZSk6CisgICAgICAgIGlmIGJ1aWxkZGlyIGlzIE5vbmU6CisgICAgICAgICAgICBidWlsZGRpciA9IHNlbGYuZG9jCisgICAgICAgIGlmIG1heF9zcGxpdF9kZXB0aCBpcyBOb25lOgorICAgICAgICAgICAgbWF4X3NwbGl0X2RlcHRoID0gc2VsZi5vcHRpb25zLm1heF9zcGxpdF9kZXB0aAorICAgICAgICB0ZXhmaWxlID0gTm9uZQorICAgICAgICBmb3IgcCBpbiBzdHJpbmcuc3BsaXQob3MuZW52aXJvblsiVEVYSU5QVVRTIl0sIG9zLnBhdGhzZXApOgorICAgICAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4ocCwgc2VsZi5kb2MgKyAiLnRleCIpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmbik6CisgICAgICAgICAgICAgICAgdGV4ZmlsZSA9IGZuCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgbm90IHRleGZpbGU6CisgICAgICAgICAgICBzZWxmLndhcm5pbmcoIkNvdWxkIG5vdCBsb2NhdGUgJXMudGV4OyBhYm9ydGluZy4iICUgc2VsZi5kb2MpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICAjIHJlbW92ZSBsZWFkaW5nIC4vIChvciBlcXVpdi4pOyBtaWdodCBhdm9pZCBwcm9ibGVtcyB3LyBkdmlwcworICAgICAgICBpZiB0ZXhmaWxlWzoyXSA9PSBvcy5jdXJkaXIgKyBvcy5zZXA6CisgICAgICAgICAgICB0ZXhmaWxlID0gdGV4ZmlsZVsyOl0KKyAgICAgICAgIyBidWlsZCB0aGUgY29tbWFuZCBsaW5lIGFuZCBydW4gTGFUZVgySFRNTDoKKyAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoYnVpbGRkaXIpOgorICAgICAgICAgICAgb3MubWtkaXIoYnVpbGRkaXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgZm5hbWUgaW4gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihidWlsZGRpciwgIiouaHRtbCIpKToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZm5hbWUpCisgICAgICAgIGFyZ3MgPSBbTEFURVgySFRNTF9CSU5BUlksCisgICAgICAgICAgICAgICAgIi1pbml0X2ZpbGUiLCBzZWxmLmwyaF9hdXhfaW5pdF9maWxlLAorICAgICAgICAgICAgICAgICItZGlyIiwgYnVpbGRkaXIsCisgICAgICAgICAgICAgICAgdGV4ZmlsZQorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgc2VsZi5ydW4oc3RyaW5nLmpvaW4oYXJncykpICAgICAjIFhYWCBuZWVkIHF1b3RpbmchCisgICAgICAgICMgLi4uIHBvc3Rwcm9jZXNzCisgICAgICAgIHNodXRpbC5jb3B5ZmlsZShzZWxmLm9wdGlvbnMuc3R5bGVfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihidWlsZGRpciwgc2VsZi5kb2MgKyAiLmNzcyIpKQorICAgICAgICBzaHV0aWwuY29weWZpbGUob3MucGF0aC5qb2luKGJ1aWxkZGlyLCBzZWxmLmRvYyArICIuaHRtbCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGJ1aWxkZGlyLCAiaW5kZXguaHRtbCIpKQorICAgICAgICBpZiBtYXhfc3BsaXRfZGVwdGggIT0gMToKKyAgICAgICAgICAgIGlmIHNlbGYub3B0aW9ucy5udW1lcmljOgorICAgICAgICAgICAgICAgIGxhYmVsX2ZpbGUgPSBvcy5wYXRoLmpvaW4oYnVpbGRkaXIsICJsYWJlbHMucGwiKQorICAgICAgICAgICAgICAgIGZwID0gb3BlbihsYWJlbF9maWxlKQorICAgICAgICAgICAgICAgIGFib3V0X25vZGUgPSBOb25lCisgICAgICAgICAgICAgICAgdGFyZ2V0ID0gIiA9IHEvYWJvdXQvO1xuIgorICAgICAgICAgICAgICAgIHggPSBsZW4odGFyZ2V0KQorICAgICAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZVsteDpdID09IHRhcmdldDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgICAgICAgICBtID0gcmUuc2VhcmNoKHIiXHwobm9kZVxkK1wuW2Etel0rKVx8IiwgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFib3V0X25vZGUgPSBtLmdyb3VwKDEpCisgICAgICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weWZpbGUob3MucGF0aC5qb2luKGJ1aWxkZGlyLCBhYm91dF9ub2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oYnVpbGRkaXIsICJhYm91dC5odG1sIikpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwd2QgPSBvcy5nZXRjd2QoKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3MuY2hkaXIoYnVpbGRkaXIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYucnVuKCIlcyAlcyAqLmh0bWwiICUgKFBFUkxfQklOQVJZLCBOT0RFMkxBQkVMX1NDUklQVCkpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgb3MuY2hkaXIocHdkKQorCisgICAgZGVmIGJ1aWxkX3RleHQoc2VsZiwgdGVtcGRpcj1Ob25lKToKKyAgICAgICAgaWYgdGVtcGRpciBpcyBOb25lOgorICAgICAgICAgICAgdGVtcGRpciA9IHNlbGYuZG9jCisgICAgICAgIGluZGV4ZmlsZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCAiaW5kZXguaHRtbCIpCisgICAgICAgIHNlbGYucnVuKCIlcyAtbm9saXN0IC1kdW1wICVzID4lcy50eHQiCisgICAgICAgICAgICAgICAgICUgKExZTlhfQklOQVJZLCBpbmRleGZpbGUsIHNlbGYuZG9jKSkKKworICAgIGRlZiByZXF1aXJlX3RlbXBzKHNlbGYsIGJpbmFyeT1Ob25lKToKKyAgICAgICAgaWYgbm90IHNlbGYubGF0ZXhfcnVuczoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfYXV4KGJpbmFyeT1iaW5hcnkpCisKKyAgICBkZWYgd3JpdGVfbDJoX2F1eF9pbml0X2ZpbGUoc2VsZik6CisgICAgICAgIG9wdGlvbnMgPSBzZWxmLm9wdGlvbnMKKyAgICAgICAgZnAgPSBvcGVuKHNlbGYubDJoX2F1eF9pbml0X2ZpbGUsICJ3IikKKyAgICAgICAgZCA9IHN0cmluZ190b19wZXJsKG9zLnBhdGguZGlybmFtZShMMkhfSU5JVF9GSUxFKSkKKyAgICAgICAgZnAud3JpdGUoInBhY2thZ2UgbWFpbjtcbiIKKyAgICAgICAgICAgICAgICAgInB1c2ggKEBJTkMsICclcycpO1xuIgorICAgICAgICAgICAgICAgICAiJG15ZGlyID0gJyVzJztcbiIKKyAgICAgICAgICAgICAgICAgJSAoZCwgZCkpCisgICAgICAgIGZwLndyaXRlKG9wZW4oTDJIX0lOSVRfRklMRSkucmVhZCgpKQorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gb3B0aW9ucy5sMmhfaW5pdF9maWxlczoKKyAgICAgICAgICAgIGZwLndyaXRlKCJcbiMgaW5pdGlhbGl6YXRpb24gY29kZSBpbmNvcnBvcmF0ZWQgZnJvbTpcbiMgIikKKyAgICAgICAgICAgIGZwLndyaXRlKGZpbGVuYW1lKQorICAgICAgICAgICAgZnAud3JpdGUoIlxuIikKKyAgICAgICAgICAgIGZwLndyaXRlKG9wZW4oZmlsZW5hbWUpLnJlYWQoKSkKKyAgICAgICAgZnAud3JpdGUoIlxuIgorICAgICAgICAgICAgICAgICAiIyBhdXhpbGxhcnkgaW5pdCBmaWxlIGZvciBsYXRleDJodG1sXG4iCisgICAgICAgICAgICAgICAgICIjIGdlbmVyYXRlZCBieSBta2hvd3RvXG4iCisgICAgICAgICAgICAgICAgICIkTk9fQVVUT19MSU5LID0gMTtcbiIKKyAgICAgICAgICAgICAgICAgKQorICAgICAgICBsMmhvcHRpb24oZnAsICJBQk9VVF9GSUxFIiwgb3B0aW9ucy5hYm91dF9maWxlKQorICAgICAgICBsMmhvcHRpb24oZnAsICJJQ09OU0VSVkVSIiwgb3B0aW9ucy5pY29uX3NlcnZlcikKKyAgICAgICAgbDJob3B0aW9uKGZwLCAiSU1BR0VfVFlQRSIsIG9wdGlvbnMuaW1hZ2VfdHlwZSkKKyAgICAgICAgbDJob3B0aW9uKGZwLCAiQUREUkVTUyIsIG9wdGlvbnMuYWRkcmVzcykKKyAgICAgICAgbDJob3B0aW9uKGZwLCAiTUFYX0xJTktfREVQVEgiLCBvcHRpb25zLm1heF9saW5rX2RlcHRoKQorICAgICAgICBsMmhvcHRpb24oZnAsICJNQVhfU1BMSVRfREVQVEgiLCBvcHRpb25zLm1heF9zcGxpdF9kZXB0aCkKKyAgICAgICAgbDJob3B0aW9uKGZwLCAiRVhURVJOQUxfVVBfTElOSyIsIG9wdGlvbnMudXBfbGluaykKKyAgICAgICAgbDJob3B0aW9uKGZwLCAiRVhURVJOQUxfVVBfVElUTEUiLCBvcHRpb25zLnVwX3RpdGxlKQorICAgICAgICBsMmhvcHRpb24oZnAsICJHTE9CQUxfTU9EVUxFX0lOREVYIiwgb3B0aW9ucy5nbG9iYWxfbW9kdWxlX2luZGV4KQorICAgICAgICBmcC53cml0ZSgiMTtcbiIpCisgICAgICAgIGZwLmNsb3NlKCkKKworICAgIGRlZiBjbGVhbnVwKHNlbGYpOgorICAgICAgICBzZWxmLl9faGF2ZV90ZW1wcyA9IDAKKyAgICAgICAgZm9yIHBhdHRlcm4gaW4gKCIlcy5hdXgiLCAiJXMubG9nIiwgIiVzLm91dCIsICIlcy50b2MiLCAiJXMuYmttIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcy5pZHgiLCAiJXMuaWxnIiwgIiVzLmluZCIsICIlcy5wbGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzLmJibCIsICIlcy5ibGciLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1vZCVzLmlkeCIsICJtb2Qlcy5pbmQiLCAibW9kJXMuaWxnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICBzYWZlX3VubGluayhwYXR0ZXJuICUgc2VsZi5kb2MpCisgICAgICAgIG1hcChzYWZlX3VubGluaywgZ2xvYi5nbG9iKHNlbGYuZG9jICsgIiouc3luIikpCisgICAgICAgIGZvciBzcGVjIGluICgiSU1HKiIsICIqLnBsIiwgIldBUk5JTkdTIiwgImluZGV4LmRhdCIsICJtb2RpbmRleC5kYXQiKToKKyAgICAgICAgICAgIHBhdHRlcm4gPSBvcy5wYXRoLmpvaW4oc2VsZi5kb2MsIHNwZWMpCisgICAgICAgICAgICBtYXAoc2FmZV91bmxpbmssIGdsb2IuZ2xvYihwYXR0ZXJuKSkKKyAgICAgICAgaWYgImR2aSIgbm90IGluIHNlbGYub3B0aW9ucy5mb3JtYXRzOgorICAgICAgICAgICAgc2FmZV91bmxpbmsoc2VsZi5kb2MgKyAiLmR2aSIpCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoc2VsZi5kb2MgKyAiLXRlbXAtaHRtbCIpOgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLmRvYyArICItdGVtcC1odG1sIiwgaWdub3JlX2Vycm9ycz0xKQorICAgICAgICBpZiBub3Qgc2VsZi5vcHRpb25zLmxvZ2dpbmc6CisgICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5sb2dfZmlsZW5hbWUpCisgICAgICAgIGlmIG5vdCBzZWxmLm9wdGlvbnMuZGVidWdnaW5nOgorICAgICAgICAgICAgb3MudW5saW5rKHNlbGYubDJoX2F1eF9pbml0X2ZpbGUpCisKKyAgICBkZWYgcnVuKHNlbGYsIGNvbW1hbmQpOgorICAgICAgICBzZWxmLm1lc3NhZ2UoY29tbWFuZCkKKyAgICAgICAgcmMgPSBvcy5zeXN0ZW0oIiglcykgPC9kZXYvbnVsbCA+PiVzIDI+JjEiCisgICAgICAgICAgICAgICAgICAgICAgICUgKGNvbW1hbmQsIHNlbGYubG9nX2ZpbGVuYW1lKSkKKyAgICAgICAgaWYgcmM6CisgICAgICAgICAgICBzZWxmLndhcm5pbmcoCisgICAgICAgICAgICAgICAgIlNlc3Npb24gdHJhbnNjcmlwdCBhbmQgZXJyb3IgbWVzc2FnZXMgYXJlIGluICVzLiIKKyAgICAgICAgICAgICAgICAlIHNlbGYubG9nX2ZpbGVuYW1lKQorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiVGhlIHJlbGV2YW50IGxpbmVzIGZyb20gdGhlIHRyYW5zY3JpcHQgYXJlOlxuIikKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIi0iICogNzIgKyAiXG4iKQorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZWxpbmVzKGdldF9ydW5fdHJhbnNjcmlwdChzZWxmLmxvZ19maWxlbmFtZSkpCisgICAgICAgICAgICBzeXMuZXhpdChyYykKKworICAgIGRlZiBtZXNzYWdlKHNlbGYsIG1zZyk6CisgICAgICAgIG1zZyA9ICIrKysgIiArIG1zZworICAgICAgICBpZiBub3Qgc2VsZi5vcHRpb25zLnF1aWV0OgorICAgICAgICAgICAgcHJpbnQgbXNnCisgICAgICAgIHNlbGYubG9nKG1zZyArICJcbiIpCisKKyAgICBkZWYgd2FybmluZyhzZWxmLCBtc2cpOgorICAgICAgICBtc2cgPSAiKioqICVzXG4iICUgbXNnCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUobXNnKQorICAgICAgICBzZWxmLmxvZyhtc2cpCisKKyAgICBkZWYgbG9nKHNlbGYsIG1zZyk6CisgICAgICAgIGZwID0gb3BlbihzZWxmLmxvZ19maWxlbmFtZSwgImEiKQorICAgICAgICBmcC53cml0ZShtc2cpCisgICAgICAgIGZwLmNsb3NlKCkKKworCitkZWYgZ2V0X3J1bl90cmFuc2NyaXB0KGZpbGVuYW1lKToKKyAgICAiIiJSZXR1cm4gbGluZXMgZnJvbSB0aGUgdHJhbnNjcmlwdCBmaWxlIGZvciB0aGUgbW9zdCByZWNlbnQgcnVuKCkgY2FsbC4iIiIKKyAgICBmcCA9IG9wZW4oZmlsZW5hbWUpCisgICAgbGluZXMgPSBmcC5yZWFkbGluZXMoKQorICAgIGZwLmNsb3NlKCkKKyAgICBsaW5lcy5yZXZlcnNlKCkKKyAgICBMID0gW10KKyAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgTC5hcHBlbmQobGluZSkKKyAgICAgICAgaWYgbGluZVs6NF0gPT0gIisrKyAiOgorICAgICAgICAgICAgYnJlYWsKKyAgICBMLnJldmVyc2UoKQorICAgIHJldHVybiBMCisKKworZGVmIHNhZmVfdW5saW5rKHBhdGgpOgorICAgICIiIlVubGluayBhIGZpbGUgd2l0aG91dCByYWlzaW5nIGFuIGVycm9yIGlmIGl0IGRvZXNuJ3QgZXhpc3QuIiIiCisgICAgdHJ5OgorICAgICAgICBvcy51bmxpbmsocGF0aCkKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgIHBhc3MKKworCitkZWYgc3BsaXRfcGF0aG5hbWUocGF0aCk6CisgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCBwYXRoKSkKKyAgICBkaXJuYW1lLCBiYXNlbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKKyAgICBpZiBiYXNlbmFtZVstNDpdID09ICIudGV4IjoKKyAgICAgICAgYmFzZW5hbWUgPSBiYXNlbmFtZVs6LTRdCisgICAgcmV0dXJuIGRpcm5hbWUsIGJhc2VuYW1lCisKKworX2RvY3R5cGVfcnggPSByZS5jb21waWxlKHIiXFxkb2N1bWVudGNsYXNzKD86XFtbXl1dKlxdKT97KFthLXpBLVpdKil9IikKK2RlZiBnZXRfZG9jdHlwZShwYXRoKToKKyAgICBmcCA9IG9wZW4ocGF0aCkKKyAgICBkb2N0eXBlID0gTm9uZQorICAgIHdoaWxlIDE6CisgICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgbSA9IF9kb2N0eXBlX3J4Lm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG06CisgICAgICAgICAgICBkb2N0eXBlID0gbS5ncm91cCgxKQorICAgICAgICAgICAgYnJlYWsKKyAgICBmcC5jbG9zZSgpCisgICAgcmV0dXJuIGRvY3R5cGUKKworCitkZWYgbWFpbigpOgorICAgIG9wdGlvbnMgPSBPcHRpb25zKCkKKyAgICB0cnk6CisgICAgICAgIGFyZ3MgPSBvcHRpb25zLnBhcnNlKHN5cy5hcmd2WzE6XSkKKyAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6CisgICAgICAgIGVycm9yKG9wdGlvbnMsIG1zZykKKyAgICBpZiBub3QgYXJnczoKKyAgICAgICAgIyBhdHRlbXB0IHRvIGxvY2F0ZSBzaW5nbGUgLnRleCBmaWxlIGluIGN1cnJlbnQgZGlyZWN0b3J5OgorICAgICAgICBhcmdzID0gZ2xvYi5nbG9iKCIqLnRleCIpCisgICAgICAgIGlmIG5vdCBhcmdzOgorICAgICAgICAgICAgZXJyb3Iob3B0aW9ucywgIk5vIGZpbGUgdG8gcHJvY2Vzcy4iKQorICAgICAgICBpZiBsZW4oYXJncykgPiAxOgorICAgICAgICAgICAgZXJyb3Iob3B0aW9ucywgIkNvdWxkIG5vdCBkZWR1Y2Ugd2hpY2ggZmlsZXMgc2hvdWxkIGJlIHByb2Nlc3NlZC4iKQorICAgICMKKyAgICAjIHBhcmFtZXRlcnMgYXJlIHByb2Nlc3NlZCwgbGV0J3MgZ28hCisgICAgIworICAgIGZvciBwYXRoIGluIGFyZ3M6CisgICAgICAgIEpvYihvcHRpb25zLCBwYXRoKS5idWlsZCgpCisKKworZGVmIGwyaG9wdGlvbihmcCwgb3B0aW9uLCB2YWx1ZSk6CisgICAgaWYgdmFsdWU6CisgICAgICAgIGZwLndyaXRlKCckJXMgPSAiJXMiO1xuJyAlIChvcHRpb24sIHN0cmluZ190b19wZXJsKHN0cih2YWx1ZSkpKSkKKworCitfdG9fcGVybCA9IHt9Citmb3IgYyBpbiBtYXAoY2hyLCByYW5nZSgxLCAyNTYpKToKKyAgICBfdG9fcGVybFtjXSA9IGMKK190b19wZXJsWyJAIl0gPSAiXFxAIgorX3RvX3BlcmxbIiQiXSA9ICJcXCQiCitfdG9fcGVybFsnIiddID0gJ1xcIicKKworZGVmIHN0cmluZ190b19wZXJsKHMpOgorICAgIHJldHVybiBzdHJpbmcuam9pbihtYXAoX3RvX3BlcmwuZ2V0LCBzKSwgJycpCisKKworZGVmIGNoZWNrX2Zvcl9iaWJ0ZXgoZmlsZW5hbWUpOgorICAgIGZwID0gb3BlbihmaWxlbmFtZSkKKyAgICBwb3MgPSBzdHJpbmcuZmluZChmcC5yZWFkKCksIHIiXGJpYmRhdGF7IikKKyAgICBmcC5jbG9zZSgpCisgICAgcmV0dXJuIHBvcyA+PSAwCisKK2RlZiB1bmlxaWZ5X21vZHVsZV90YWJsZShmaWxlbmFtZSk6CisgICAgbGluZXMgPSBvcGVuKGZpbGVuYW1lKS5yZWFkbGluZXMoKQorICAgIGlmIGxlbihsaW5lcykgPiAxOgorICAgICAgICBpZiBsaW5lc1stMV0gPT0gbGluZXNbLTJdOgorICAgICAgICAgICAgZGVsIGxpbmVzWy0xXQorICAgIG9wZW4oZmlsZW5hbWUsICJ3Iikud3JpdGVsaW5lcyhsaW5lcykKKworCitkZWYgbmV3X2luZGV4KGZpbGVuYW1lLCBsYWJlbD0iZ2VuaW5kZXgiKToKKyAgICBmcCA9IG9wZW4oZmlsZW5hbWUsICJ3IikKKyAgICBmcC53cml0ZShyIiIiXAorXGJlZ2lue3RoZWluZGV4fQorXGxhYmVseyVzfQorXGVuZHt0aGVpbmRleH0KKyIiIiAlIGxhYmVsKQorICAgIGZwLmNsb3NlKCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL21raW5mbyBiL2RvYy90b29scy9ta2luZm8KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWRiYTFkYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy9ta2luZm8KQEAgLTAsMCArMSw0OCBAQAorIyEgL2Jpbi9zaAorIyAgLSotIEtzaCAtKi0KKworIyAgU2NyaXB0IHRvIGRyaXZlIHRoZSBIVE1MLWluZm8gY29udmVyc2lvbiBwcm9jZXNzLgorIyAgUGFzcyBpbiBhIHNpbmdsZSBwYXJhbWV0ZXI6IHRoZSBuYW1lIG9mIHRoZSB0b3AtbGV2ZWwgSFRNTCBmaWxlCisjICBnZW5lcmF0ZWQgYnkgTGFUZVgySFRNTC4KKyMKKyMgIFdyaXR0ZW4gYnkgRnJlZCBMLiBEcmFrZSwgSnIuIDxmZHJha2VAYWNtLm9yZz4KKworUEVSTD0ke1BFUkw6LXBlcmx9CitFTUFDUz0ke0VNQUNTOi1lbWFjc30KK01BS0VJTkZPPSR7TUFLRUlORk86LW1ha2VpbmZvfQorCisKKyMgTm9ybWFsaXplIGZpbGUgbmFtZSBzaW5jZSBzb21ldGhpbmcgY2FsbGVkIGJ5IGh0bWwydGV4aS5wbCBzZWVtcyB0bworIyBzY3JldyB1cCB3aXRoIHJlbGF0aXZlIHBhdGggbmFtZXMuCitGSUxFTkFNRT0iJDEiCitET0NESVI9YGRpcm5hbWUgIiRGSUxFTkFNRSJgCitET0NGSUxFPWBiYXNlbmFtZSAiJEZJTEVOQU1FImAKK0RPQ05BTUU9YGJhc2VuYW1lICIkRklMRU5BTUUiIC5odG1sYAorCisjIE5vdyBidWlsZCB0aGUgcmVhbCBkaXJlY3RvcnkgbmFtZXMsIGFuZCBsb2NhdGUgb3VyIHN1cHBvcnQgc3R1ZmY6CitXT1JLRElSPWBwd2RgCitjZCBgZGlybmFtZSAkMGAKK1RPT0xTRElSPWBwd2RgCitjZCAkRE9DRElSCitET0NESVI9YHB3ZGAKK2NkICRXT1JLRElSCisKKworcnVuKCkgeworICAgICMgc2hvdyB3aGF0IHdlJ3JlIGRvaW5nLCBsaWtlIG1ha2UgZG9lczoKKyAgICBlY2hvICIkKiIKKyAgICAkKiB8fCBleGl0ICQ/Cit9CisKKworIyBnZW5lcmF0ZSB0aGUgVGV4aW5mbyBmaWxlOgorCitydW4gJFBFUkwgLUkkVE9PTFNESVIgJFRPT0xTRElSL2h0bWwydGV4aS5wbCAkRE9DRElSLyRET0NGSUxFCitydW4gJEVNQUNTIC1iYXRjaCAtbCAkVE9PTFNESVIvZml4aW5mby5lbCAkRE9DTkFNRS50ZXhpCitybSAtZiAkRE9DTkFNRS50ZXhpfgorCisKKyMgZ2VuZXJhdGUgdGhlIC5pbmZvIGZpbGVzOgorCitydW4gJE1BS0VJTkZPIC0tZm9vdG5vdGUtc3R5bGUgZW5kIC0tZmlsbC1jb2x1bW4gNzIgXAorCSAgICAgIC0tcGFyYWdyYXBoLWluZGVudCAwICRET0NOQU1FLnRleGkKZGlmZiAtLWdpdCBhL2RvYy90b29scy9ta21vZGluZGV4IGIvZG9jL3Rvb2xzL21rbW9kaW5kZXgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWYyZGEwZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy9ta21vZGluZGV4CkBAIC0wLDAgKzEsMTM2IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisjICAtKi0gUHl0aG9uIC0qLQorCisiIiJ1c2FnZTogJShwcm9ncmFtKXMgW29wdGlvbnNdIGZpbGUuLi4KKworU3VwcG9ydGVkIG9wdGlvbnM6CisKKyAgICAtLWFkZHJlc3MgYWRkcgorICAgIC1hIGFkZHIgICAgICAgICBTZXQgdGhlIGFkZHJlc3MgdGV4dCB0byBpbmNsdWRlIGF0IHRoZSBlbmQgb2YgdGhlIGdlbmVyYXRlZAorICAgICAgICAgICAgICAgICAgICBIVE1MOyB0aGlzIHNob3VsZCBiZSB1c2VkIGZvciBjb250YWN0IGluZm9ybWF0aW9uLgorICAgIC0tY29sdW1ucyBjb2xzCisgICAgLWMgY29scyAgICAgICAgIFNldCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgZWFjaCBpbmRleCBzZWN0aW9uIHNob3VsZCBiZQorICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ZWQgaW4uICBUaGUgZGVmYXVsdCBpcyAxLgorICAgIC0taGVscAorICAgIC1oICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaGVscCBtZXNzYWdlLgorICAgIC0tbGV0dGVycworICAgIC1sICAgICAgICAgICAgICBTcGxpdCB0aGUgb3V0cHV0IGludG8gc2VjdGlvbnMgYnkgbGV0dGVyLgorICAgIC0tb3V0cHV0IGZpbGUKKyAgICAtbyBmaWxlICAgICAgICAgV3JpdGUgb3V0cHV0IHRvICdmaWxlJyBpbnN0ZWFkIG9mIHN0YW5kYXJkIG91dC4KKyAgICAtLWljb25zZXJ2ZXIgaXMgVXNlICdpcycgYXMgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGljb25zIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbiBiYXIuICBUaGUgZGVmYXVsdCBpcyAnaWNvbnMnLgorICAgIC0tdGl0bGUgc3RyICAgICBTZXQgdGhlIHBhZ2UgdGl0bGUgdG8gJ3N0cicuICBUaGUgZGVmYXVsdCBpcyAnR2xvYmFsCisgICAgICAgICAgICAgICAgICAgIE1vZHVsZSBJbmRleCcuCisgICAgLS11cGxpbmsgdXJsICAgIFNldCB0aGUgdXB3YXJkIGxpbmsgVVJMLiAgVGhlIGRlZmF1bHQgaXMgJy4vJy4KKyAgICAtLXVwdGl0bGUgc3RyICAgU2V0IHRoZSB1cHdhcmQgbGluayB0aXRsZS4gIFRoZSBkZWZhdWx0IGlzICdQeXRob24KKyAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiBJbmRleCcuCisiIiIKK2ltcG9ydCBidWlsZGluZGV4CitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN0cmluZworaW1wb3J0IHN1cHBvcnQKK2ltcG9ydCBzeXMKKworCitjbGFzcyBJbmRleE9wdGlvbnMoc3VwcG9ydC5PcHRpb25zKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHN1cHBvcnQuT3B0aW9ucy5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmFkZF9hcmdzKCJsIiwgWyJsZXR0ZXJzIl0pCisgICAgICAgIHNlbGYubGV0dGVycyA9IDAKKworICAgIGRlZiBoYW5kbGVfb3B0aW9uKHNlbGYsIG9wdCwgdmFsKToKKyAgICAgICAgaWYgb3B0IGluICgiLWwiLCAiLS1sZXR0ZXJzIik6CisgICAgICAgICAgICBzZWxmLmxldHRlcnMgPSAxCisKKyAgICBkZWYgdXNhZ2Uoc2VsZik6CisgICAgICAgIHByb2dyYW0gPSBvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKQorICAgICAgICBwcmludCBfX2RvY19fICUgeyJwcm9ncmFtIjogcHJvZ3JhbX0KKworCitjbGFzcyBOb2RlKGJ1aWxkaW5kZXguTm9kZSk6CisgICAgYW5ub3RhdGlvbiA9ICIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGluaywgc3RyLCBzZXFubyk6CisgICAgICAgIHBhcnRzID0gc3RyaW5nLnNwbGl0KHN0ciwgTm9uZSwgMSkKKyAgICAgICAgaWYgcGFydHNbMF1bLTU6XSA9PSAiPC90dD4iOgorICAgICAgICAgICAgc2VsZi5tb2RuYW1lID0gcGFydHNbMF1bOi01XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5tb2RuYW1lID0gcGFydHNbMF0KKyAgICAgICAgaWYgbGVuKHBhcnRzKSA9PSAyOgorICAgICAgICAgICAgc2VsZi5hbm5vdGF0aW9uID0gcGFydHNbMV0KKyAgICAgICAgYnVpbGRpbmRleC5Ob2RlLl9faW5pdF9fKHNlbGYsIGxpbmssIHNlbGYubW9kbmFtZSwgc2Vxbm8pCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICc8dHQgY2xhc3M9Im1vZHVsZSI+JXM8L3R0PiAlcycgXAorICAgICAgICAgICAgICAgJSAoc2VsZi5tb2RuYW1lLCBzZWxmLmFubm90YXRpb24pCisKK19yeCA9IHJlLmNvbXBpbGUoCisgICAgIjxkdD48YSBocmVmPScobW9kdWxlLS4qXC5odG1sKSNsMmgtXGQrJz48dHQgY2xhc3M9J21vZHVsZSc+IgorICAgICIoW2EtekEtWl9dW2EtekEtWjAtOV8uXSo8L3R0Pihccyo8ZW0+IgorICAgICJcKDxzcGFuIGNsYXNzPSdwbGF0Zm9ybSc+Lio8L3NwYW4+XCk8L2VtPik/KTwvYT4iKQorCitkZWYgbWFpbigpOgorICAgIG9wdGlvbnMgPSBJbmRleE9wdGlvbnMoKQorICAgIG9wdGlvbnMudmFyaWFibGVzWyJ0aXRsZSJdID0gIkdsb2JhbCBNb2R1bGUgSW5kZXgiCisgICAgb3B0aW9ucy5wYXJzZShzeXMuYXJndlsxOl0pCisgICAgYXJncyA9IG9wdGlvbnMuYXJncworICAgIGlmIG5vdCBhcmdzOgorICAgICAgICBhcmdzID0gWyItIl0KKyAgICAjCisgICAgIyBDb2xsZWN0IHRoZSBpbnB1dCBkYXRhOgorICAgICMKKyAgICBub2RlcyA9IFtdCisgICAgc2Vxbm8gPSAwCisgICAgaGFzX3BsYXRfZmxhZyA9IDAKKyAgICBmb3IgaWZuIGluIGFyZ3M6CisgICAgICAgIGlmIGlmbiA9PSAiLSI6CisgICAgICAgICAgICBpZnAgPSBzeXMuc3RkaW4KKyAgICAgICAgICAgIGRpcm5hbWUgPSAnJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWZwID0gb3BlbihpZm4pCisgICAgICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKGlmbikKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGxpbmUgPSBpZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG0gPSBfcngubWF0Y2gobGluZSkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgIyBUaGlzIGxpbmUgc3BlY2lmaWVzIGEgbW9kdWxlIQorICAgICAgICAgICAgICAgIGJhc2VuYW1lLCBtb2RuYW1lID0gbS5ncm91cCgxLCAyKQorICAgICAgICAgICAgICAgIGhhc19wbGF0X2ZsYWcgPSBoYXNfcGxhdF9mbGFnIG9yIG0uZ3JvdXAoMykKKyAgICAgICAgICAgICAgICBsaW5rZmlsZSA9IG9zLnBhdGguam9pbihkaXJuYW1lLCBiYXNlbmFtZSkKKyAgICAgICAgICAgICAgICBub2Rlcy5hcHBlbmQoTm9kZSgnPGEgaHJlZj0iJXMiPicgJSBsaW5rZmlsZSwgbW9kbmFtZSwgc2Vxbm8pKQorICAgICAgICAgICAgICAgIHNlcW5vID0gc2Vxbm8gKyAxCisgICAgICAgIGlmcC5jbG9zZSgpCisgICAgIworICAgICMgR2VuZXJhdGUgYWxsIG91dHB1dDoKKyAgICAjCisgICAgbnVtX25vZGVzID0gbGVuKG5vZGVzKQorICAgICMgSGVyZSdzIHRoZSBIVE1MIGdlbmVyYXRpb246CisgICAgcGFydHMgPSBbb3B0aW9ucy5nZXRfaGVhZGVyKCksCisgICAgICAgICAgICAgYnVpbGRpbmRleC5wcm9jZXNzX25vZGVzKG5vZGVzLCBvcHRpb25zLmNvbHVtbnMsIG9wdGlvbnMubGV0dGVycyksCisgICAgICAgICAgICAgb3B0aW9ucy5nZXRfZm9vdGVyKCksCisgICAgICAgICAgICAgXQorICAgIGlmIGhhc19wbGF0X2ZsYWc6CisgICAgICAgIHBhcnRzLmluc2VydCgxLCBQTEFUX0RJU0NVU1MpCisgICAgaHRtbCA9IHN0cmluZy5qb2luKHBhcnRzLCAnJykKKyAgICBwcm9ncmFtID0gb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkKKyAgICBmcCA9IG9wdGlvbnMuZ2V0X291dHB1dF9maWxlKCkKKyAgICBmcC53cml0ZShzdHJpbmcucnN0cmlwKGh0bWwpICsgIlxuIikKKyAgICBpZiBvcHRpb25zLm91dHB1dGZpbGUgPT0gIi0iOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCIlczogJWQgaW5kZXggbm9kZXNcbiIgJSAocHJvZ3JhbSwgbnVtX25vZGVzKSkKKyAgICBlbHNlOgorICAgICAgICBwcmludAorICAgICAgICBwcmludCAiJXM6ICVkIGluZGV4IG5vZGVzIiAlIChwcm9ncmFtLCBudW1fbm9kZXMpCisKKworUExBVF9ESVNDVVNTID0gIiIiCis8cD4gU29tZSBtb2R1bGUgbmFtZXMgYXJlIGZvbGxvd2VkIGJ5IGFuIGFubm90YXRpb24gaW5kaWNhdGluZyB3aGF0CitwbGF0Zm9ybSB0aGV5IGFyZSBhdmFpbGFibGUgb24uPC9wPgorCisiIiIKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL21rc291cmNlcGtnIGIvZG9jL3Rvb2xzL21rc291cmNlcGtnCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMzZWE4NjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvbWtzb3VyY2Vwa2cKQEAgLTAsMCArMSwxNjMgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyMgIC0qLSBQeXRob24gLSotCisKKyIiIiUocHJvZ3JhbSlzIC0gc2NyaXB0IHRvIGNyZWF0ZSB0aGUgbGF0ZXggc291cmNlIGRpc3RyaWJ1dGlvbgorCit1c2FnZToKKyAgICAgJShwcm9ncmFtKXMgWy10fC0tdG9vbHNdIHJlbGVhc2UgW3RhZ10KKword2l0aCAtdHwtLXRvb2xzOiAgZG9lc24ndCBpbmNsdWRlIHRoZSBkb2N1bWVudHMsIG9ubHkgdGhlIGZyYW1ld29yaworCit3aXRob3V0IFt0YWddOiAgZ2VuZXJhdGUgZnJvbSB0aGUgY3VycmVudCB2ZXJzaW9uIHRoYXQncyBjaGVja2VkIGluCisgICAgIAkgICAoKk5PVCogd2hhdCdzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSEpCisKK3dpdGggW3RhZ106ICBnZW5lcmF0ZSBmcm9tIHRoZSBuYW1lZCB0YWcKKyIiIgorIyogc2hvdWxkIGJlIG1vZGlmaWVkIHRvIGdldCB0aGUgUHl0aG9uIHZlcnNpb24gbnVtYmVyIGF1dG9tYXRpY2FsbHkKKyMgIGZyb20gdGhlIE1ha2VmaWxlIG9yIHNvbWVwbGFjZS4KKworaW1wb3J0IGdldG9wdAoraW1wb3J0IGdsb2IKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKKworaW1wb3J0IGN2c2luZm8KKworCitxdWlldCA9IDAKK3J4ID0gcmUuY29tcGlsZShyIjpleHQ6KD86W2EtekEtWjAtOV0rKUBjdnNcLihbYS16QS1aMC05XSspLnNvdXJjZWZvcmdlLm5ldDoiCisgICAgICAgICAgICAgICAgciIvY3Zzcm9vdC9cMSIpCisKKworZGVmIG1haW4oKToKKyAgICAgZ2xvYmFsIHF1aWV0CisgICAgIHRyeToKKyAgICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICJhYmd0enEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiYWxsIiwgImJ6aXAyIiwgImd6aXAiLCAidG9vbHMiLCAiemlwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInF1aWV0Il0pCisgICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IsIGU6CisgICAgICAgICAgdXNhZ2Uod2FybmluZz1zdHIoZSkpCisgICAgICAgICAgc3lzLmV4aXQoMikKKyAgICAgaWYgbGVuKGFyZ3MpIG5vdCBpbiAoMSwgMik6CisgICAgICAgICAgdXNhZ2Uod2FybmluZz0id3JvbmcgbnVtYmVyIG9mIHBhcmFtZXRlcnMiKQorICAgICAgICAgIHN5cy5leGl0KDIpCisgICAgIHRvb2xzID0gMAorICAgICBmb3JtYXRzID0ge30KKyAgICAgZm9yIG9wdCwgYXJnIGluIG9wdHM6CisgICAgICAgICAgaWYgb3B0IGluICgiLXQiLCAiLS10b29scyIpOgorICAgICAgICAgICAgICAgdG9vbHMgPSAxCisgICAgICAgICAgZWxpZiBvcHQgaW4gKCItcSIsICItLXF1aWV0Iik6CisgICAgICAgICAgICAgICBxdWlldCA9IHF1aWV0ICsgMQorICAgICAgICAgIGVsaWYgb3B0IGluICgiLWIiLCAiLS1iemlwMiIpOgorICAgICAgICAgICAgICAgZm9ybWF0c1siYnppcDIiXSA9IDEKKyAgICAgICAgICBlbGlmIG9wdCBpbiAoIi1nIiwgIi0tZ3ppcCIpOgorICAgICAgICAgICAgICAgZm9ybWF0c1siZ3ppcCJdID0gMQorICAgICAgICAgIGVsaWYgb3B0IGluICgiLXoiLCAiLS16aXAiKToKKyAgICAgICAgICAgICAgIGZvcm1hdHNbInppcCJdID0gMQorICAgICAgICAgIGVsaWYgb3B0IGluICgiLWEiLCAiLS1hbGwiKToKKyAgICAgICAgICAgICAgIGZvcm1hdHNbImJ6aXAyIl0gPSAxCisgICAgICAgICAgICAgICBmb3JtYXRzWyJnemlwIl0gPSAxCisgICAgICAgICAgICAgICBmb3JtYXRzWyJ6aXAiXSA9IDEKKyAgICAgaWYgZm9ybWF0czoKKyAgICAgICAgICAjIG1ha2Ugb3JkZXIgaHVtYW4tcHJlZGljdGFibGUKKyAgICAgICAgICBmb3JtYXRzID0gZm9ybWF0cy5rZXlzKCkKKyAgICAgICAgICBmb3JtYXRzLnNvcnQoKQorICAgICBlbHNlOgorICAgICAgICAgIGZvcm1hdHMgPSBbImd6aXAiXQorICAgICByZWxlYXNlID0gYXJnc1swXQorICAgICBjdnN0YWcgPSBOb25lCisgICAgIGlmIGxlbihhcmdzKSA+IDE6CisgICAgICAgICAgY3ZzdGFnID0gYXJnc1sxXQorICAgICB0ZW1wZGlyID0gdGVtcGZpbGUubWt0ZW1wKCkKKyAgICAgb3MubWtkaXIodGVtcGRpcikKKyAgICAgcGtnZGlyID0gb3MucGF0aC5qb2luKHRlbXBkaXIsICJQeXRob24tIiArIHJlbGVhc2UpCisgICAgIG9zLm1rZGlyKHBrZ2RpcikKKyAgICAgcHdkID0gb3MuZ2V0Y3dkKCkKKyAgICAgbXlkaXIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSkKKyAgICAgaW5mbyA9IGN2c2luZm8uUmVwb3NpdG9yeUluZm8obXlkaXIpCisgICAgIGN2c3Jvb3QgPSBpbmZvLmdldF9jdnNyb290KCkKKyAgICAgbSA9IHJ4Lm1hdGNoKGN2c3Jvb3QpCisgICAgIGlmIG06CisgICAgICAgICAgIyBJZiB0aGlzIGlzIGFuIGF1dGhlbnRpY2F0ZWQgU291cmNlRm9yZ2UgcmVwb3NpdG9yeSwgY29udmVydCB0bworICAgICAgICAgICMgYW5vbnltb3VzIHVzYWdlIGZvciB0aGUgZXhwb3J0L2NoZWNrb3V0LCBzaW5jZSB0aGF0IGF2b2lkcyB0aGUKKyAgICAgICAgICAjIFNTSCBvdmVyaGVhZC4KKyAgICAgICAgICBncm91cCA9IG0uZ3JvdXAoMSkKKyAgICAgICAgICBjdnNyb290ID0gIjpwc2VydmVyOmFub255bW91c0BjdnMuJXMuc291cmNlZm9yZ2UubmV0Oi9jdnNyb290LyVzIiBcCisgICAgICAgICAgICAgICAgICAgICUgKGdyb3VwLCBncm91cCkKKyAgICAgICAgICAjIEZvciBzb21lIHJlYXNvbiwgU291cmNlRm9yZ2UvQ1ZTIGRvZXNuJ3Qgc2VlbSB0byBjYXJlIHRoYXQgd2UKKyAgICAgICAgICAjIG1pZ2h0IG5vdCBoYXZlIGRvbmUgYSAiY3ZzIGxvZ2luIiB0byB0aGUgYW5vbnltb3VzIHNlcnZlci4KKyAgICAgICAgICAjIFRoYXQgYXZvaWRzIGEgbG90IG9mIHBhaW5mdWwgZ3VuayBoZXJlLgorICAgICBvcy5jaGRpcihwa2dkaXIpCisgICAgIGlmIG5vdCBxdWlldDoKKyAgICAgICAgICBwcmludCAiLS0tIGN1cnJlbnQgZGlyZWN0b3J5IGlzOiIsIHBrZ2RpcgorICAgICBpZiBjdnN0YWc6CisgICAgICAgICAgcnVuKCJjdnMgLWQlcyBleHBvcnQgLXIgJXMgLWQgRG9jIHB5dGhvbi9kaXN0L3NyYy9Eb2MiCisgICAgICAgICAgICAgICUgKGN2c3Jvb3QsIGN2c3RhZykpCisgICAgIGVsc2U6CisgICAgICAgICAgcnVuKCJjdnMgLVEgLWQlcyBjaGVja291dCAtZCBEb2MgcHl0aG9uL2Rpc3Qvc3JjL0RvYyIgJSBjdnNyb290KQorICAgICAgICAgICMgcmVtb3ZlIENWUyBkaXJlY3RvcmllcworICAgICAgICAgIGZvciBwIGluICgnKi9DVlMnLCAnKi8qL0NWUycsICcqLyovKi9DVlMnKToKKyAgICAgICAgICAgICAgIG1hcChzaHV0aWwucm10cmVlLCBnbG9iLmdsb2IocCkpCisgICAgICAgICAgZm9yIGYgaW4gKCcuY3ZzaWdub3JlJywgJyovLmN2c2lnbm9yZScpOgorICAgICAgICAgICAgICAgbWFwKG9zLnVubGluaywgZ2xvYi5nbG9iKGYpKQorICAgICBMSUNFTlNFID0gb3MucGF0aC5ub3JtcGF0aCgKKyAgICAgICAgICBvcy5wYXRoLmpvaW4obXlkaXIsIG9zLnBhcmRpciwgb3MucGFyZGlyLCAiTElDRU5TRSIpKQorICAgICBzaHV0aWwuY29weWZpbGUoTElDRU5TRSwgIkRvYy9MSUNFTlNFIikKKyAgICAgaWYgdG9vbHM6CisgICAgICAgICAgYXJjaGl2ZSA9ICJkb2N0b29scy0iICsgcmVsZWFzZQorICAgICAgICAgICMgd2UgZG9uJ3Qgd2FudCB0aGUgYWN0dWFsIGRvY3VtZW50cyBpbiB0aGlzIGNhc2U6CisgICAgICAgICAgZm9yIGQgaW4gKCJhcGkiLCAiZGlzdCIsICJkb2MiLCAiZXh0IiwgImluc3QiLAorICAgICAgICAgICAgICAgICAgICAibGliIiwgIm1hYyIsICJyZWYiLCAidHV0Iik6CisgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKG9zLnBhdGguam9pbihvcy5wYXRoLmpvaW4ocGtnZGlyLCAiRG9jIiksIGQpKQorICAgICBlbHNlOgorICAgICAgICAgIGFyY2hpdmUgPSAibGF0ZXgtIiArIHJlbGVhc2UKKworICAgICAjIFhYWCBzaG91bGQgYWxzbyByZW1vdmUgdGhlIC5jdnNpZ25vcmUgZmlsZXMgYXQgdGhpcyBwb2ludAorCisgICAgIG9zLmNoZGlyKHRlbXBkaXIpCisgICAgIGFyY2hpdmUgPSBvcy5wYXRoLmpvaW4ocHdkLCBhcmNoaXZlKQorICAgICBmb3IgZm9ybWF0IGluIGZvcm1hdHM6CisgICAgICAgICAgaWYgZm9ybWF0ID09ICJiemlwMiI6CisgICAgICAgICAgICAgICBydW4oInRhciBjZiAtIFB5dGhvbi0lcyB8IGJ6aXAyIC05ID4lcy50YXIuYnoyIgorICAgICAgICAgICAgICAgICAgICUgKHJlbGVhc2UsIGFyY2hpdmUpKQorICAgICAgICAgIGVsaWYgZm9ybWF0ID09ICJnemlwIjoKKyAgICAgICAgICAgICAgIHJ1bigidGFyIGNmIC0gUHl0aG9uLSVzIHwgZ3ppcCAtOSA+JXMudGd6IgorICAgICAgICAgICAgICAgICAgICUgKHJlbGVhc2UsIGFyY2hpdmUpKQorICAgICAgICAgIGVsaWYgZm9ybWF0ID09ICJ6aXAiOgorICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoYXJjaGl2ZSArICIuemlwIik6CisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhhcmNoaXZlICsgIi56aXAiKQorICAgICAgICAgICAgICAgcnVuKCJ6aXAgLXEgLXI5ICVzLnppcCBQeXRob24tJXMiCisgICAgICAgICAgICAgICAgICAgJSAoYXJjaGl2ZSwgcmVsZWFzZSkpCisKKyAgICAgIyBjbGVhbiB1cCB0aGUgd29yayBhcmVhOgorICAgICBvcy5jaGRpcihwd2QpCisgICAgIHNodXRpbC5ybXRyZWUodGVtcGRpcikKKworCitkZWYgcnVuKGNtZCk6CisgICAgIGlmIHF1aWV0IDwgMjoKKyAgICAgICAgICBwcmludCAiKysrIiwgY21kCisgICAgIGlmIHF1aWV0OgorICAgICAgICAgIGNtZCA9ICIlcyA+L2Rldi9udWxsIiAlIGNtZAorICAgICByYyA9IG9zLnN5c3RlbShjbWQpCisgICAgIGlmIHJjOgorICAgICAgICAgIHN5cy5leGl0KHJjKQorCisKK2RlZiB1c2FnZSh3YXJuaW5nPU5vbmUpOgorICAgICBzdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgIHN5cy5zdGRvdXQgPSBzeXMuc3RkZXJyCisgICAgIHByb2dyYW0gPSBvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKQorICAgICB0cnk6CisgICAgICAgICAgaWYgd2FybmluZzoKKyAgICAgICAgICAgICAgIHByaW50ICIlczogJXNcbiIgJSAocHJvZ3JhbSwgd2FybmluZykKKyAgICAgICAgICBwcmludCBfX2RvY19fICUgeyJwcm9ncmFtIjogcHJvZ3JhbX0KKyAgICAgZmluYWxseToKKyAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3Rkb3V0CisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICAgbWFpbigpCmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvbm9kZTJsYWJlbC5wbCBiL2RvYy90b29scy9ub2RlMmxhYmVsLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYzZTZiZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvbm9kZTJsYWJlbC5wbApAQCAtMCwwICsxLDU1IEBACisjISAvdXNyL2Jpbi9lbnYgcGVybAorCit1c2UgRW5nbGlzaDsKKyRJTlBMQUNFX0VESVQgPSAnJzsKKworIyByZWFkIHRoZSBsYWJlbHMsIHRoZW4gcmV2ZXJzZSB0aGUgbWFwcGluZ3MKK3JlcXVpcmUgImxhYmVscy5wbCI7CisKKyVub2RlcyA9ICgpOworbXkgJGtleTsKKyMgc29ydCBzbyB0aGF0IHdlIGdldCBhIGNvbnNpc3RlbnQgYXNzaWdubWVudCBmb3Igbm9kZXMgd2l0aCBtdWx0aXBsZSBsYWJlbHMgCitmb3JlYWNoICRsYWJlbCAoc29ydCBrZXlzICVleHRlcm5hbF9sYWJlbHMpIHsKKyAgJGtleSA9ICRleHRlcm5hbF9sYWJlbHN7JGxhYmVsfTsKKyAgJGtleSA9fiBzfF4vfHw7CisgICRub2Rlc3ska2V5fSA9ICRsYWJlbDsKK30KKworIyBUaGlzIGFkZHMgdGhlICJpbnRlcm5hbCIgbGFiZWxzIGFkZGVkIGZvciBpbmRleGluZy4gIFRoZXNlIGxhYmVscyB3aWxsIG5vdAorIyBiZSB1c2VkIGZvciBmaWxlIG5hbWVzLgorcmVxdWlyZSAiaW50ZXJuYWxzLnBsIjsKK2ZvcmVhY2ggJGxhYmVsIChrZXlzICVpbnRlcm5hbF9sYWJlbHMpIHsKKyAgJGtleSA9ICRpbnRlcm5hbF9sYWJlbHN7JGxhYmVsfTsKKyAgJGtleSA9fiBzfF4vfHw7CisgIGlmIChkZWZpbmVkKCRub2Rlc3ska2V5fSkpIHsKKyAgICAkbm9kZXN7JGxhYmVsfSA9ICRub2Rlc3ska2V5fTsKKyAgfQorfQorCisjIGNvbGxlY3QgbGFiZWxzIHRoYXQgaGF2ZSBiZWVuIHVzZWQKKyVuZXduYW1lcyA9ICgpOworCit3aGlsZSAoPD4pIHsKKyAgIyBkb24ndCB3YW50IHRvIGRvIG9uZSBzLy8vIHBlciBsaW5lIHBlciBub2RlCisgICMgc28gbG9vayBmb3IgbGluZXMgd2l0aCBocmVmcywgdGhlbiBkbyBzLy8vIG9uIG5vZGVzIHByZXNlbnQKKyAgaWYgKC8oSFJFRnxocmVmKT1bXCJcJ10oW15cI1wiXCddKilodG1sW1wjXCJcJ10vKSB7CisgICAgQHBhcnRzID0gc3BsaXQoLyhIUkVGfGhyZWYpXD1bXCJcJ10vKTsKKyAgICBzaGlmdCBAcGFydHM7CisgICAgZm9yICRub2RlIChAcGFydHMpIHsKKyAgICAgICRub2RlID1+IHMvW1wjXCJcJ10uKiQvL2c7CisgICAgICBjaG9wKCRub2RlKTsKKyAgICAgIGlmIChkZWZpbmVkKCRub2Rlc3skbm9kZX0pKSB7CisJJGxhYmVsID0gJG5vZGVzeyRub2RlfTsKKwlpZiAocy8oSFJFRnxocmVmKT0oW1wiXCddKSRub2RlKFtcI1wiXCddKS9ocmVmPSQyJGxhYmVsLmh0bWwkMy9nKSB7CisJICBzLyhIUkVGfGhyZWYpPShbXCJcJ10pJGxhYmVsLmh0bWwvaHJlZj0kMiRsYWJlbC5odG1sL2c7CisJICAkbmV3bmFtZXN7JG5vZGV9ID0gIiRsYWJlbC5odG1sIjsKKwl9CisgICAgICB9CisgICAgfQorICB9CisgIHByaW50OworfQorCitmb3JlYWNoICRvbGRuYW1lIChrZXlzICVuZXduYW1lcykgeworICByZW5hbWUoJG9sZG5hbWUsICRuZXduYW1lc3skb2xkbmFtZX0pOworfQpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL3BhcGVyLWE0L3B5cGFwZXIuc3R5IGIvZG9jL3Rvb2xzL3BhcGVyLWE0L3B5cGFwZXIuc3R5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYjIyZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvcGFwZXItYTQvcHlwYXBlci5zdHkKQEAgLTAsMCArMSw1IEBACislCislICBDaGFuZ2UgdGhpcyB0byBzYXkgYTRwYXBlciBpbnN0ZWFkIG9mIGxldHRlcnBhcGVyIGlmIHlvdSB3YW50IEE0LgorJQorXG5ld2NvbW1hbmR7XHB5QHBhcGVyfXthNHBhcGVyfQorXG5ld2NvbW1hbmR7XHB5QHB0c2l6ZX17MTBwdH0KZGlmZiAtLWdpdCBhL2RvYy90b29scy9wZXJsL1N5bm9wc2lzVGFibGUucG0gYi9kb2MvdG9vbHMvcGVybC9TeW5vcHNpc1RhYmxlLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMDNkZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvcGVybC9TeW5vcHNpc1RhYmxlLnBtCkBAIC0wLDAgKzEsODkgQEAKK3BhY2thZ2UgU3lub3BzaXNUYWJsZTsKKworc3ViIG5ld3sKKyAgICByZXR1cm4gYmxlc3Mge25hbWVzPT4nJywgaW5mbz0+e30sIGZpbGU9PicnfTsKK30KKworc3ViIGRlY2xhcmV7CisgICAgbXkoJHNlbGYsJG5hbWUsJGtleSwkdHlwZSkgPSBAXzsKKyAgICBpZiAoJHNlbGYtPntuYW1lc30pIHsKKwkkc2VsZi0+e25hbWVzfSAuPSAiLCRuYW1lIjsKKyAgICB9CisgICAgZWxzZSB7CisJJHNlbGYtPntuYW1lc30gLj0gIiRuYW1lIjsKKyAgICB9CisgICAgJHNlbGYtPntpbmZvfXskbmFtZX0gPSAiJGtleSwkdHlwZSwiOworfQorCisjIFRoZSAnZmlsZScgYXR0cmlidXRlIGlzIHVzZWQgdG8gc3RvcmUgdGhlIGZpbGVuYW1lIG9mIHRoZSBub2RlIGluIHdoaWNoCisjIHRoZSB0YWJsZSB3aWxsIGJlIHByZXNlbnRlZDsgdGhpcyBhc3N1bWVzIHRoYXQgZWFjaCB0YWJsZSB3aWxsIGJlIHByZXNlbnRlZAorIyBvbmx5IG9uY2UsIHdoaWNoIHdvcmtzIGZvciB0aGUgY3VycmVudCB1c2Ugb2YgdGhpcyBvYmplY3QuCisKK3N1YiBzZXRfZmlsZXsKKyAgICBteSgkc2VsZiwgJGZpbGVuYW1lKSA9IEBfOworICAgICRzZWxmLT57ZmlsZX0gPSAiJGZpbGVuYW1lIjsKK30KKworc3ViIGdldF9maWxleworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgcmV0dXJuICRzZWxmLT57ZmlsZX07Cit9CisKK3N1YiBzZXRfc3lub3BzaXN7CisgICAgbXkoJHNlbGYsJG5hbWUsJHN5bm9wc2lzKSA9IEBfOworICAgIG15KCRrZXksJHR5cGUsJHVudXNlZCkgPSBzcGxpdCAnLCcsICRzZWxmLT57aW5mb317JG5hbWV9LCAzOworICAgICRzZWxmLT57aW5mb317JG5hbWV9ID0gIiRrZXksJHR5cGUsJHN5bm9wc2lzIjsKK30KKworc3ViIGdldHsKKyAgICBteSgkc2VsZiwkbmFtZSkgPSBAXzsKKyAgICByZXR1cm4gc3BsaXQgLywvLCAkc2VsZi0+e2luZm99eyRuYW1lfSwgMzsKK30KKworc3ViIHNob3d7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkbmFtZTsKKyAgICBwcmludCAibmFtZXM6ICIsICRzZWxmLT57bmFtZXN9LCAiXG5cbiI7CisgICAgZm9yZWFjaCAkbmFtZSAoc3BsaXQgLywvLCAkc2VsZi0+e25hbWVzfSkgeworCW15KCRrZXksJHR5cGUsJHN5bm9wc2lzKSA9ICRzZWxmLT5nZXQoJG5hbWUpOworCXByaW50ICIkbmFtZSgka2V5KSBpcyAkdHlwZTogJHN5bm9wc2lzXG4iOworICAgIH0KK30KKworc3ViIHRvaHRtbHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRkYXRhID0gIjx0YWJsZSBjbGFzcz0nc3lub3BzaXN0YWJsZSc+XG4iOworICAgIG15ICRuYW1lOworICAgIGZvcmVhY2ggJG5hbWUgKHNwbGl0IC8sLywgJHNlbGYtPntuYW1lc30pIHsKKwlteSgka2V5LCR0eXBlLCRzeW5vcHNpcykgPSAkc2VsZi0+Z2V0KCRuYW1lKTsKKwlteSAkbGluayA9ICI8YSBocmVmPSdtb2R1bGUtJGtleS5odG1sJz4iOworCSRkYXRhIC49ICgnICA8dHI+JworCQkgIC4gIjx0ZD48Yj48dHQgY2xhc3M9J21vZHVsZSc+JGxpbmskbmFtZTwvYT48L3R0PjwvYj48L3RkPlxuIgorCQkgIC4gIiAgICAgIDx0ZCBjbGFzcz0nc3lub3BzaXMnPiRzeW5vcHNpczwvdGQ+PC90cj5cbiIpOworICAgIH0KKyAgICAkZGF0YSAuPSAiPC90YWJsZT5cbiI7CisgICAgJGRhdGE7Cit9CisKKworcGFja2FnZSB0ZXN0U3lub3BzaXNUYWJsZTsKKworc3ViIHRlc3R7CisgICAgIyB0aGlzIGxpdHRsZSB0ZXN0IGlzIG1vc3RseSB0byBkZWJ1ZyB0aGUgc3R1ZmYgYWJvdmUsIHNpbmNlIHRoaXMgaXMKKyAgICAjIG15IGZpcnN0IFBlcmwgIm9iamVjdCIuCisgICAgbXkgJHN0ID0gU3lub3BzaXNUYWJsZS0+bmV3KCk7CisgICAgJHN0LT5kZWNsYXJlKCJzYW1wbGUiLCAic2FtcGxlIiwgInN0YW5kYXJkIik7CisgICAgJHN0LT5zZXRfc3lub3BzaXMoInNhbXBsZSIsICJUaGlzIGlzIGEgbGl0dGxlIHN5bm9wc2lzLi4uLiIpOworICAgICRzdC0+ZGVjbGFyZSgiY29weV9yZWciLCAiY29weXJlZyIsICJzdGFuZGFyZCIpOworICAgICRzdC0+c2V0X3N5bm9wc2lzKCJjb3B5X3JlZyIsICJwaWNrbGUgc3VwcG9ydCBzdHVmZiIpOworICAgICRzdC0+c2hvdygpOworCisgICAgcHJpbnQgIlxuXG4iOworCisgICAgbXkgJHN0MiA9IFN5bm9wc2lzVGFibGUtPm5ldygpOworICAgICRzdDItPmRlY2xhcmUoInN0Mm1vZHVsZSIsICJzdDJtb2R1bGUiLCAiYnVpbHQtaW4iKTsKKyAgICAkc3QyLT5zZXRfc3lub3BzaXMoInN0Mm1vZHVsZSIsICJzaWxseSBsaXR0bGUgc3lub3BzaXMiKTsKKyAgICAkc3QyLT5zaG93KCk7Cit9CisKKzE7CSMgVGhpcyBtdXN0IGJlIHRoZSBsYXN0IGxpbmUgLS0gUGVybCBpcyBib2d1cyEKZGlmZiAtLWdpdCBhL2RvYy90b29scy9wZXJsL2Rpc3R1dGlscy5wZXJsIGIvZG9jL3Rvb2xzL3BlcmwvZGlzdHV0aWxzLnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI1MjRiYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy9wZXJsL2Rpc3R1dGlscy5wZXJsCkBAIC0wLDAgKzEsMjEgQEAKKyMgTGFUZVgySFRNTCBzdXBwb3J0IGZvciBkaXN0dXRpbHMuc3R5LgorCitwYWNrYWdlIG1haW47CisKK3N1YiBkb19jbWRfY29tbWFuZCB7CisgICAgcmV0dXJuIHVzZV93cmFwcGVycyhAX1swXSwgJzxjb2RlPicsICc8L2NvZGU+Jyk7Cit9CisKK3N1YiBkb19jbWRfb3B0aW9uIHsKKyAgICByZXR1cm4gdXNlX3dyYXBwZXJzKEBfWzBdLCAnPGZvbnQgZmFjZT0ic2Fucy1zZXJpZiI+JywgJzwvZm9udD4nKTsKK30KKworc3ViIGRvX2NtZF9maWxldmFyIHsKKyAgICByZXR1cm4gdXNlX3dyYXBwZXJzKEBfWzBdLCAnPGZvbnQgZmFjZT0ic2Fucy1zZXJpZiI+PC9pPicsICc8L2k+PC9mb250PicpOworfQorCitzdWIgZG9fY21kX1hYWCB7CisgICAgcmV0dXJuIHVzZV93cmFwcGVycyhAX1swXSwgJzxiPioqICcsICcgKio8L2I+Jyk7Cit9CisKKzE7CmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvcGVybC9ob3d0by5wZXJsIGIvZG9jL3Rvb2xzL3BlcmwvaG93dG8ucGVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njc5MWViCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL3BlcmwvaG93dG8ucGVybApAQCAtMCwwICsxLDEyIEBACisjIC0qLSBwZXJsIC0qLQorIworIyBUaGlzIGltcGxlbWVudHMgdGhlIFB5dGhvbiBob3d0byBjbGFzcy4gIEFsbCBpdCByZWFsbHkgbmVlZHMgdG8gZG8gaXQKKyMgbG9hZCB0aGUgInB5dGhvbiIgc3R5bGUuCisKK3BhY2thZ2UgbWFpbjsKKworZG9fcmVxdWlyZV9wYWNrYWdlKCJhcnRpY2xlIik7Citkb19yZXF1aXJlX3BhY2thZ2UoImFsbHR0Iik7Citkb19yZXF1aXJlX3BhY2thZ2UoInB5dGhvbiIpOworCisxOwkJCQkjIHNoZWVzaC4uLi4KZGlmZiAtLWdpdCBhL2RvYy90b29scy9wZXJsL2wyaGluaXQucGVybCBiL2RvYy90b29scy9wZXJsL2wyaGluaXQucGVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzcyMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL3BlcmwvbDJoaW5pdC5wZXJsCkBAIC0wLDAgKzEsNTk0IEBACisjIExhVGVYMkhUTUwgc3VwcG9ydCBiYXNlIGZvciB1c2Ugd2l0aCBQeXRob24gZG9jdW1lbnRhdGlvbi4KKworcGFja2FnZSBtYWluOworCit1c2UgTDJob3M7CisKKyRIVE1MX1ZFUlNJT04gPSA0LjA7CisKKyRNQVhfTElOS19ERVBUSCA9IDI7CiskQUREUkVTUyA9ICcnOworCiskTk9fRk9PVE5PREUgPSAxOworJE5VTUJFUkVEX0ZPT1ROT1RFUyA9IDE7CisKKyMgUHl0aG9uIGRvY3VtZW50YXRpb24gdXNlcyBzZWN0aW9uIG51bWJlcnMgdG8gc3VwcG9ydCByZWZlcmVuY2VzIHRvIG1hdGNoCisjIGluIHRoZSBwcmludGVkIGFuZCBvbmxpbmUgdmVyc2lvbnMuCisjCiskU0hPV19TRUNUSU9OX05VTUJFUlMgPSAxOworCiskSUNPTlNFUlZFUiA9ICcuLi9pY29ucyc7CiskSU1BR0VfVFlQRSA9ICdnaWYnOworCisjIENvbnRyb2wgd2hlcmUgdGhlIG5hdmlnYXRpb24gYmFycyBzaG91bGQgc2hvdyB1cDoKKyRUT1BfTkFWSUdBVElPTiA9IDE7CiskQk9UVE9NX05BVklHQVRJT04gPSAxOworJEFVVE9fTkFWSUdBVElPTiA9IDA7CisKKyRCT0RZVEVYVCA9ICcnOworJENISUxETElORSA9ICJcbjxwPjxocj5cbiI7CiskVkVSQk9TSVRZID0gMDsKKworIyBkZWZhdWx0ICMgb2YgY29sdW1ucyBmb3IgdGhlIGluZGV4ZXMKKyRJTkRFWF9DT0xVTU5TID0gMjsKKyRNT0RVTEVfSU5ERVhfQ09MVU1OUyA9IDQ7CisKKworIyBBIGxpdHRsZSBwYWluZnVsLCBidXQgbGV0cyB1cyBjbGVhbiB1cCB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBhIGxpdHRsZSwKKyMgYW5kIG5vdCBiZSB0aWVkIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAoYXMgZmFyIGFzIEkgY2FuIHRlbGwpLiAgVGVzdGluZworIyBhbiBleGlzdGluZyBkZWZpbml0aW9uIG9mICRteWRpciBpcyBuZWVkZWQgc2luY2UgaXQgY2Fubm90IGJlIGNvbXB1dGVkIHdoZW4KKyMgcnVuIHVuZGVyIG1raG93dG8gd2l0aCByZWNlbnQgdmVyc2lvbnMgb2YgTGFUZVgySFRNTCwgc2luY2UgdGhpcyBmaWxlIGlzCisjIG5vdCByZWFkIGRpcmVjdGx5IGJ5IExhVGVYMkhUTUwgYW55IG1vcmUuICBta2hvd3RvIGlzIHJlcXVpcmVkIHRvIHByZXBlbmQKKyMgdGhlIHJlcXVpcmVkIGRlZmluaXRpb24gYXQgdGhlIHRvcCBvZiB0aGUgYWN0dWFsIGlucHV0IGZpbGUuCisjCitpZiAoIWRlZmluZWQgJG15ZGlyKSB7CisgICAgdXNlIEN3ZDsKKyAgICB1c2UgRmlsZTo6QmFzZW5hbWU7CisgICAgKCRteW5hbWUsICRteWRpciwgJG15ZXh0KSA9IGZpbGVwYXJzZShfX0ZJTEVfXywgJ1wuLionKTsKKyAgICBjaG9wICRteWRpcjsJCQkjIHJlbW92ZSB0cmFpbGluZyAnLycKKyAgICAkbXlkaXIgPSBnZXRjd2QoKSAuICIkZGQkbXlkaXIiCisgICAgICAgIHVubGVzcyAkbXlkaXIgPX4gc3xeL3wvfDsKK30KKyRMQVRFWDJIVE1MU1RZTEVTID0gIiRteWRpciRlbnZrZXkkTEFURVgySFRNTFNUWUxFUyI7CitwdXNoIChASU5DLCAkbXlkaXIpOworCisoJG15cm9vdG5hbWUsICRteXJvb3RkaXIsICRteWV4dCkgPSBmaWxlcGFyc2UoJG15ZGlyLCAnXC4uKicpOworY2hvcCAkbXlyb290ZGlyOworCisKKyMgSGFja2lzaCB3YXkgdG8gZ2V0IHRoZSBhcHByb3ByaWF0ZSBwYXBlci0qLyBkaXJlY3RvcnkgaW50byAkVEVYSU5QVVRTOworIyBwYXNzIGluIHRoZSBwYXBlciBzaXplIChhNCBvciBsZXR0ZXIpIGFzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBQQVBFUgorIyB0byBhZGQgdGhlIHJpZ2h0IGRpcmVjdG9yeS4gIElmIG5vdCBnaXZlbiwgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzCisjIGFkZGVkIGluc3RlYWQgZm9yIHVzZSB3aXRoIEhPV1RPIHByb2Nlc3NpbmcuCisjCitpZiAoZGVmaW5lZCAkRU5WeydQQVBFUid9KSB7CisgICAgJG15dGV4aW5wdXRzID0gIiRteXJvb3RkaXIke2RkfXBhcGVyLSRFTlZ7J1BBUEVSJ30kZW52a2V5IjsKK30KK2Vsc2UgeworICAgICRteXRleGlucHV0cyA9IGdldGN3ZCgpIC4gJGVudmtleTsKK30KKyRteXRleGlucHV0cyAuPSAiJG15cm9vdGRpciR7ZGR9dGV4aW5wdXRzIjsKKworCisjIENoYW5nZSB0aGlzIHZhcmlhYmxlIHRvIGNoYW5nZSB0aGUgdGV4dCBhZGRlZCBpbiAiQWJvdXQgdGhpcyBkb2N1bWVudC4uLiI7CisjIHRoaXMgc2hvdWxkIGJlIGFuIGFic29sdXRlIHBhdGhuYW1lIHRvIGdldCBpdCByaWdodC4KKyMKKyRBQk9VVF9GSUxFID0gIiRteXJvb3RkaXIke2RkfWh0bWwke2RkfXN0ZGFib3V0LmRhdCI7CisKKworc3ViIGN1c3RvbV9kcml2ZXJfaG9vayB7CisgICAgIworICAgICMgVGhpcyBhZGRzIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIG1haW4gaW5wdXQgZmlsZSB0byAkVEVYSU5QVVRTOyBpdAorICAgICMgc2VlbXMgdG8gYmUgc3VmZmljaWVudGx5IGdlbmVyYWwgdGhhdCBpdCBzaG91bGQgYmUgZmluZSBmb3IgSE9XVE8KKyAgICAjIHByb2Nlc3NpbmcuCisgICAgIworICAgIG15ICRmaWxlID0gQF9bMF07CisgICAgbXkoJGpvYm5hbWUsICRkaXIsICRleHQpID0gZmlsZXBhcnNlKCRmaWxlLCAnXC4uKicpOworICAgICRkaXIgPSBMMmhvcy0+TWFrZV9kaXJlY3RvcnlfYWJzb2x1dGUoJGRpcik7CisgICAgJGRpciA9fiBzLyRkZCQvLzsKKyAgICAkVEVYSU5QVVRTID0gIiRkaXIkZW52a2V5JG15dGV4aW5wdXRzIjsKKyAgICBwcmludCAiXG5BZGRpbmcgJGRpciB0byBcJFRFWElOUFVUU1xuIjsKK30KKworCiskQ1VTVE9NX0JVVFRPTlMgPSAnJzsKKworc3ViIG1ha2VfbmF2X3NlY3RyZWYgeworICAgIG15KCRsYWJlbCwkdGl0bGUpID0gQF87CisgICAgaWYgKCR0aXRsZSkgeworICAgICAgICBpZiAoJHRpdGxlID1+IC9cPFthQV0gLykgeworICAgICAgICAgICAgJHRpdGxlID1+IHMvXDxbYUFdIC88YSBjbGFzcz0ic2VjdHJlZiIgLzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICR0aXRsZSA9ICI8c3BhbiBjbGFzcz1cInNlY3RyZWZcIj4kdGl0bGU8L3NwYW4+IjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIjxiIGNsYXNzPVwibmF2bGFiZWxcIj4kbGFiZWw6PC9iPiAkdGl0bGVcbiI7CisgICAgfQorICAgIHJldHVybiAnJzsKK30KKworQG15X2ljb25fdGFncyA9ICgpOworJG15X2ljb25fdGFnc3snbmV4dCd9ID0gJ05leHQgUGFnZSc7CiskbXlfaWNvbl90YWdzeyduZXh0X3BhZ2UnfSA9ICdOZXh0IFBhZ2UnOworJG15X2ljb25fdGFnc3sncHJldmlvdXMnfSA9ICdQcmV2aW91cyBQYWdlJzsKKyRteV9pY29uX3RhZ3N7J3ByZXZpb3VzX3BhZ2UnfSA9ICdQcmV2aW91cyBQYWdlJzsKKyRteV9pY29uX3RhZ3N7J3VwJ30gPSAnVXAgT25lIExldmVsJzsKKyRteV9pY29uX3RhZ3N7J2NvbnRlbnRzJ30gPSAnQ29udGVudHMnOworJG15X2ljb25fdGFnc3snaW5kZXgnfSA9ICdJbmRleCc7CiskbXlfaWNvbl90YWdzeydtb2R1bGVzJ30gPSAnTW9kdWxlIEluZGV4JzsKKworQG15X2ljb25fbmFtZXMgPSAoKTsKKyRteV9pY29uX25hbWVzeydwcmV2aW91c19wYWdlJ30gPSAncHJldmlvdXMnOworJG15X2ljb25fbmFtZXN7J25leHRfcGFnZSd9ID0gJ25leHQnOworCitzdWIgZ2V0X215X2ljb24geworICAgIG15ICRuYW1lID0gQF9bMF07CisgICAgbXkgJHRleHQgPSAkbXlfaWNvbl90YWdzeyRuYW1lfTsKKyAgICBpZiAoJG15X2ljb25fbmFtZXN7JG5hbWV9KSB7CisgICAgICAgICRuYW1lID0gJG15X2ljb25fbmFtZXN7JG5hbWV9OworICAgIH0KKyAgICBpZiAoJHRleHQgZXEgJycpIHsKKyAgICAgICAgJG5hbWUgPSAnYmxhbmsnOworICAgIH0KKyAgICBteSAkaWNvbnNlcnZlciA9ICgkSUNPTlNFUlZFUiBlcSAnLicpID8gJycgOiAiJElDT05TRVJWRVIvIjsKKyAgICByZXR1cm4gIjxpbWcgc3JjPVwiJGljb25zZXJ2ZXIkbmFtZS4kSU1BR0VfVFlQRVwiXG4gIGJvcmRlcj1cIjBcIiIKKyAgICAgICAgICAgLiAiIGhlaWdodD1cIjMyXCJcbiAgYWx0PVwiJHRleHRcIiB3aWR0aD1cIjMyXCI+IjsKK30KKworc3ViIHVzZV9teV9pY29uIHsKKyAgICBteSAkcyA9IEBfWzBdOworICAgIGlmICgkcyA9fiAvXDx0ZXgyaHRtbF8oW2Etel9dKylfdmlzaWJsZV9tYXJrXD4vKSB7CisgICAgICAgIG15ICRyID0gZ2V0X215X2ljb24oJDEpOworICAgICAgICAkcyA9fiBzL1w8dGV4Mmh0bWxfW2Etel9dK192aXNpYmxlX21hcmtcPi8kci87CisgICAgfQorICAgIHJldHVybiAkczsKK30KKworc3ViIG1ha2VfbmF2X3BhbmVsIHsKKyAgICBteSAkczsKKyAgICBteSAkQkxBTktfSUNPTiA9IGdldF9teV9pY29uKCdibGFuaycpOworICAgICRORVhUID0gJE5FWFRfVElUTEUgPyB1c2VfbXlfaWNvbigiJE5FWFQiKSA6ICRCTEFOS19JQ09OOworICAgICRVUCA9ICRVUF9USVRMRSA/IHVzZV9teV9pY29uKCIkVVAiKSA6ICRCTEFOS19JQ09OOworICAgICRQUkVWSU9VUyA9ICRQUkVWSU9VU19USVRMRSA/IHVzZV9teV9pY29uKCIkUFJFVklPVVMiKSA6ICRCTEFOS19JQ09OOworICAgICRDT05URU5UUyA9IHVzZV9teV9pY29uKCIkQ09OVEVOVFMiKTsKKyAgICAkSU5ERVggPSAkSU5ERVggPyB1c2VfbXlfaWNvbigiJElOREVYIikgOiAkQkxBTktfSUNPTjsKKyAgICBpZiAoISRDVVNUT01fQlVUVE9OUykgeworICAgICAgICAkQ1VTVE9NX0JVVFRPTlMgPSAkQkxBTktfSUNPTjsKKyAgICB9CisgICAgJHMgPSAoJzx0YWJsZSBhbGlnbj0iY2VudGVyIiB3aWR0aD0iMTAwJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4nCisgICAgICAgICAgLiAiXG48dHI+IgorICAgICAgICAgICMgbGVmdC1oYW5kIHNpZGUKKyAgICAgICAgICAuICJcbjx0ZD4kUFJFVklPVVM8L3RkPiIKKyAgICAgICAgICAuICJcbjx0ZD4kVVA8L3RkPiIKKyAgICAgICAgICAuICJcbjx0ZD4kTkVYVDwvdGQ+IgorICAgICAgICAgICMgdGl0bGUgYm94CisgICAgICAgICAgLiAiXG48dGQgYWxpZ249XCJjZW50ZXJcIiB3aWR0aD1cIjEwMCVcIj4kdF90aXRsZTwvdGQ+IgorICAgICAgICAgICMgcmlnaHQtaGFuZCBzaWRlCisgICAgICAgICAgLiAiXG48dGQ+JENPTlRFTlRTPC90ZD4iCisgICAgICAgICAgLiAiXG48dGQ+JENVU1RPTV9CVVRUT05TPC90ZD4iICMgbW9kdWxlIGluZGV4CisgICAgICAgICAgLiAiXG48dGQ+JElOREVYPC90ZD4iCisgICAgICAgICAgLiAiXG48L3RyPjwvdGFibGU+XG4iCisgICAgICAgICAgIyB0ZXh0dWFsIG5hdmlnYXRpb24KKyAgICAgICAgICAuIG1ha2VfbmF2X3NlY3RyZWYoIlByZXZpb3VzIiwgJFBSRVZJT1VTX1RJVExFKQorICAgICAgICAgIC4gbWFrZV9uYXZfc2VjdHJlZigiVXAiLCAkVVBfVElUTEUpCisgICAgICAgICAgLiBtYWtlX25hdl9zZWN0cmVmKCJOZXh0IiwgJE5FWFRfVElUTEUpCisgICAgICAgICAgKTsKKyAgICAjIHJlbW92ZSB0aGVzZTsgdGhleSBhcmUgdW5uZWNlc3NhcnkgYW5kIGNhdXNlIGVycm9ycyBmcm9tIHZhbGlkYXRpb24KKyAgICAkcyA9fiBzLyBOQU1FPSJ0ZXgyaHRtbFxkKyJcbiAqLyAvZzsKKyAgICByZXR1cm4gJHM7Cit9CisKK3N1YiBnZXRfdmVyc2lvbl90ZXh0IHsKKyAgICBpZiAoJFBBQ0tBR0VfVkVSU0lPTiBuZSAnJyAmJiAkdF9kYXRlKSB7CisgICAgICAgIHJldHVybiAoIjxzcGFuIGNsYXNzPVwicmVsZWFzZS1pbmZvXCI+IgorICAgICAgICAgICAgICAgIC4gIlJlbGVhc2UgJFBBQ0tBR0VfVkVSU0lPTiwiCisgICAgICAgICAgICAgICAgLiAiIGRvY3VtZW50YXRpb24gdXBkYXRlZCBvbiAkdF9kYXRlLjwvc3Bhbj4iKTsKKyAgICB9CisgICAgaWYgKCRQQUNLQUdFX1ZFUlNJT04gbmUgJycpIHsKKyAgICAgICAgcmV0dXJuICgiPHNwYW4gY2xhc3M9XCJyZWxlYXNlLWluZm9cIj4iCisgICAgICAgICAgICAgICAgLiAiUmVsZWFzZSAkUEFDS0FHRV9WRVJTSU9OLjwvc3Bhbj4iKTsKKyAgICB9CisgICAgaWYgKCR0X2RhdGUpIHsKKyAgICAgICAgcmV0dXJuICgiPHNwYW4gY2xhc3M9XCJyZWxlYXNlLWluZm9cIj5Eb2N1bWVudGF0aW9uIHJlbGVhc2VkIG9uICIKKyAgICAgICAgICAgICAgICAuICIkdF9kYXRlLjwvc3Bhbj4iKTsKKyAgICB9CisgICAgcmV0dXJuICcnOworfQorCisKK3N1YiB0b3BfbmF2aWdhdGlvbl9wYW5lbCB7CisgICAgcmV0dXJuICJcbiIKKyAgICAgICAgICAgLiBtYWtlX25hdl9wYW5lbCgpCisgICAgICAgICAgIC4gIjxicj48aHI+XG4iOworfQorCitzdWIgYm90X25hdmlnYXRpb25fcGFuZWwgeworICAgIHJldHVybiAiXG48cD48aHI+XG4iCisgICAgICAgICAgIC4gbWFrZV9uYXZfcGFuZWwoKQorICAgICAgICAgICAuICI8aHI+XG4iCisgICAgICAgICAgIC4gZ2V0X3ZlcnNpb25fdGV4dCgpCisgICAgICAgICAgIC4gIlxuIjsKK30KKworc3ViIGFkZF9saW5rIHsKKyAgICAjIFJldHVybnMgYSBwYWlyIChpY29uaWMgbGluaywgdGV4dHVhbCBsaW5rKQorICAgIG15KCRpY29uLCAkY3VycmVudF9maWxlLCBAbGluaykgPSBAXzsKKyAgICBteSgkZHVtbXksICRmaWxlLCAkdGl0bGUpID0gc3BsaXQoJGRlbGltLAorCQkJCSAgICAgICRzZWN0aW9uX2luZm97am9pbignICcsQGxpbmspfSk7CisgICAgaWYgKCRpY29uID1+IC9cPHRleDJodG1sXyhbX2Etel0rKV92aXNpYmxlX21hcmtcPi8pIHsKKyAgICAgICAgbXkgJHIgPSBnZXRfbXlfaWNvbigkMSk7CisgICAgICAgICRpY29uID1+IHMvXDx0ZXgyaHRtbF9bX2Etel0rX3Zpc2libGVfbWFya1w+LyRyLzsKKyAgICB9CisgICAgaWYgKCR0aXRsZSAmJiAoJGZpbGUgbmUgJGN1cnJlbnRfZmlsZSkpIHsKKyAgICAgICAgJHRpdGxlID0gcHVyaWZ5KCR0aXRsZSk7CisJJHRpdGxlID0gZ2V0X2ZpcnN0X3dvcmRzKCR0aXRsZSwgJFdPUkRTX0lOX05BVklHQVRJT05fUEFORUxfVElUTEVTKTsKKwlyZXR1cm4gKG1ha2VfaHJlZigkZmlsZSwgJGljb24pLCBtYWtlX2hyZWYoJGZpbGUsICIkdGl0bGUiKSkKKwl9CisgICAgZWxzaWYgKCRpY29uIGVxIGdldF9teV9pY29uKCd1cCcpICYmICRFWFRFUk5BTF9VUF9MSU5LKSB7CisgCXJldHVybiAobWFrZV9ocmVmKCRFWFRFUk5BTF9VUF9MSU5LLCAkaWNvbiksCisJCW1ha2VfaHJlZigkRVhURVJOQUxfVVBfTElOSywgIiRFWFRFUk5BTF9VUF9USVRMRSIpKQorCX0KKyAgICBlbHNpZiAoJGljb24gZXEgZ2V0X215X2ljb24oJ3ByZXZpb3VzJykKKwkgICAmJiAkRVhURVJOQUxfUFJFVl9MSU5LICYmICRFWFRFUk5BTF9QUkVWX1RJVExFKSB7CisJcmV0dXJuIChtYWtlX2hyZWYoJEVYVEVSTkFMX1BSRVZfTElOSywgJGljb24pLAorCQltYWtlX2hyZWYoJEVYVEVSTkFMX1BSRVZfTElOSywgIiRFWFRFUk5BTF9QUkVWX1RJVExFIikpCisJfQorICAgIGVsc2lmICgkaWNvbiBlcSBnZXRfbXlfaWNvbignbmV4dCcpCisJICAgJiYgJEVYVEVSTkFMX0RPV05fTElOSyAmJiAkRVhURVJOQUxfRE9XTl9USVRMRSkgeworCXJldHVybiAobWFrZV9ocmVmKCRFWFRFUk5BTF9ET1dOX0xJTkssICRpY29uKSwKKwkJbWFrZV9ocmVmKCRFWFRFUk5BTF9ET1dOX0xJTkssICIkRVhURVJOQUxfRE9XTl9USVRMRSIpKQorCX0KKyAgICByZXR1cm4gKCZpbmFjdGl2ZV9pbWcoJGljb24pLCAiIik7Cit9CisKK3N1YiBhZGRfc3BlY2lhbF9saW5rIHsKKyAgICBteSgkaWNvbiwgJGZpbGUsICRjdXJyZW50X2ZpbGUpID0gQF87CisgICAgaWYgKCRpY29uID1+IC9cPHRleDJodG1sXyhbX2Etel0rKV92aXNpYmxlX21hcmtcPi8pIHsKKyAgICAgICAgbXkgJHIgPSBnZXRfbXlfaWNvbigkMSk7CisgICAgICAgICRpY29uID1+IHMvXDx0ZXgyaHRtbF9bX2Etel0rX3Zpc2libGVfbWFya1w+LyRyLzsKKyAgICB9CisgICAgcmV0dXJuICgoJGZpbGUgJiYgKCRmaWxlIG5lICRjdXJyZW50X2ZpbGUpKQorICAgICAgICAgICAgPyBtYWtlX2hyZWYoJGZpbGUsICRpY29uKQorICAgICAgICAgICAgOiB1bmRlZikKK30KKworIyBUaGUgaW1nX3RhZygpIGZ1bmN0aW9uIHNlZW1zIG9ubHkgdG8gYmUgY2FsbGVkIHdpdGggdGhlIHBhcmFtZXRlcgorIyAnYW5jaG9yX2ludmlzaWJsZV9tYXJrJywgd2hpY2ggd2Ugd2FudCB0byB0dXJuIGludG8gJycuICBTaW5jZQorIyByZXBsYWNlX2ljb25fbWFya3MoKSBpcyB0aGUgb25seSBpbnRlcmVzdGluZyBjYWxsZXIsIGFuZCBhbGwgaXQgcmVhbGx5CisjIGRvZXMgaXMgY2FsbCBpbWdfdGFnKCksIHdlIGNhbiBqdXN0IGRlZmluZSB0aGUgaG9vayBhbHRlcm5hdGl2ZSB0byBiZQorIyBhIG5vLW9wIGluc3RlYWQuCisjCitzdWIgcmVwbGFjZV9pY29uc19ob29rIHt9CisKK3N1YiBkb19jbWRfYXJhYmljIHsKKyAgICAjIGdldCByaWQgb2YgdGhhdCBuYXN0eSA8U1BBTiBDTEFTUz0iYXJhYmljIj4uLi48L1NQQU4+CisgICAgbXkoJGN0ciwgJHZhbCwgJGlkLCAkdGV4dCkgPSAmcmVhZF9jb3VudGVyX3ZhbHVlKEBfWzBdKTsKKyAgICByZXR1cm4gKCR2YWwgPyBmYXJhYmljKCR2YWwpIDogIjAiKSAuICR0ZXh0OworfQorCisKK3N1YiBnZW5faW5kZXhfaWQgeworICAgICMgdGhpcyBpcyB1c2VkIHRvIGVuc3VyZSBjb21tb24gaW5kZXgga2V5IGdlbmVyYXRpb24gYW5kIGEgc3RhYmxlIHNvcnQKKyAgICBteSgkc3RyLCRleHRyYSkgPSBAXzsKKyAgICBzcHJpbnRmKCclcyMjIyVzJTAxMGQnLCAkc3RyLCAkZXh0cmEsICsrJGdsb2JhbHsnbWF4X2lkJ30pOworfQorCitzdWIgaW5zZXJ0X2luZGV4IHsKKyAgICBteSgkbWFyaywkZGF0YWZpbGUsJGNvbHVtbnMsJGxldHRlcnMsJHByZWZpeCkgPSBAXzsKKyAgICBteSAkcHJvZyA9ICIkbXlyb290ZGlyL3Rvb2xzL2J1aWxkaW5kZXgucHkiOworICAgIG15ICRpbmRleDsKKyAgICBpZiAoJGxldHRlcnMpIHsKKwkkaW5kZXggPSBgJHByb2cgLS1jb2x1bW5zICRjb2x1bW5zIC0tbGV0dGVycyAkZGF0YWZpbGVgOworICAgIH0KKyAgICBlbHNlIHsKKwkkaW5kZXggPSBgJHByb2cgLS1jb2x1bW5zICRjb2x1bW5zICRkYXRhZmlsZWA7CisgICAgfQorICAgIGlmICghcy8kbWFyay8kcHJlZml4JGluZGV4LykgeworICAgICAgICBwcmludCAiXG5Db3VsZCBub3QgbG9jYXRlIGluZGV4IG1hcms6ICRtYXJrIjsKKyAgICB9Cit9CisKK3N1YiBhZGRfaWR4IHsKKyAgICBwcmludCAiXG5CdWlsZGluZyBIVE1MIGZvciB0aGUgaW5kZXggLi4uIjsKKyAgICBjbG9zZShJRFhGSUxFKTsKKyAgICBpbnNlcnRfaW5kZXgoJGlkeF9tYXJrLCAnaW5kZXguZGF0JywgJElOREVYX0NPTFVNTlMsIDEsICcnKTsKK30KKworCiskaWR4X21vZHVsZV9tYXJrID0gJzx0ZXgyaHRtbF9pZHhfbW9kdWxlX21hcms+JzsKKyRpZHhfbW9kdWxlX3RpdGxlID0gJ01vZHVsZSBJbmRleCc7CisKK3N1YiBhZGRfbW9kdWxlX2lkeCB7CisgICAgcHJpbnQgIlxuQnVpbGRpbmcgSFRNTCBmb3IgdGhlIG1vZHVsZSBpbmRleCAuLi4iOworICAgIG15ICRrZXk7CisgICAgbXkgJGZpcnN0ID0gMTsKKyAgICBteSAkcHJldnBsYXQgPSAnJzsKKyAgICBteSAkYWxsdGhlc2FtZSA9IDE7CisgICAgbXkgJHByZWZpeCA9ICcnOworICAgIGZvcmVhY2ggJGtleSAoa2V5cyAlTW9kdWxlcykgeworCSRrZXkgPX4gcy88dHQ+KFthLXpBLVowLTkuX10qKTxcL3R0Pi9cMS87CisJbXkgJHBsYXQgPSAiJE1vZHVsZVBsYXRmb3Jtc3ska2V5fSI7CisJJHBsYXQgPSAnJworCSAgaWYgKCRwbGF0IGVxICRJR05PUkVfUExBVEZPUk1fQU5OT1RBVElPTik7CisJaWYgKCEkZmlyc3QpIHsKKwkgICAgJGFsbHRoZXNhbWUgPSAwCisJICAgICAgaWYgKCRwcmV2cGxhdCBuZSAkcGxhdCk7CisJfQorCWVsc2UgeyAkZmlyc3QgPSAwOyB9CisJJHByZXZwbGF0ID0gJHBsYXQ7CisgICAgfQorICAgIG9wZW4oTU9ESURYRklMRSwgJz5tb2RpbmRleC5kYXQnKSB8fCBkaWUgIlxuJCFcbiI7CisgICAgZm9yZWFjaCAka2V5IChrZXlzICVNb2R1bGVzKSB7CisJIyBkdW1wIHRoZSBsaW5lIGluIHRoZSBkYXRhIGZpbGU7IGp1c3QgdXNlIGEgZHVtbXkgc2Vxbm8gZmllbGQKKwlteSAkbmtleSA9ICQxOworCW15ICRtb2RpdGVtID0gIiRNb2R1bGVzeyRrZXl9IjsKKwlteSAkcGxhdCA9ICcnOworCSRrZXkgPX4gcy88dHQ+KFthLXpBLVowLTkuX10qKTxcL3R0Pi9cMS87CisJaWYgKCRNb2R1bGVQbGF0Zm9ybXN7JGtleX0gJiYgISRhbGx0aGVzYW1lKSB7CisJICAgICRwbGF0ID0gKCIgPGVtPig8c3BhbiBjbGFzcz0ncGxhdGZvcm0nPiRNb2R1bGVQbGF0Zm9ybXN7JGtleX0iCisJCSAgICAgLiAnPC9zcGFuPik8L2VtPicpOworCX0KKwlwcmludCBNT0RJRFhGSUxFICRtb2RpdGVtIC4gJElEWEZJTEVfRklFTERfU0VQCisgICAgICAgICAgICAgIC4gIjx0dCBjbGFzcz0nbW9kdWxlJz4ka2V5PC90dD4kcGxhdCMjI1xuIjsKKyAgICB9CisgICAgY2xvc2UoTU9ESURYRklMRSk7CisKKyAgICBpZiAoJEdMT0JBTF9NT0RVTEVfSU5ERVgpIHsKKyAgICAgICAgJHByZWZpeCA9IDw8TU9EVUxFX0lOREVYX1BSRUZJWDsKKworPHA+IFRoaXMgaW5kZXggb25seSBsaXN0cyBtb2R1bGVzIGRvY3VtZW50ZWQgaW4gdGhpcyBtYW51YWwuCisgIFRoZSA8ZW0gY2xhc3M9ImNpdGV0aXRsZSI+PGEgaHJlZj0iJEdMT0JBTF9NT0RVTEVfSU5ERVgiPkdsb2JhbCBNb2R1bGUKKyAgICAgSW5kZXg8L2E+PC9lbT4gbGlzdHMgYWxsIG1vZHVsZXMgdGhhdCBhcmUgZG9jdW1lbnRlZCBpbiB0aGlzIHNldAorICBvZiBtYW51YWxzLjwvcD4KK01PRFVMRV9JTkRFWF9QUkVGSVgKKyAgICB9CisgICAgaWYgKCEkYWxsdGhlc2FtZSkgeworCSRwcmVmaXggLj0gPDxQTEFUX0RJU0NVU1M7CisKKzxwPiBTb21lIG1vZHVsZSBuYW1lcyBhcmUgZm9sbG93ZWQgYnkgYW4gYW5ub3RhdGlvbiBpbmRpY2F0aW5nIHdoYXQKK3BsYXRmb3JtIHRoZXkgYXJlIGF2YWlsYWJsZSBvbi48L3A+CisKK1BMQVRfRElTQ1VTUworICAgIH0KKyAgICBpbnNlcnRfaW5kZXgoJGlkeF9tb2R1bGVfbWFyaywgJ21vZGluZGV4LmRhdCcsICRNT0RVTEVfSU5ERVhfQ09MVU1OUywgMCwKKwkJICRwcmVmaXgpOworfQorCisjIHJlcGxhY2UgYm90aCBpbmRleGVzIGFzIG5lZWRlZDoKK3N1YiBhZGRfaWR4X2hvb2sgeworICAgIGFkZF9pZHgoKSBpZiAoLyRpZHhfbWFyay8pOworICAgIHByb2Nlc3NfcHl0aG9uX3N0YXRlKCk7CisgICAgaWYgKCRNT0RVTEVfSU5ERVhfRklMRSkgeworICAgICAgICBsb2NhbCAoJF8pOworICAgICAgICBvcGVuKE1ZRklMRSwgIjwkTU9EVUxFX0lOREVYX0ZJTEUiKTsKKyAgICAgICAgc3lzcmVhZChNWUZJTEUsICRfLCAxMDI0KjEwMjQpOworICAgICAgICBjbG9zZShNWUZJTEUpOworICAgICAgICBhZGRfbW9kdWxlX2lkeCgpOworICAgICAgICBvcGVuKE1ZRklMRSwiPiRNT0RVTEVfSU5ERVhfRklMRSIpOworICAgICAgICBwcmludCBNWUZJTEUgJF87CisgICAgICAgIGNsb3NlKE1ZRklMRSk7CisgICAgfQorfQorCisKKyMgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHN0dWZmLCBhZGQgbGFiZWwgdG8gYWxsb3cgbmFtZWQgbm9kZSBmaWxlcyBhbmQKKyMgc3VwcG9ydCBzdXBwcmVzc2lvbiBvZiB0aGUgcGFnZSBjb21wbGV0ZSAoZm9yIEhUTUwgSGVscCB1c2UpLgorc3ViIGRvX2NtZF90YWJsZW9mY29udGVudHMgeworICAgIGxvY2FsKCRfKSA9IEBfOworICAgICRUSVRMRSA9ICR0b2NfdGl0bGU7CisgICAgJHRvY2ZpbGUgPSAkQ1VSUkVOVF9GSUxFOworICAgIG15KCRjbG9zdXJlcywkcmVvcGVucykgPSBwcmVzZXJ2ZV9vcGVuX3RhZ3MoKTsKKyAgICBhbmNob3JfbGFiZWwoJ2NvbnRlbnRzJywgJENVUlJFTlRfRklMRSwgJF8pOwkjIHRoaXMgaXMgYWRkZWQKKyAgICBqb2luKCcnLCAiPEJSPlxuXFx0YWJsZW9mY2hpbGRsaW5rc1tvZmZdIiwgJGNsb3N1cmVzCisJICwgbWFrZV9zZWN0aW9uX2hlYWRpbmcoJHRvY190aXRsZSwgJ0gyJyksICR0b2NfbWFyaworCSAsICRyZW9wZW5zLCAkXyk7Cit9CisjIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBzdHVmZiwgYWRkIGxhYmVsIHRvIGFsbG93IG5hbWVkIG5vZGUgZmlsZXMuCitzdWIgZG9fY21kX2xpc3RvZmZpZ3VyZXMgeworICAgIGxvY2FsKCRfKSA9IEBfOworICAgICRUSVRMRSA9ICRsb2ZfdGl0bGU7CisgICAgJGxvZmZpbGUgPSAkQ1VSUkVOVF9GSUxFOworICAgIG15KCRjbG9zdXJlcywkcmVvcGVucykgPSBwcmVzZXJ2ZV9vcGVuX3RhZ3MoKTsKKyAgICBhbmNob3JfbGFiZWwoJ2xvZicsICRDVVJSRU5UX0ZJTEUsICRfKTsJCSMgdGhpcyBpcyBhZGRlZAorICAgIGpvaW4oJycsICI8QlI+XG4iLCAkY2xvc3VyZXMKKwkgLCBtYWtlX3NlY3Rpb25faGVhZGluZygkbG9mX3RpdGxlLCAnSDInKSwgJGxvZl9tYXJrCisJICwgJHJlb3BlbnMsICRfKTsKK30KKyMgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHN0dWZmLCBhZGQgbGFiZWwgdG8gYWxsb3cgbmFtZWQgbm9kZSBmaWxlcy4KK3N1YiBkb19jbWRfbGlzdG9mdGFibGVzIHsKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICAkVElUTEUgPSAkbG90X3RpdGxlOworICAgICRsb3RmaWxlID0gJENVUlJFTlRfRklMRTsKKyAgICBteSgkY2xvc3VyZXMsJHJlb3BlbnMpID0gcHJlc2VydmVfb3Blbl90YWdzKCk7CisgICAgYW5jaG9yX2xhYmVsKCdsb3QnLCAkQ1VSUkVOVF9GSUxFLCAkXyk7CQkjIHRoaXMgaXMgYWRkZWQKKyAgICBqb2luKCcnLCAiPEJSPlxuIiwgJGNsb3N1cmVzCisJICwgbWFrZV9zZWN0aW9uX2hlYWRpbmcoJGxvdF90aXRsZSwgJ0gyJyksICRsb3RfbWFyaworCSAsICRyZW9wZW5zLCAkXyk7Cit9CisjIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBzdHVmZiwgYWRkIGxhYmVsIHRvIGFsbG93IG5hbWVkIG5vZGUgZmlsZXMuCitzdWIgZG9fY21kX3RleHRvaHRtbGluZm9wYWdlIHsKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBpZiAoJElORk8pIHsJCQkJCSMgCisJYW5jaG9yX2xhYmVsKCJhYm91dCIsJENVUlJFTlRfRklMRSwkXyk7CQkjIHRoaXMgaXMgYWRkZWQKKyAgICB9CQkJCQkJCSMKKyAgICBteSAkdGhlX3ZlcnNpb24gPSAnJzsJCQkJIyBhbmQgdGhlIHJlc3QgaXMKKyAgICBpZiAoJHRfZGF0ZSkgewkJCQkJIyBtb3N0bHkgb3VycworCSR0aGVfdmVyc2lvbiA9ICIsXG4kdF9kYXRlIjsKKwlpZiAoJFBBQ0tBR0VfVkVSU0lPTikgeworCSAgICAkdGhlX3ZlcnNpb24gLj0gIiwgUmVsZWFzZSAkUEFDS0FHRV9WRVJTSU9OIjsKKwl9CisgICAgfQorICAgICRfID0gKCgkSU5GTyA9PSAxKQorICAgICAgICAgID8gam9pbignJywKKyAgICAgICAgICAgICAgICAgJGNsb3NlX2FsbCwKKyAgICAgICAgICAgICAgICAgIjxzdHJvbmc+JHRfdGl0bGU8L3N0cm9uZz4kdGhlX3ZlcnNpb25cbiIsCisgICAgICAgICAgICAgICAgIGBjYXQgJEFCT1VUX0ZJTEVgLAorICAgICAgICAgICAgICAgICAkb3Blbl9hbGwsICRfKQorICAgICAgICAgIDogam9pbignJywgJGNsb3NlX2FsbCwgJElORk8sIlxuIiwgJG9wZW5fYWxsLCAkXykpOworICAgICRfOworfQorCisjICRpZHhfbWFyayB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHJlYWwgaW5kZXggYXQgdGhlIGVuZAorc3ViIGRvX2NtZF90ZXh0b2h0bWxpbmRleCB7CisgICAgbG9jYWwoJF8pID0gQF87CisgICAgJFRJVExFID0gJGlkeF90aXRsZTsKKyAgICAkaWR4ZmlsZSA9ICRDVVJSRU5UX0ZJTEU7CisgICAgaWYgKCVpbmRleF9sYWJlbHMpIHsgbWFrZV9pbmRleF9sYWJlbHMoKTsgfQorICAgIGlmICgoJFNIT1JUX0lOREVYKSAmJiAoJWluZGV4X3NlZ21lbnQpKSB7IG1ha2VfcHJlaW5kZXgoKTsgfQorICAgIGVsc2UgeyAkcHJlaW5kZXggPSAnJzsgfQorICAgIG15ICRoZWFkaW5nID0gbWFrZV9zZWN0aW9uX2hlYWRpbmcoJGlkeF90aXRsZSwgJ2gyJykgLiAkaWR4X21hcms7CisgICAgbXkoJHByZSwkcG9zdCkgPSBtaW5pbWl6ZV9vcGVuX3RhZ3MoJGhlYWRpbmcpOworICAgIGFuY2hvcl9sYWJlbCgnZ2VuaW5kZXgnLCRDVVJSRU5UX0ZJTEUsJF8pOwkJIyB0aGlzIGlzIGFkZGVkCisgICAgcmV0dXJuICI8YnI+XG4iIC4gJHByZSAuICRfOworfQorCiskTU9EVUxFX0lOREVYX0ZJTEUgPSAnJzsKKworIyAkaWR4X21vZHVsZV9tYXJrIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgcmVhbCBpbmRleCBhdCB0aGUgZW5kCitzdWIgZG9fY21kX3RleHRvaHRtbG1vZHVsZWluZGV4IHsKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICAkVElUTEUgPSAkaWR4X21vZHVsZV90aXRsZTsKKyAgICBhbmNob3JfbGFiZWwoJ21vZGluZGV4JywgJENVUlJFTlRfRklMRSwgJF8pOworICAgICRNT0RVTEVfSU5ERVhfRklMRSA9ICIkQ1VSUkVOVF9GSUxFIjsKKyAgICAkXyA9ICgnPHA+JyAuIG1ha2Vfc2VjdGlvbl9oZWFkaW5nKCRpZHhfbW9kdWxlX3RpdGxlLCAnaDInKQorICAgICAgICAgIC4gJGlkeF9tb2R1bGVfbWFyayAuICRfKTsKKyAgICByZXR1cm4gJF87Cit9CisKKyMgVGhlIGJpYmxpb2dyYXBoeSBhbmQgdGhlIGluZGV4IHNob3VsZCBiZSB0cmVhdGVkIGFzIHNlcGFyYXRlCisjIHNlY3Rpb25zIGluIHRoZWlyIG93biBIVE1MIGZpbGVzLiBUaGUgXGJpYmxpb2dyYXBoeXt9IGNvbW1hbmQgYWN0cworIyBhcyBhIHNlY3Rpb25pbmcgY29tbWFuZCB0aGF0IGhhcyB0aGUgZGVzaXJlZCBlZmZlY3QuIEJ1dCB3aGVuIHRoZQorIyBiaWJsaW9ncmFwaHkgaXMgY29uc3RydWN0ZWQgbWFudWFsbHkgdXNpbmcgdGhlIHRoZWJpYmxpb2dyYXBoeQorIyBlbnZpcm9ubWVudCwgb3Igd2hlbiB1c2luZyB0aGUgdGhlaW5kZXggZW52aXJvbm1lbnQgaXQgaXMgbm90CisjIHBvc3NpYmxlIHRvIHVzZSB0aGUgbm9ybWFsIHNlY3Rpb25pbmcgbWVjaGFuaXNtLiBUaGlzIHN1YnJvdXRpbmUKKyMgaW5zZXJ0cyBhIFxiaWJsaW9ncmFwaHl7fSBvciBhIGR1bW15IFx0ZXh0b2h0bWxpbmRleCBjb21tYW5kIGp1c3QKKyMgYmVmb3JlIHRoZSBhcHByb3ByaWF0ZSBlbnZpcm9ubWVudHMgdG8gZm9yY2Ugc2VjdGlvbmluZy4KKworIyBYWFgJVGhpcyAqYXNzdW1lcyogdGhhdCBpZiB0aGVyZSBhcmUgdHdvIHt0aGVpbmRleH0gZW52aXJvbm1lbnRzLAorIwl0aGUgZmlyc3QgaXMgdGhlIG1vZHVsZSBpbmRleCBhbmQgdGhlIHNlY29uZCBpcyB0aGUgc3RhbmRhcmQKKyMJaW5kZXguICBUaGlzIGlzIHN1ZmZpY2llbnQgZm9yIHRoZSBjdXJyZW50IFB5dGhvbiBkb2N1bWVudGF0aW9uLAorIwlidXQgdGhhdCdzIGFib3V0IGl0LgorCitzdWIgYWRkX2JibF9hbmRfaWR4X2R1bW15X2NvbW1hbmRzIHsKKyAgICBteSAkaWQgPSAkZ2xvYmFseydtYXhfaWQnfTsKKworICAgIHMvKFtcXF1iZWdpblxzKiRPXGQrJENccyp0aGViaWJsaW9ncmFwaHkpLyRiYmxfY250Kys7ICQxL2VnOworICAgIHMvKFtcXF1iZWdpblxzKiRPXGQrJENccyp0aGViaWJsaW9ncmFwaHkpLyRpZCsrOyAiXFxiaWJsaW9ncmFwaHkkTyRpZCRDJE8kaWQkQyAkMSIvZ2VvOworICAgIG15KEBwYXJ0cykgPSBzcGxpdCgvXFxiZWdpblxzKiRPXGQrJENccyp0aGVpbmRleC8pOworICAgIGlmIChzY2FsYXIoQHBhcnRzKSA9PSAzKSB7CisgICAgICAgICMgQmUgY2FyZWZ1bCB0byByZS13cml0ZSB0aGUgc3RyaW5nIGluIHBsYWNlLCBzaW5jZSAkXyBpcyAqbm90KgorICAgICAgICAjIHJldHVybmVkIGV4cGxpY2l0eTsgICoqKiBuYXN0eSBzaWRlLWVmZmVjdCBkZXBlbmRlbmN5ISAqKioKKyAgICAgICAgcHJpbnQgIlxuYWRkX2JibF9hbmRfaWR4X2R1bW15X2NvbW1hbmRzID09PiBhZGRpbmcgbW9kdWxlIGluZGV4IjsKKyAgICAgICAgbXkgJHJ4ID0gIihbXFxcXF1iZWdpblxccyokT1xcZCskQ1xccyp0aGVpbmRleFtcXHNcXFNdKikiCisgICAgICAgICAgLiAiKFtcXFxcXWJlZ2luXFxzKiRPXFxkKyRDXFxzKnRoZWluZGV4KSI7CisgICAgICAgIHMvJHJ4L1xcdGV4dG9odG1sbW9kdWxlaW5kZXggXDEgXFx0ZXh0b2h0bWxpbmRleCBcMi9vOworICAgICAgICAjIEFkZCBhIGJ1dHRvbiB0byB0aGUgbmF2aWdhdGlvbiBhcmVhczoKKyAgICAgICAgJENVU1RPTV9CVVRUT05TIC49ICgnPGEgaHJlZj0ibW9kaW5kZXguaHRtbCIgdGl0bGU9Ik1vZHVsZSBJbmRleCI+JworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gZ2V0X215X2ljb24oJ21vZHVsZXMnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJzwvYT4nKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRDVVNUT01fQlVUVE9OUyAuPSBnZXRfbXlfaWNvbignYmxhbmsnKTsKKyAgICAgICAgJGdsb2JhbHsnbWF4X2lkJ30gPSAkaWQ7ICMgbm90IHN1cmUgd2h5Li4uLgorICAgICAgICBzLyhbXFxdYmVnaW5ccyokT1xkKyRDXHMqdGhlaW5kZXgpL1xcdGV4dG9odG1saW5kZXggJDEvbzsKKwkgICAgcy9bXFxdcHJpbnRpbmRleC9cXHRleHRvaHRtbGluZGV4IC9vOworCX0KKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGxpYl9hZGRfYmJsX2FuZF9pZHhfZHVtbXlfY29tbWFuZHMoKQorICAgICAgICBpZiBkZWZpbmVkKCZsaWJfYWRkX2JibF9hbmRfaWR4X2R1bW15X2NvbW1hbmRzKTsKK30KKworIyBUaGUgYmlibGlvZ3JhcGhpYyByZWZlcmVuY2VzLCB0aGUgYXBwZW5kaWNlcywgdGhlIGxpc3RzIG9mIGZpZ3VyZXMKKyMgYW5kIHRhYmxlcyBldGMuIG11c3QgYXBwZWFyIGluIHRoZSBjb250ZW50cyB0YWJsZSBhdCB0aGUgc2FtZSBsZXZlbAorIyBhcyB0aGUgb3V0ZXJtb3N0IHNlY3Rpb25pbmcgY29tbWFuZC4gVGhpcyBzdWJyb3V0aW5lIGZpbmRzIHdoYXQgaXMKKyMgdGhlIG91dGVybW9zdCBsZXZlbCBhbmQgc2V0cyB0aGUgYWJvdmUgdG8gdGhlIHNhbWUgbGV2ZWw7CisKK3N1YiBzZXRfZGVwdGhfbGV2ZWxzIHsKKyAgICAjIFNldHMgJG91dGVybW9zdF9sZXZlbAorICAgIG15ICRsZXZlbDsKKyAgICAjUlJNOiAgZG8gbm90IGFsdGVyIHVzZXItc2V0IHZhbHVlIGZvciAgJE1BWF9TUExJVF9ERVBUSAorICAgIGZvcmVhY2ggJGxldmVsICgicGFydCIsICJjaGFwdGVyIiwgInNlY3Rpb24iLCAic3Vic2VjdGlvbiIsCisJCSAgICAic3Vic3Vic2VjdGlvbiIsICJwYXJhZ3JhcGgiKSB7CisJbGFzdCBpZiAoKCRvdXRlcm1vc3RfbGV2ZWwpID0gL1xcKCRsZXZlbCkkZGVsaW1pdGVyX3J4Lyk7CisgICAgfQorICAgICRsZXZlbCA9ICgkb3V0ZXJtb3N0X2xldmVsID8gJHNlY3Rpb25fY29tbWFuZHN7JG91dGVybW9zdF9sZXZlbH0gOgorCSAgICAgIGRvIHskb3V0ZXJtb3N0X2xldmVsID0gJ3NlY3Rpb24nOyAzO30pOworCisgICAgI1JSTTogIGJ1dCBjYWxjdWxhdGUgdmFsdWUgZm9yICRNQVhfU1BMSVRfREVQVEggd2hlbiBhICRSRUxfREVQVEggd2FzIGdpdmVuCisgICAgaWYgKCRSRUxfREVQVEggJiYgJE1BWF9TUExJVF9ERVBUSCkgeyAKKwkkTUFYX1NQTElUX0RFUFRIID0gJGxldmVsICsgJE1BWF9TUExJVF9ERVBUSDsKKyAgICB9IGVsc2lmICghKCRNQVhfU1BMSVRfREVQVEgpKSB7ICRNQVhfU1BMSVRfREVQVEggPSAxIH07CisKKyAgICAldW5udW1iZXJlZF9zZWN0aW9uX2NvbW1hbmRzID0gKCd0YWJsZW9mY29udGVudHMnID0+ICRsZXZlbCwKKwkJCQkgICAgJ2xpc3RvZmZpZ3VyZXMnID0+ICRsZXZlbCwKKwkJCQkgICAgJ2xpc3RvZnRhYmxlcycgPT4gJGxldmVsLAorCQkJCSAgICAnYmlibGlvZ3JhcGh5JyA9PiAkbGV2ZWwsCisJCQkJICAgICd0ZXh0b2h0bWxpbmRleCcgPT4gJGxldmVsLAorCQkJCSAgICAndGV4dG9odG1sbW9kdWxlaW5kZXgnID0+ICRsZXZlbCk7CisgICAgJHNlY3Rpb25faGVhZGluZ3N7J3RleHRvaHRtbG1vZHVsZWluZGV4J30gPSAnaDEnOworCisgICAgJXNlY3Rpb25fY29tbWFuZHMgPSAoJXVubnVtYmVyZWRfc2VjdGlvbl9jb21tYW5kcywKKwkJCSAlc2VjdGlvbl9jb21tYW5kcyk7CisKKyAgICBtYWtlX3NlY3Rpb25zX3J4KCk7Cit9CisKKworIyBUaGlzIGNoYW5nZXMgdGhlIG1hcmt1cCB1c2VkIGZvciB7dmVyYmF0aW19IGVudmlyb25tZW50cywgYW5kIGlzIHRoZQorIyBiZXN0IHdheSBJJ3ZlIGZvdW5kIHRoYXQgZW5zdXJlcyB0aGUgPGRsPiBnb2VzIG9uIHRoZSBvdXRzaWRlIG9mIHRoZQorIyA8cHJlPi4uLjwvcHJlPi4KKyMKKyMgTm90ZSB0aGF0IHRoaXMgKm11c3QqIGJlIGRvbmUgaW4gdGhlIGluaXQgZmlsZSwgbm90IHRoZSBweXRob24ucGVybAorIyBzdHlsZSBzdXBwb3J0IGZpbGUuICBUaGUgJWRlY2xhcmF0aW9ucyBtdXN0IGJlIHNldCBiZWZvcmUKKyMgaW5pdGlhbGl6ZSgpIGlzIGNhbGxlZCBpbiB0aGUgbWFpbiBMYVRlWDJIVE1MIHNjcmlwdCAod2hpY2ggaGFwcGVucworIyBiZWZvcmUgc3R5bGUgZmlsZXMgYXJlIGxvYWRlZCkuCisjCislZGVjbGFyYXRpb25zID0gKCdwcmVmb3JtJyA9PiAnPGRsPjxkZD48cHJlIGNsYXNzPSJ2ZXJiYXRpbSI+PC9wcmU+PC9kbD4nLAorCQkgJWRlY2xhcmF0aW9ucyk7CisKKworIyBUaGlzIGlzIGFkZGVkIHRvIGdldCByaWQgb2YgdGhlIGxvbmcgY29tbWVudCB0aGF0IGZvbGxvd3MgdGhlCisjIGRvY3R5cGUgZGVjbGFyYXRpb247IE1TSUU1IG9uIE5UNCBTUDQgYmFyZnMgb24gaXQgYW5kIGRyb3BzIHRoZQorIyBjb250ZW50IG9mIHRoZSBwYWdlLgorc3ViIG1ha2VfaGVhZF9hbmRfYm9keSB7CisgICAgbXkoJHRpdGxlLCAkYm9keSkgPSBAXzsKKyAgICAkYm9keSA9ICIgJGJvZHkiIHVubGVzcyAoJGJvZHkgZXEgJycpOworICAgIG15ICREVERjb21tZW50ID0gJyc7CisgICAgbXkoJHZlcnNpb24sICRpc29sYW5ndWFnZSkgPSAoJEhUTUxfVkVSU0lPTiwgJ0VOJyk7CisgICAgbXkgJWlzb2xhbmd1YWdlcyA9ICggICdlbmdsaXNoJywgICdFTicgICAsICdVU2VuZ2xpc2gnLCAnRU4uVVMnCisgICAgICAgICAgICAgICAgICAgICAgICAsICdvcmlnaW5hbCcsICdFTicgICAsICdnZXJtYW4nICAgLCAnREUnCisgICAgICAgICAgICAgICAgICAgICAgICAsICdhdXN0cmlhbicsICdERS5BVCcsICdmcmVuY2gnICAgLCAnRlInCisgICAgICAgICAgICAgICAgICAgICAgICAsICdzcGFuaXNoJywgICdFUycpOworICAgICRpc29sYW5ndWFnZSA9ICRpc29sYW5ndWFnZXN7JGRlZmF1bHRfbGFuZ3VhZ2V9OworICAgICRpc29sYW5ndWFnZSA9ICdFTicgdW5sZXNzICRpc29sYW5ndWFnZTsKKyAgICAkdGl0bGUgPSAmcHVyaWZ5KCR0aXRsZSwxKTsKKyAgICBldmFsKCJcJHRpdGxlID0gIi4gJGRlZmF1bHRfdGl0bGUgKSB1bmxlc3MgKCR0aXRsZSk7CisKKyAgICAjIGFsbG93IHVzZXItbW9kaWZpY2F0aW9uIG9mIHRoZSA8VElUTEU+IHRhZzsgdGhhbmtzIERhbiBZb3VuZworICAgIGlmIChkZWZpbmVkICZjdXN0b21fVElUTEVfaG9vaykgeworCSR0aXRsZSA9ICZjdXN0b21fVElUTEVfaG9vaygkdGl0bGUsICR0b2Nfc2VjX3RpdGxlKTsKKyAgICB9CisKKyAgICBpZiAoJERPQ1RZUEUgPX4gL1wvXC9bXHdcLl0rXHMqJC8pIHsgIyBsYW5ndWFnZSBzcGVjIGluY2x1ZGVkCisJJERURGNvbW1lbnQgPSAiPCFET0NUWVBFIGh0bWwgUFVCTElDIFwiJERPQ1RZUEVcIj5cbiI7CisgICAgfSBlbHNlIHsKKwkkRFREY29tbWVudCA9ICI8IURPQ1RZUEUgaHRtbCBQVUJMSUMgXCIkRE9DVFlQRS8vIgorCSAgICAuICgkSVNPX0xBTkdVQUdFID8gJElTT19MQU5HVUFHRSA6ICRpc29sYW5ndWFnZSkgLiAiXCI+XG4iOworICAgIH0KKworICAgICRTVFlMRVNIRUVUID0gJEZJTEUuIi5jc3MiIHVubGVzcyAkU1RZTEVTSEVFVDsKKyAgICBpZiAoISRjaGFyc2V0ICYmICRDSEFSU0VUKSB7ICRjaGFyc2V0ID0gJENIQVJTRVQ7ICRjaGFyc2V0ID1+IHMvXy9cLS9nbzsgfQorCisgICAgam9pbignJywgKCRET0NUWVBFID8gJERURGNvbW1lbnQgOiAnJyApCisJLCI8aHRtbD5cbjxoZWFkPlxuPHRpdGxlPiIsICR0aXRsZSwgIjwvdGl0bGU+XG4iCisJLCAmbWV0YV9pbmZvcm1hdGlvbigkdGl0bGUpCisJLCAoJENIQVJTRVQgJiYgJEhUTUxfVkVSU0lPTiBnZSAiMi4xIiA/CisgICAgICAgICAgICI8bWV0YSBodHRwLWVxdWl2PVwiQ29udGVudC1UeXBlXCIgY29udGVudD1cInRleHQvaHRtbDsgY2hhcnNldD0kY2hhcnNldFwiPlxuIgorICAgICAgICAgICA6ICIiICkKKwksICgkQkFTRSA/ICI8YmFzZSBocmVmPVwiJEJBU0VcIj5cbiIgOiAiIiApCisJLCAiPGxpbmsgcmVsPVwiU1RZTEVTSEVFVFwiIGhyZWY9XCIkU1RZTEVTSEVFVFwiPiIKKwksICRtb3JlX2xpbmtzX21hcmsKKwksICJcbjwvaGVhZD5cbjxib2R5JGJvZHk+Iik7Cit9CisKKzE7CSMgVGhpcyBtdXN0IGJlIHRoZSBsYXN0IGxpbmUKZGlmZiAtLWdpdCBhL2RvYy90b29scy9wZXJsL2x0eG1hcmt1cC5wZXJsIGIvZG9jL3Rvb2xzL3BlcmwvbHR4bWFya3VwLnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwZTc5YgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy9wZXJsL2x0eG1hcmt1cC5wZXJsCkBAIC0wLDAgKzEsNjcgQEAKKyMgTGFUZVgySFRNTCBzdXBwb3J0IGZvciB0aGUgbHR4bWFya3VwIHBhY2thZ2UuICBEb2Vzbid0IGRvIGluZGV4aW5nLgorCitwYWNrYWdlIG1haW47CisKKworc3ViIGx0eF9uZXh0X2FyZ3VtZW50eworICAgIG15ICRwYXJhbTsKKyAgICAkcGFyYW0gPSBtaXNzaW5nX2JyYWNlcygpCisgICAgICB1bmxlc3MgKChzLyRuZXh0X3BhaXJfcHJfcngvJHBhcmFtPSQyOycnL2VvKQorCSAgICAgIHx8KHMvJG5leHRfcGFpcl9yeC8kcGFyYW09JDI7JycvZW8pKTsKKyAgICByZXR1cm4gJHBhcmFtOworfQorCisKK3N1YiBkb19jbWRfbWFjcm97CisgICAgbG9jYWwoJF8pID0gQF87CisgICAgbXkgJG1hY3JvID0gbHR4X25leHRfYXJndW1lbnQoKTsKKyAgICByZXR1cm4gIjx0dCBjbGFzcz0nbWFjcm8nPiYjOTI7JG1hY3JvPC90dD4iIC4gJF87Cit9CisKK3N1YiBkb19jbWRfZW52eworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG15ICRlbnYgPSBsdHhfbmV4dF9hcmd1bWVudCgpOworICAgIHJldHVybiAiPHR0IGNsYXNzPSdlbnZpcm9ubWVudCc+JiM5MjskZW52PC90dD4iIC4gJF87Cit9CisKK3N1YiBsdHhfcHJvY2Vzc19wYXJhbXN7CisgICAgIyBIYW5kbGUgcHJvY2Vzc2luZyBvZiBccCBhbmQgXG9wIGZvciBwYXJhbWV0ZXIgc3BlY2lmaWNhdGlvbnMgZm9yCisgICAgIyBlbnZkZXNjIGFuZCBtYWNyb2Rlc2MuICBJdCdzIGRvbmUgdGhpcyB3YXkgdG8gYXZvaWQgZGVmaW5pbmcgZG9fY21kX3AoKQorICAgICMgYW5kIGRvX2NtZF9vcCgpIGZ1bmN0aW9ucywgd2hpY2ggd291bGQgYmUgaW50ZXJwcmV0ZWQgb3V0c2lkZSB0aGUgY29udGV4dAorICAgICMgaW4gd2hpY2ggdGhlc2UgY29tbWFuZHMgYXJlIGxlZ2FsLCBhbmQgY2F1c2UgTGFUZVgySFRNTCB0byB0aGluayB0aGV5J3JlCisgICAgIyBkZWZpbmVkLiAgVGhpcyB3YXksIG90aGVyIHVzZXMgb2YgXHAgYW5kIFxvcCBhcmUgcHJvcGVybHkgZmxhZ2dlZCBhcworICAgICMgdW5rbm93biBtYWNyb3MuCisgICAgbXkgJHMgPSBAX1swXTsKKyAgICAkcyA9fiBzJVxcb3A8PChcZCspPj4oLispPDxcMT4+JTx0dD5bPC90dD48dmFyPiQyPC92YXI+PHR0Pl08L3R0PiU7CisgICAgd2hpbGUgKCRzID1+IC9cXHA8PChcZCspPj4oLispPDxcMT4+LykgeworCSRzID1+IHMlXFxwPDwoXGQrKT4+KC4rKTw8XDE+PiU8dHQ+ezwvdHQ+PHZhcj4kMjwvdmFyPjx0dD59PC90dD4lOworICAgIH0KKyAgICByZXR1cm4gJHM7Cit9CisKK3N1YiBkb19lbnZfbWFjcm9kZXNjeworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG15ICRtYWNybyA9IGx0eF9uZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJHBhcmFtcyA9IGx0eF9wcm9jZXNzX3BhcmFtcyhsdHhfbmV4dF9hcmd1bWVudCgpKTsKKyAgICByZXR1cm4gIlxuPGRsIGNsYXNzPSdtYWNyb2Rlc2MnPiIKKyAgICAgICAgIC4gIlxuPGR0PjxiPjx0dCBjbGFzcz0nbWFjcm8nPiYjOTI7JG1hY3JvPC90dD48L2I+IgorICAgICAgICAgLiAiXG4gICAgJHBhcmFtcyIKKwkgLiAiXG48ZGQ+IgorCSAuICRfCisJIC4gIjwvZGw+IjsKK30KKworc3ViIGRvX2Vudl9lbnZkZXNjeworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG15ICRlbnYgPSBsdHhfbmV4dF9hcmd1bWVudCgpOworICAgIG15ICRwYXJhbXMgPSBsdHhfcHJvY2Vzc19wYXJhbXMobHR4X25leHRfYXJndW1lbnQoKSk7CisgICAgcmV0dXJuICJcbjxkbCBjbGFzcz0nZW52ZGVzYyc+IgorICAgICAgICAgLiAiXG48ZHQ+PHR0PiYjOTI7YmVnaW57PGIgY2xhc3M9J2Vudmlyb25tZW50Jz4kZW52PC9iPn08L3R0PiIKKyAgICAgICAgIC4gIlxuICAgICRwYXJhbXMiCisgICAgICAgICAuICJcbjxiciAvPjx0dD4mIzkyO2VuZHs8YiBjbGFzcz0nZW52aXJvbm1lbnQnPiRlbnY8L2I+fTwvdHQ+IgorCSAuICJcbjxkZD4iCisJIC4gJF8KKwkgLiAiPC9kbD4iOworfQorCisxOwkJCQkjIE11c3QgZW5kIHdpdGggdGhpcywgYmVjYXVzZSBQZXJsIGlzIGJvZ3VzLgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL3BlcmwvbWFudWFsLnBlcmwgYi9kb2MvdG9vbHMvcGVybC9tYW51YWwucGVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTY1YjM2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL3BlcmwvbWFudWFsLnBlcmwKQEAgLTAsMCArMSwxNSBAQAorIyAtKi0gcGVybCAtKi0KKyMKKyMgVGhpcyBpbXBsZW1lbnRzIHRoZSBQeXRob24gbWFudWFsIGNsYXNzLiAgQWxsIGl0IHJlYWxseSBuZWVkcyB0byBkbyBpdAorIyBsb2FkIHRoZSAicHl0aG9uIiBzdHlsZS4gIFRoZSBzdHlsZSBjb2RlIGlzIG5vdCBtb3ZlZCBpbnRvIHRoZSBjbGFzcyBjb2RlCisjIGF0IHRoaXMgdGltZSwgc2luY2Ugd2UgZXhwZWN0IGFkZGl0aW9uYWwgZG9jdW1lbnQgY2xhc3MgdG8gYmUgZGV2ZWxvcGVkCisjIGZvciB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24gaW4gdGhlIGZ1dHVyZS4gIEFwcHJvcHJpYXRlIHJlbG9jYXRpb25zIHdpbGwKKyMgYmUgbWFkZSBhdCB0aGF0IHRpbWUuCisKK3BhY2thZ2UgbWFpbjsKKworZG9fcmVxdWlyZV9wYWNrYWdlKCJyZXBvcnQiKTsKK2RvX3JlcXVpcmVfcGFja2FnZSgiYWxsdHQiKTsKK2RvX3JlcXVpcmVfcGFja2FnZSgicHl0aG9uIik7CisKKzE7CQkJCSMgc2hlZXNoLi4uLgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL3BlcmwvcHl0aG9uLnBlcmwgYi9kb2MvdG9vbHMvcGVybC9weXRob24ucGVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDYxNWNjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL3BlcmwvcHl0aG9uLnBlcmwKQEAgLTAsMCArMSwxNjUxIEBACisjIHB5dGhvbi5wZXJsIGJ5IEZyZWQgTC4gRHJha2UsIEpyLiA8ZmRyYWtlQGFjbS5vcmc+CQktKi0gcGVybCAtKi0KKyMKKyMgSGVhdmlseSBiYXNlZCBvbiBHdWlkbyB2YW4gUm9zc3VtJ3MgbXlmb3JtYXQucGVybCAobm93IG9ic29sZXRlKS4KKyMKKyMgRXh0ZW5zaW9uIHRvIExhVGVYMkhUTUwgZm9yIGRvY3VtZW50cyB1c2luZyBteWZvcm1hdC5zdHkuCisjIFN1YnJvdXRpbmVzIG9mIHRoZSBmb3JtIGRvX2NtZF88bmFtZT4gaGVyZSBkZWZpbmUgdHJhbnNsYXRpb25zCisjIGZvciBMYVRlWCBjb21tYW5kcyBcPG5hbWU+IGRlZmluZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgLnN0eSBmaWxlLgorCitwYWNrYWdlIG1haW47CisKK3VzZSBGaWxlOjpCYXNlbmFtZTsKKworCitzdWIgbmV4dF9hcmd1bWVudHsKKyAgICBteSAkcGFyYW07CisgICAgJHBhcmFtID0gbWlzc2luZ19icmFjZXMoKQorICAgICAgdW5sZXNzICgocy8kbmV4dF9wYWlyX3ByX3J4LyRwYXJhbT0kMjsnJy9lbykKKwkgICAgICB8fChzLyRuZXh0X3BhaXJfcngvJHBhcmFtPSQyOycnL2VvKSk7CisgICAgcmV0dXJuICRwYXJhbTsKK30KKworc3ViIG5leHRfb3B0aW9uYWxfYXJndW1lbnR7CisgICAgbXkoJHBhcmFtLCRyeCkgPSAoJycsICJeXFxzKihcXFsoW15dXSopXFxdKT8iKTsKKyAgICBzLyRyeC8kcGFyYW09JDI7JycvZW87CisgICAgcmV0dXJuICRwYXJhbTsKK30KKworc3ViIG1ha2VfaWNvbl9maWxlbmFtZSgkKXsKKyAgICBteSgkbXluYW1lLCAkbXlkaXIsICRteWV4dCkgPSBmaWxlcGFyc2UoQF9bMF0sICdcLi4qJyk7CisgICAgY2hvcCAkbXlkaXI7CisgICAgaWYgKCRteWRpciBlcSAnLicpIHsKKyAgICAgICAgJG15ZGlyID0gJElDT05TRVJWRVI7CisgICAgfQorICAgICRteWV4dCA9ICIuJElNQUdFX1RZUEUiCisgICAgICB1bmxlc3MgJG15ZXh0OworICAgIHJldHVybiAiJG15ZGlyJGRkJG15bmFtZSRteWV4dCI7Cit9CisKK3N1YiBnZXRfbGlua19pY29uKCQpeworICAgIG15ICR1cmwgPSBAX1swXTsKKyAgICBpZiAoJE9GRl9TSVRFX0xJTktfSUNPTiAmJiAoJHVybCA9fiAvXlstYS16QS1aMC05Ll0rOi8pKSB7CisgICAgICAgICMgYWJzb2x1dGUgVVJMOyBhc3N1bWUgaXQgcG9pbnRzIG9mZi1zaXRlCisgICAgICAgIG15ICRpY29uID0gbWFrZV9pY29uX2ZpbGVuYW1lKCRPRkZfU0lURV9MSU5LX0lDT04pOworICAgICAgICByZXR1cm4gKCIgPGltZyBzcmM9JyRpY29uJ1xuIgorICAgICAgICAgICAgICAgIC4gIiAgYm9yZGVyPScwJyBjbGFzcz0nb2Zmc2l0ZWxpbmsnIgorICAgICAgICAgICAgICAgIC4gKCRPRkZfU0lURV9MSU5LX0lDT05fSEVJR0hUCisgICAgICAgICAgICAgICAgICAgPyAiIGhlaWdodD0nJE9GRl9TSVRFX0xJTktfSUNPTl9IRUlHSFQnIgorICAgICAgICAgICAgICAgICAgIDogJycpCisgICAgICAgICAgICAgICAgLiAoJE9GRl9TSVRFX0xJTktfSUNPTl9XSURUSAorICAgICAgICAgICAgICAgICAgID8gIiB3aWR0aD0nJE9GRl9TSVRFX0xJTktfSUNPTl9XSURUSCciCisgICAgICAgICAgICAgICAgICAgOiAnJykKKyAgICAgICAgICAgICAgICAuICIgYWx0PSdbb2ZmLXNpdGUgbGlua10nXG4iCisgICAgICAgICAgICAgICAgLiAiICA+Iik7CisgICAgfQorICAgIHJldHVybiAnJzsKK30KKworIyBUaGlzIGlzIGEgZmFpcmx5IHNpbXBsZSBoYWNrOyBpdCBzdXBwb3J0cyBcbGV0IHdoZW4gaXQgaXMgdXNlZCB0byBjcmVhdGUKKyMgKG9yIHJlZGVmaW5lKSBhIG1hY3JvIHRvIGV4YWN0bHkgYmUgc29tZSBvdGhlciBtYWNybzogXGxldFxuZXduYW1lPVxvbGRuYW1lLgorIyBNYW55IHBvc3NpYmxlIHVzZXMgb2YgXGxldCBhcmVuJ3Qgc3VwcG9ydGVkIG9yIGFyZW4ndCBzdXBwb3J0ZWQgY29ycmVjdGx5LgorIworc3ViIGRvX2NtZF9sZXR7CisgICAgbG9jYWwoJF8pID0gQF87CisgICAgbXkgJG1hdGNoZWQgPSAwOworICAgIHMvW1xcXShbYS16QS1aXSspXHMqKD1ccyopP1tcXF0oW2EtekEtWl0qKS8kbWF0Y2hlZD0xOyAnJy9lOworICAgIGlmICgkbWF0Y2hlZCkgeworCW15KCRuZXcsICRvbGQpID0gKCQxLCAkMyk7CisJZXZhbCAic3ViIGRvX2NtZF8kbmV3IHsgZG9fY21kXyRvbGQiIC4gJyhAXyk7IH0nOworCXByaW50ICJcbmRlZmluaW5nIGhhbmRsZXIgZm9yIFxcJG5ldyB1c2luZyBcXCRvbGRcbiI7CisgICAgfQorICAgIGVsc2UgeworCXMvW1xcXShbYS16QS1aXSspXHMqKD1ccyopPyhbXlxcXSkvJG1hdGNoZWQ9MTsgJycvZXM7CisJaWYgKCRtYXRjaGVkKSB7CisJICAgIG15KCRuZXcsICRjaGFyKSA9ICgkMSwgJDMpOworCSAgICBldmFsICJzdWIgZG9fY21kXyRuZXcgeyBcIlxcJGNoYXJcIiAuIFxAX1swXTsgfSI7CisJICAgIHByaW50ICJcbmRlZmluaW5nIGhhbmRsZXIgZm9yIFxcJG5ldyB0byBpbnNlcnQgJyRjaGFyJ1xuIjsKKwl9CisJZWxzZSB7CisJICAgIHdyaXRlX3dhcm5pbmdzKCJDb3VsZCBub3QgaW50ZXJwcmV0IFxcbGV0IGNvbnN0cnVjdC4uLiIpOworCX0KKyAgICB9CisgICAgcmV0dXJuICRfOworfQorCisKKyMgdGhlIG9sZGVyIHZlcnNpb24gb2YgTGFUZVgySFRNTCB3ZSB1c2UgZG9lc24ndCBzdXBwb3J0IHRoaXMsIGJ1dCB3ZSB1c2UgaXQ6CisKK3N1YiBkb19jbWRfdGV4dGFzY2lpdGlsZGV7ICd+JyAuIEBfWzBdOyB9CisKKworIyB3b3JkcyB0eXBlc2V0IGluIGEgc3BlY2lhbCB3YXkgKG5vdCBpbiBIVE1MIHRob3VnaCkKKworc3ViIGRvX2NtZF9BQkN7ICdBQkMnIC4gQF9bMF07IH0KK3N1YiBkb19jbWRfVU5JWHsgJ1VuaXgnLiBAX1swXTsgfQorc3ViIGRvX2NtZF9BU0NJSXsgJ0FTQ0lJJyAuIEBfWzBdOyB9CitzdWIgZG9fY21kX1BPU0lYeyAnUE9TSVgnIC4gQF9bMF07IH0KK3N1YiBkb19jbWRfQ3sgJ0MnIC4gQF9bMF07IH0KK3N1YiBkb19jbWRfQ3BweyAnQysrJyAuIEBfWzBdOyB9CitzdWIgZG9fY21kX0VPRnsgJ0VPRicgLiBAX1swXTsgfQorc3ViIGRvX2NtZF9OVUxMeyAnPHR0IGNsYXNzPSJjb25zdGFudCI+TlVMTDwvdHQ+JyAuIEBfWzBdOyB9CisKK3N1YiBkb19jbWRfZXsgJyYjOTI7JyAuIEBfWzBdOyB9CisKKyRERVZFTE9QRVJfQUREUkVTUyA9ICcnOworJFNIT1JUX1ZFUlNJT04gPSAnJzsKKyRQQUNLQUdFX1ZFUlNJT04gPSAnJzsKKworc3ViIGRvX2NtZF92ZXJzaW9ueyAkUEFDS0FHRV9WRVJTSU9OIC4gQF9bMF07IH0KK3N1YiBkb19jbWRfc2hvcnR2ZXJzaW9ueyAkU0hPUlRfVkVSU0lPTiAuIEBfWzBdOyB9CitzdWIgZG9fY21kX3JlbGVhc2V7CisgICAgbG9jYWwoJF8pID0gQF87CisgICAgJFBBQ0tBR0VfVkVSU0lPTiA9IG5leHRfYXJndW1lbnQoKTsKKyAgICByZXR1cm4gJF87Cit9CisKK3N1YiBkb19jbWRfc2V0c2hvcnR2ZXJzaW9ueworICAgIGxvY2FsKCRfKSA9IEBfOworICAgICRTSE9SVF9WRVJTSU9OID0gbmV4dF9hcmd1bWVudCgpOworICAgIHJldHVybiAkXzsKK30KKworc3ViIGRvX2NtZF9hdXRob3JhZGRyZXNzeworICAgIGxvY2FsKCRfKSA9IEBfOworICAgICRERVZFTE9QRVJfQUREUkVTUyA9IG5leHRfYXJndW1lbnQoKTsKKyAgICByZXR1cm4gJF87Cit9CisKKyNzdWIgZG9fY21kX2RldmVsb3BlcnsgZG9fY21kX2F1dGhvcihAX1swXSk7IH0KKyNzdWIgZG9fY21kX2RldmVsb3BlcnN7IGRvX2NtZF9hdXRob3IoQF9bMF0pOyB9Cisjc3ViIGRvX2NtZF9kZXZlbG9wZXJzYWRkcmVzc3sgZG9fY21kX2F1dGhvcmFkZHJlc3MoQF9bMF0pOyB9CisKK3N1YiBkb19jbWRfaGFja3Njb3JleworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG5leHRfYXJndW1lbnQoKTsKKyAgICByZXR1cm4gJ18nIC4gJF87Cit9CisKK3N1YiB1c2Vfd3JhcHBlcnN7CisgICAgbG9jYWwoJF8sJGJlZm9yZSwkYWZ0ZXIpID0gQF87CisgICAgbXkgJHN0dWZmID0gbmV4dF9hcmd1bWVudCgpOworICAgIHJldHVybiAkYmVmb3JlIC4gJHN0dWZmIC4gJGFmdGVyIC4gJF87Cit9CisKKyRJTl9ERVNDX0hBTkRMRVIgPSAwOworc3ViIGRvX2NtZF9vcHRpb25hbHsKKyAgICBpZiAoJElOX0RFU0NfSEFORExFUikgeworICAgICAgICByZXR1cm4gdXNlX3dyYXBwZXJzKEBfWzBdLCAiPC92YXI+PGJpZz5cWzwvYmlnPjx2YXI+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC92YXI+PGJpZz5cXTwvYmlnPjx2YXI+Iik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gdXNlX3dyYXBwZXJzKEBfWzBdLCAiPGJpZz5cWzwvYmlnPiIsICI8YmlnPlxdPC9iaWc+Iik7CisgICAgfQorfQorCisjIExvZ2ljYWwgZm9ybWF0dGluZyAoc29tZSBiYXNlZCBvbiB0ZXhpbmZvKSwgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvCisjIG1pbmltYWxpc3QgSFRNTC4gIFRoZSAibWluaW1hbGlzdCIgaXMgcHJpbWFyaWx5IHRvIHJlZHVjZSB0aGUgc2l6ZSBvZgorIyBvdXRwdXQgZmlsZXMgZm9yIHVzZXJzIHRoYXQgcmVhZCB0aGVtIG92ZXIgdGhlIG5ldHdvcmsgcmF0aGVyIHRoYW4KKyMgZnJvbSBsb2NhbCByZXBvc2l0b3JpZXMuCisKKyMgXGZpbGUgYW5kIFxzYW1wIGFyZSBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZSBzaW5jZSB0aGV5IHNjcmV3IHVwIGZvbnRsb2NrLgorCitzdWIgZG9fY21kX3B5dHlwZXsgcmV0dXJuIEBfWzBdOyB9CitzdWIgZG9fY21kX21ha2V2YXJ7CisgICAgcmV0dXJuIHVzZV93cmFwcGVycyhAX1swXSwgJzxzcGFuIGNsYXNzPSJtYWtldmFyIj4nLCAnPC9zcGFuPicpOyB9CitzdWIgZG9fY21kX2NvZGV7CisgICAgcmV0dXJuIHVzZV93cmFwcGVycyhAX1swXSwgJzxjb2RlPicsICc8L2NvZGU+Jyk7IH0KK3N1YiBkb19jbWRfbW9kdWxleworICAgIHJldHVybiB1c2Vfd3JhcHBlcnMoQF9bMF0sICc8dHQgY2xhc3M9Im1vZHVsZSI+JywgJzwvdHQ+Jyk7IH0KK3N1YiBkb19jbWRfa2V5d29yZHsKKyAgICByZXR1cm4gdXNlX3dyYXBwZXJzKEBfWzBdLCAnPHR0IGNsYXNzPSJrZXl3b3JkIj4nLCAnPC90dD4nKTsgfQorc3ViIGRvX2NtZF9leGNlcHRpb257CisgICAgcmV0dXJuIHVzZV93cmFwcGVycyhAX1swXSwgJzx0dCBjbGFzcz0iZXhjZXB0aW9uIj4nLCAnPC90dD4nKTsgfQorc3ViIGRvX2NtZF9jbGFzc3sKKyAgICByZXR1cm4gdXNlX3dyYXBwZXJzKEBfWzBdLCAnPHR0IGNsYXNzPSJjbGFzcyI+JywgJzwvdHQ+Jyk7IH0KK3N1YiBkb19jbWRfZnVuY3Rpb257CisgICAgcmV0dXJuIHVzZV93cmFwcGVycyhAX1swXSwgJzx0dCBjbGFzcz0iZnVuY3Rpb24iPicsICc8L3R0PicpOyB9CitzdWIgZG9fY21kX2NvbnN0YW50eworICAgIHJldHVybiB1c2Vfd3JhcHBlcnMoQF9bMF0sICc8dHQgY2xhc3M9ImNvbnN0YW50Ij4nLCAnPC90dD4nKTsgfQorc3ViIGRvX2NtZF9tZW1iZXJ7CisgICAgcmV0dXJuIHVzZV93cmFwcGVycyhAX1swXSwgJzx0dCBjbGFzcz0ibWVtYmVyIj4nLCAnPC90dD4nKTsgfQorc3ViIGRvX2NtZF9tZXRob2R7CisgICAgcmV0dXJuIHVzZV93cmFwcGVycyhAX1swXSwgJzx0dCBjbGFzcz0ibWV0aG9kIj4nLCAnPC90dD4nKTsgfQorc3ViIGRvX2NtZF9jZnVuY3Rpb257CisgICAgcmV0dXJuIHVzZV93cmFwcGVycyhAX1swXSwgJzx0dCBjbGFzcz0iY2Z1bmN0aW9uIj4nLCAnPC90dD4nKTsgfQorc3ViIGRvX2NtZF9jZGF0YXsKKyAgICByZXR1cm4gdXNlX3dyYXBwZXJzKEBfWzBdLCAnPHR0IGNsYXNzPSJjZGF0YSI+JywgJzwvdHQ+Jyk7IH0KK3N1YiBkb19jbWRfY3R5cGV7CisgICAgcmV0dXJuIHVzZV93cmFwcGVycyhAX1swXSwgJzx0dCBjbGFzcz0iY3R5cGUiPicsICc8L3R0PicpOyB9CitzdWIgZG9fY21kX3JlZ2V4cHsKKyAgICByZXR1cm4gdXNlX3dyYXBwZXJzKEBfWzBdLCAnPHR0IGNsYXNzPSJyZWdleHAiPicsICc8L3R0PicpOyB9CitzdWIgZG9fY21kX2NoYXJhY3RlcnsKKyAgICByZXR1cm4gdXNlX3dyYXBwZXJzKEBfWzBdLCAnIjx0dCBjbGFzcz0iY2hhcmFjdGVyIj4nLCAnPC90dD4iJyk7IH0KK3N1YiBkb19jbWRfcHJvZ3JhbXsKKyAgICByZXR1cm4gdXNlX3dyYXBwZXJzKEBfWzBdLCAnPGIgY2xhc3M9InByb2dyYW0iPicsICc8L2I+Jyk7IH0KK3N1YiBkb19jbWRfcHJvZ3JhbW9wdHsKKyAgICByZXR1cm4gdXNlX3dyYXBwZXJzKEBfWzBdLCAnPGIgY2xhc3M9InByb2dyYW1vcHQiPicsICc8L2I+Jyk7IH0KK3N1YiBkb19jbWRfbG9uZ3Byb2dyYW1vcHR7CisgICAgIyBub3RlIHRoYXQgdGhlIC0tLSB3aWxsIGJlIGxhdGVyIGNvbnZlcnRlZCB0byAtLSBieSBMYVRlWDJIVE1MCisgICAgcmV0dXJuIHVzZV93cmFwcGVycyhAX1swXSwgJzxiIGNsYXNzPSJwcm9ncmFtb3B0Ij4tLS0nLCAnPC9iPicpOyB9CitzdWIgZG9fY21kX2VtYWlseworICAgIHJldHVybiB1c2Vfd3JhcHBlcnMoQF9bMF0sICc8c3BhbiBjbGFzcz0iZW1haWwiPicsICc8L3NwYW4+Jyk7IH0KK3N1YiBkb19jbWRfbWltZXR5cGV7CisgICAgcmV0dXJuIHVzZV93cmFwcGVycyhAX1swXSwgJzxzcGFuIGNsYXNzPSJtaW1ldHlwZSI+JywgJzwvc3Bhbj4nKTsgfQorc3ViIGRvX2NtZF92YXJ7CisgICAgcmV0dXJuIHVzZV93cmFwcGVycyhAX1swXSwgIjx2YXI+IiwgIjwvdmFyPiIpOyB9CitzdWIgZG9fY21kX2RmbnsKKyAgICByZXR1cm4gdXNlX3dyYXBwZXJzKEBfWzBdLCAnPGkgY2xhc3M9ImRmbiI+JywgJzwvaT4nKTsgfQorc3ViIGRvX2NtZF9lbXBoeworICAgIHJldHVybiB1c2Vfd3JhcHBlcnMoQF9bMF0sICc8aT4nLCAnPC9pPicpOyB9CitzdWIgZG9fY21kX2ZpbGV7CisgICAgcmV0dXJuIHVzZV93cmFwcGVycyhAX1swXSwgJzxzcGFuIGNsYXNzPSJmaWxlIj4nLCAnPC9zcGFuPicpOyB9CitzdWIgZG9fY21kX2ZpbGVucXsKKyAgICByZXR1cm4gZG9fY21kX2ZpbGUoQF9bMF0pOyB9CitzdWIgZG9fY21kX3NhbXB7CisgICAgcmV0dXJuIHVzZV93cmFwcGVycyhAX1swXSwgJyI8dHQgY2xhc3M9InNhbXAiPicsICc8L3R0PiInKTsgfQorc3ViIGRvX2NtZF9rYmR7CisgICAgcmV0dXJuIHVzZV93cmFwcGVycyhAX1swXSwgJzxrYmQ+JywgJzwva2JkPicpOyB9CitzdWIgZG9fY21kX3N0cm9uZ3sKKyAgICByZXR1cm4gdXNlX3dyYXBwZXJzKEBfWzBdLCAnPGI+JywgJzwvYj4nKTsgfQorc3ViIGRvX2NtZF90ZXh0YmZ7CisgICAgcmV0dXJuIHVzZV93cmFwcGVycyhAX1swXSwgJzxiPicsICc8L2I+Jyk7IH0KK3N1YiBkb19jbWRfdGV4dGl0eworICAgIHJldHVybiB1c2Vfd3JhcHBlcnMoQF9bMF0sICc8aT4nLCAnPC9pPicpOyB9CisKK3N1YiBkb19jbWRfbW9yZWFyZ3N7CisgICAgcmV0dXJuICcuLi4nIC4gQF9bMF07IH0KK3N1YiBkb19jbWRfdW5zcGVjaWZpZWR7CisgICAgcmV0dXJuICcuLi4nIC4gQF9bMF07IH0KKworCitzdWIgZG9fY21kX3JlZm1vZHVsZXsKKyAgICAjIEluc2VydCB0aGUgcmlnaHQgbWFnaWMgdG8ganVtcCB0byB0aGUgbW9kdWxlIGRlZmluaXRpb24uCisgICAgbG9jYWwoJF8pID0gQF87CisgICAgbXkgJGtleSA9IG5leHRfb3B0aW9uYWxfYXJndW1lbnQoKTsKKyAgICBteSAkbW9kdWxlID0gbmV4dF9hcmd1bWVudCgpOworICAgICRrZXkgPSAkbW9kdWxlCisgICAgICAgIHVubGVzcyAka2V5OworICAgIHJldHVybiAiPHR0IGNsYXNzPSdtb2R1bGUnPjxhIGhyZWY9J21vZHVsZS0ka2V5Lmh0bWwnPiRtb2R1bGU8L2E+PC90dD4iCisgICAgICAuICRfOworfQorCitzdWIgZG9fY21kX25ld3Nncm91cHsKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBteSAkbmV3c2dyb3VwID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICRpY29uID0gZ2V0X2xpbmtfaWNvbigibmV3czokbmV3c2dyb3VwIik7CisgICAgbXkgJHN0dWZmID0gIjxhIGNsYXNzPSduZXdzZ3JvdXAnIGhyZWY9J25ld3M6JG5ld3Nncm91cCc+IgorICAgICAgLiAiJG5ld3Nncm91cCRpY29uPC9hPiI7CisgICAgcmV0dXJuICRzdHVmZiAuICRfOworfQorCitzdWIgZG9fY21kX2VudnZhcnsKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBteSAkZW52dmFyID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15KCRuYW1lLCRhbmFtZSwkYWhyZWYpID0gbmV3X2xpbmtfaW5mbygpOworICAgICMgVGhlIDx0dD4gaGVyZSBpcyByZWFsbHkgdG8ga2VlcCBidWlsZGluZGV4LnB5IGZyb20gbWFraW5nCisgICAgIyB0aGUgdmFyaWFibGUgbmFtZSBjYXNlLWluc2Vuc2l0aXZlLgorICAgIGFkZF9pbmRleF9lbnRyeSgiZW52aXJvbm1lbnQgdmFyaWFibGVzISRlbnZ2YXJAPHR0PiRlbnZ2YXI8L3R0PiIsCisJCSAgICAkYWhyZWYpOworICAgIGFkZF9pbmRleF9lbnRyeSgiJGVudnZhciAoZW52aXJvbm1lbnQgdmFyaWFibGUpIiwgJGFocmVmKTsKKyAgICAkYW5hbWUgPX4gcy88YS88YSBjbGFzcz0iZW52dmFyIi87CisgICAgcmV0dXJuICIkYW5hbWUkZW52dmFyPC9hPiIgLiAkXzsKK30KKworc3ViIGRvX2NtZF91cmx7CisgICAgIyB1c2UgdGhlIFVSTCBhcyBib3RoIHRleHQgYW5kIGh5cGVybGluaworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG15ICR1cmwgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJGljb24gPSBnZXRfbGlua19pY29uKCR1cmwpOworICAgICR1cmwgPX4gcy9+LyYjMTI2Oy9nOworICAgIHJldHVybiAiPGEgY2xhc3M9XCJ1cmxcIiBocmVmPVwiJHVybFwiPiR1cmwkaWNvbjwvYT4iIC4gJF87Cit9CisKK3N1YiBkb19jbWRfbWFucGFnZXsKKyAgICAjIHR3byBwYXJhbWV0ZXJzOiAgXG1hbnBhZ2V7bmFtZX17c2VjdGlvbn0KKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBteSAkcGFnZSA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBteSAkc2VjdGlvbiA9IG5leHRfYXJndW1lbnQoKTsKKyAgICByZXR1cm4gIjxzcGFuIGNsYXNzPSdtYW5wYWdlJz48aT4kcGFnZTwvaT4oJHNlY3Rpb24pPC9zcGFuPiIgLiAkXzsKK30KKworJFBFUF9GT1JNQVQgPSAiaHR0cDovL3B5dGhvbi5zb3VyY2Vmb3JnZS5uZXQvcGVwcy9wZXAtWFhYWC5odG1sIjsKKyRSRkNfRk9STUFUID0gImh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmY1hYWFgudHh0IjsKKworc3ViIGdldF9yZmNfdXJsKCQkKXsKKyAgICBteSgkcmZjbnVtLCAkZm9ybWF0KSA9IEBfOworICAgICRyZmNudW0gPSBzcHJpbnRmKCIlMDRkIiwgJHJmY251bSk7CisgICAgJGZvcm1hdCA9ICIkZm9ybWF0IjsKKyAgICAkZm9ybWF0ID1+IHMvWFhYWC8kcmZjbnVtLzsKKyAgICByZXR1cm4gJGZvcm1hdDsKK30KKworc3ViIGRvX2NtZF9wZXB7CisgICAgbG9jYWwoJF8pID0gQF87CisgICAgbXkgJHJmY251bWJlciA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBteSAkaWQgPSAicmZjcmVmLSIgLiArKyRnbG9iYWx7J21heF9pZCd9OworICAgIG15ICRocmVmID0gZ2V0X3JmY191cmwoJHJmY251bWJlciwgJFBFUF9GT1JNQVQpOworICAgIG15ICRpY29uID0gZ2V0X2xpbmtfaWNvbigkaHJlZik7CisgICAgIyBTYXZlIHRoZSByZWZlcmVuY2UKKyAgICBteSAkbnN0ciA9IGdlbl9pbmRleF9pZCgiUHl0aG9uIEVuaGFuY2VtZW50IFByb3Bvc2FscyFQRVAgJHJmY251bWJlciIsICcnKTsKKyAgICAkaW5kZXh7JG5zdHJ9IC49IG1ha2VfaGFsZl9ocmVmKCIkQ1VSUkVOVF9GSUxFIyRpZCIpOworICAgIHJldHVybiAoIjxhIGNsYXNzPVwicmZjXCIgbmFtZT1cIiRpZFwiXG5ocmVmPVwiJGhyZWZcIj5QRVAgJHJmY251bWJlciIKKyAgICAgICAgICAgIC4gIiRpY29uPC9hPiIgLiAkXyk7Cit9CisKK3N1YiBkb19jbWRfcmZjeworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG15ICRyZmNudW1iZXIgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJGlkID0gInJmY3JlZi0iIC4gKyskZ2xvYmFseydtYXhfaWQnfTsKKyAgICBteSAkaHJlZiA9IGdldF9yZmNfdXJsKCRyZmNudW1iZXIsICRSRkNfRk9STUFUKTsKKyAgICBteSAkaWNvbiA9IGdldF9saW5rX2ljb24oJGhyZWYpOworICAgICMgU2F2ZSB0aGUgcmVmZXJlbmNlCisgICAgbXkgJG5zdHIgPSBnZW5faW5kZXhfaWQoIlJGQyFSRkMgJHJmY251bWJlciIsICcnKTsKKyAgICAkaW5kZXh7JG5zdHJ9IC49IG1ha2VfaGFsZl9ocmVmKCIkQ1VSUkVOVF9GSUxFIyRpZCIpOworICAgIHJldHVybiAoIjxhIGNsYXNzPVwicmZjXCIgbmFtZT1cIiRpZFwiXG5ocmVmPVwiJGhyZWZcIj5SRkMgJHJmY251bWJlciIKKyAgICAgICAgICAgIC4gIiRpY29uPC9hPiIgLiAkXyk7Cit9CisKK3N1YiBkb19jbWRfY2l0ZXRpdGxleworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG15ICR1cmwgPSBuZXh0X29wdGlvbmFsX2FyZ3VtZW50KCk7CisgICAgbXkgJHRpdGxlID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICRpY29uID0gZ2V0X2xpbmtfaWNvbigkdXJsKTsKKyAgICBteSAkcmVwbCA9ICcnOworICAgIGlmICgkdXJsKSB7CisgICAgICAgICRyZXBsID0gKCI8ZW0gY2xhc3M9J2NpdGV0aXRsZSc+PGFcbiIKKyAgICAgICAgICAgICAgICAgLiAiIGhyZWY9JyR1cmwnXG4iCisgICAgICAgICAgICAgICAgIC4gIiB0aXRsZT0nJHRpdGxlJ1xuIgorICAgICAgICAgICAgICAgICAuICIgPiR0aXRsZSRpY29uPC9hPjwvZW0+Iik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkcmVwbCA9ICI8ZW0gY2xhc3M9J2NpdGV0aXRsZSdcbiA+JHRpdGxlPC9lbT4iOworICAgIH0KKyAgICByZXR1cm4gJHJlcGwgLiAkXzsKK30KKworc3ViIGRvX2NtZF9kZXByZWNhdGVkeworICAgICMgdHdvIHBhcmFtZXRlcnM6ICBcZGVwcmVjYXRlZHt2ZXJzaW9ufXt3aGF0dG9kb30KKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBteSAkcmVsZWFzZSA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBteSAkcmVhc29uID0gbmV4dF9hcmd1bWVudCgpOworICAgIHJldHVybiAoJzxkaXYgY2xhc3M9InZlcnNpb25ub3RlIj4nCisgICAgICAgICAgICAuICI8Yj5EZXByZWNhdGVkIHNpbmNlIHJlbGVhc2UgJHJlbGVhc2UuPC9iPiIKKyAgICAgICAgICAgIC4gIlxuJHJlYXNvbjwvZGl2PjxwPiIKKyAgICAgICAgICAgIC4gJF8pOworfQorCitzdWIgZG9fY21kX3ZlcnNpb25hZGRlZHsKKyAgICAjIG9uZSBwYXJhbWV0ZXI6ICBcdmVyc2lvbmFkZGVke3ZlcnNpb259CisgICAgbG9jYWwoJF8pID0gQF87CisgICAgbXkgJHJlbGVhc2UgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgcmV0dXJuICgiXG48c3BhbiBjbGFzcz0ndmVyc2lvbm5vdGUnPk5ldyBpbiB2ZXJzaW9uICRyZWxlYXNlLjwvc3Bhbj5cbiIKKyAgICAgICAgICAgIC4gJF8pOworfQorCitzdWIgZG9fY21kX3ZlcnNpb25jaGFuZ2VkeworICAgICMgb25lIHBhcmFtZXRlcjogIFx2ZXJzaW9uY2hhbmdlZHt2ZXJzaW9ufQorICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG15ICRleHBsYW5hdGlvbiA9IG5leHRfb3B0aW9uYWxfYXJndW1lbnQoKTsKKyAgICBteSAkcmVsZWFzZSA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBteSAkdGV4dCA9ICJDaGFuZ2VkIGluIHZlcnNpb24gJHJlbGVhc2UuIjsKKyAgICBpZiAoJGV4cGxhbmF0aW9uKSB7CisgICAgICAgICR0ZXh0ID0gIkNoYW5nZWQgaW4gdmVyc2lvbiAkcmVsZWFzZTpcbiRleHBsYW5hdGlvbi4iOworICAgIH0KKyAgICByZXR1cm4gIlxuPHNwYW4gY2xhc3M9J3ZlcnNpb25ub3RlJz4kdGV4dDwvc3Bhbj5cbiIgLiAkXzsKK30KKworIworIyBUaGVzZSBmdW5jdGlvbiBoYW5kbGUgcGxhdGZvcm0gZGVwZW5kZW5jeSB0cmFja2luZy4KKyMKK3N1YiBkb19jbWRfcGxhdGZvcm17CisgICAgbG9jYWwoJF8pID0gQF87CisgICAgbXkgJHBsYXRmb3JtID0gbmV4dF9hcmd1bWVudCgpOworICAgICRNb2R1bGVQbGF0Zm9ybXN7Ijx0dCBjbGFzcz0nbW9kdWxlJz4kVEhJU19NT0RVTEU8L3R0PiJ9ID0gJHBsYXRmb3JtOworICAgICRwbGF0Zm9ybSA9ICJNYWNpbnRvc2giCisgICAgICBpZiAkcGxhdGZvcm0gZXEgJ01hYyc7CisgICAgcmV0dXJuICJcbjxwIGNsYXNzPSdhdmFpbGFiaWxpdHknPkF2YWlsYWJpbGl0eTogPHNwYW4iCisgICAgICAuICJcbiBjbGFzcz0ncGxhdGZvcm0nPiRwbGF0Zm9ybTwvc3Bhbj4uPC9wPlxuIiAuICRfOworfQorCiskSUdOT1JFX1BMQVRGT1JNX0FOTk9UQVRJT04gPSAnJzsKK3N1YiBkb19jbWRfaWdub3JlUGxhdGZvcm1Bbm5vdGF0aW9ueworICAgIGxvY2FsKCRfKSA9IEBfOworICAgICRJR05PUkVfUExBVEZPUk1fQU5OT1RBVElPTiA9IG5leHRfYXJndW1lbnQoKTsKKyAgICByZXR1cm4gJF87Cit9CisKKworIyBpbmRleCBjb21tYW5kcworCiskSU5ERVhfU1VCSVRFTSA9ICIiOworCitzdWIgZ2V0X2luZGV4c3ViaXRlbXsKKyAgICByZXR1cm4gJElOREVYX1NVQklURU0gPyAiICRJTkRFWF9TVUJJVEVNIiA6ICcnOworfQorCitzdWIgZG9fY21kX3NldGluZGV4c3ViaXRlbXsKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICAkSU5ERVhfU1VCSVRFTSA9IG5leHRfYXJndW1lbnQoKTsKKyAgICByZXR1cm4gJF87Cit9CisKK3N1YiBkb19jbWRfd2l0aHN1Yml0ZW17CisgICAgIyBXZSBjYW4ndCByZWFsbHkgZG8gdGhlIHJpZ2h0IHRoaW5nLCBiZWNhdXNlIExhVGVYMkhUTUwgZG9lc24ndAorICAgICMgZG8gdGhpbmdzIGluIHRoZSByaWdodCBvcmRlciwgYnV0IHdlIG5lZWQgdG8gYXQgbGVhc3Qgc3RyaXAgdGhpcyBzdHVmZgorICAgICMgb3V0LCBhbmQgbGVhdmUgYW55dGhpbmcgdGhhdCB0aGUgc2Vjb25kIGFyZ3VtZW50IGV4cGFuZGVkIG91dCB0by4KKyAgICAjCisgICAgbG9jYWwoJF8pID0gQF87CisgICAgbXkgJG9sZHN1Yml0ZW0gPSAkSU5ERVhfU1VCSVRFTTsKKyAgICAkSU5ERVhfU1VCSVRFTSA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBteSAkc3R1ZmYgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJGJyX2lkID0gKyskZ2xvYmFsc3snbWF4X2lkJ307CisgICAgbXkgJG1hcmtlciA9ICIkTyRicl9pZCRDIjsKKyAgICByZXR1cm4KKyAgICAgICRzdHVmZgorICAgICAgLiAiXFxzZXRpbmRleHN1Yml0ZW0kbWFya2VyJG9sZHN1Yml0ZW0kbWFya2VyIgorICAgICAgLiAkXzsKK30KKworIyBUaGlzIGlzIHRoZSBwcm9sb2d1ZSBtYWNybyB3aGljaCBpcyByZXF1aXJlZCB0byBzdGFydCB3cml0aW5nIHRoZQorIyBtb2Rcam9ibmFtZS5pZHggZmlsZTsgd2UgY2FuIGp1c3QgaWdub3JlIGl0LiAgKERlZmluaW5nIHRoaXMgc3VwcHJlc3NlcworIyBhIHdhcm5pbmcgdGhhdCBcbWFrZW1vZGluZGV4IGlzIHVua25vd24uKQorIworc3ViIGRvX2NtZF9tYWtlbW9kaW5kZXh7IHJldHVybiBAX1swXTsgfQorCisjIFdlJ3JlIGluIHRoZSBkb2N1bWVudCBzdWJkaXJlY3Rvcnkgd2hlbiB0aGlzIGhhcHBlbnMhCisjCitvcGVuKElEWEZJTEUsICc+aW5kZXguZGF0JykgfHwgZGllICJcbiQhXG4iOworb3BlbihJTlRMQUJFTFMsICc+aW50bGFiZWxzLnBsJykgfHwgZGllICJcbiQhXG4iOworcHJpbnQgSU5UTEFCRUxTICIlaW50ZXJuYWxfbGFiZWxzID0gKCk7XG4iOworcHJpbnQgSU5UTEFCRUxTICIxOwkJIyBoYWNrIGluIGNhc2UgdGhlcmUgYXJlIG5vIGVudHJpZXNcblxuIjsKKworIyBVc2luZyBcMCBmb3IgdGhpcyBpcyBiYWQgYmVjYXVzZSB3ZSBjYW4ndCB1c2UgY29tbW9uIHRvb2xzIHRvIHdvcmsgd2l0aCB0aGUKKyMgcmVzdWx0aW5nIGZpbGVzLiAgVGhpbmdzIGxpa2UgZ3JlcCBjYW4gYmUgdXNlZnVsIHdpdGggdGhpcyBzdHVmZiEKKyMKKyRJRFhGSUxFX0ZJRUxEX1NFUCA9ICJcMSI7CisKK3N1YiB3cml0ZV9pZHhmaWxleworICAgIG15ICgkYWhyZWYsICRzdHIpID0gQF87CisgICAgcHJpbnQgSURYRklMRSAkYWhyZWYsICRJRFhGSUxFX0ZJRUxEX1NFUCwgJHN0ciwgIlxuIjsKK30KKworCitzdWIgZ2VuX2xpbmt7CisgICAgbXkoJG5vZGUsJHRhcmdldCkgPSBAXzsKKyAgICBwcmludCBJTlRMQUJFTFMgIlwkaW50ZXJuYWxfbGFiZWxze1wiJHRhcmdldFwifSA9IFwiJFVSTC8kbm9kZVwiO1xuIjsKKyAgICByZXR1cm4gIjxhIGhyZWY9JyRub2RlIyR0YXJnZXQnPiI7Cit9CisKK3N1YiBhZGRfaW5kZXhfZW50cnl7CisgICAgIyBhZGQgYW4gZW50cnkgdG8gdGhlIGluZGV4IHN0cnVjdHVyZXM7IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlCisgICAgbXkoJHN0ciwkYWhyZWYpID0gQF87CisgICAgJHN0ciA9IGdlbl9pbmRleF9pZCgkc3RyLCAnJyk7CisgICAgJGluZGV4eyRzdHJ9IC49ICRhaHJlZjsKKyAgICB3cml0ZV9pZHhmaWxlKCRhaHJlZiwgJHN0cik7Cit9CisKK3N1YiBuZXdfbGlua19pbmZveworICAgIG15ICRuYW1lID0gImwyaC0iIC4gKyskZ2xvYmFsc3snbWF4X2lkJ307CisgICAgbXkgJGFuYW1lID0gIjxhIG5hbWU9JyRuYW1lJz4iOworICAgIG15ICRhaHJlZiA9IGdlbl9saW5rKCRDVVJSRU5UX0ZJTEUsICRuYW1lKTsKKyAgICByZXR1cm4gKCRuYW1lLCAkYW5hbWUsICRhaHJlZik7Cit9CisKKyRJbmRleE1hY3JvUGF0dGVybiA9ICcnOworc3ViIGRlZmluZV9pbmRleGluZ19tYWNyb3sKKyAgICBteSAkY291bnQgPSBAXzsKKyAgICBteSAkaSA9IDA7CisgICAgZm9yICg7ICRpIDwgJGNvdW50OyArKyRpKSB7CisJbXkgJG5hbWUgPSBAX1skaV07CisJbXkgJGNtZCA9ICJpZHhfY21kXyRuYW1lIjsKKwlkaWUgIlxuTm8gZnVuY3Rpb24gJGNtZCgpIGRlZmluZWQhXG4iCisJICBpZiAoIWRlZmluZWQgJiRjbWQpOworCWV2YWwgKCJzdWIgZG9fY21kXyRuYW1lIHsgcmV0dXJuIHByb2Nlc3NfaW5kZXhfbWFjcm9zKCIKKwkgICAgICAuICJcQF9bMF0sICckbmFtZScpOyB9Iik7CisJaWYgKGxlbmd0aCgkSW5kZXhNYWNyb1BhdHRlcm4pID09IDApIHsKKwkgICAgJEluZGV4TWFjcm9QYXR0ZXJuID0gIiRuYW1lIjsKKwl9CisJZWxzZSB7CisJICAgICRJbmRleE1hY3JvUGF0dGVybiAuPSAifCRuYW1lIjsKKwl9CisgICAgfQorfQorCiskREVCVUdfSU5ERVhJTkcgPSAwOworc3ViIHByb2Nlc3NfaW5kZXhfbWFjcm9zeworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG15ICRjbWRuYW1lID0gQF9bMV07CSMgVGhpcyBpcyB3aGF0IHRyaWdnZXJlZCB1cyBpbiB0aGUgZmlyc3QgcGxhY2U7CisJCQkJIyB3ZSBrbm93IGl0J3MgcmVhbCwgc28ganVzdCBwcm9jZXNzIGl0LgorICAgIG15KCRuYW1lLCRhbmFtZSwkYWhyZWYpID0gbmV3X2xpbmtfaW5mbygpOworICAgIG15ICRjbWQgPSAiaWR4X2NtZF8kY21kbmFtZSI7CisgICAgcHJpbnQgIlxuSW5kZXhpbmc6IFxcJGNtZG5hbWUiCisgICAgICBpZiAkREVCVUdfSU5ERVhJTkc7CisgICAgJiRjbWQoJGFocmVmKTsJCSMgbW9kaWZpZXMgJF8gYW5kIGFkZHMgaW5kZXggZW50cmllcworICAgIHdoaWxlICgvXltcc1xuXSpcXCgkSW5kZXhNYWNyb1BhdHRlcm4pPC8pIHsKKwkkY21kbmFtZSA9ICIkMSI7CisJcHJpbnQgIiBcXCRjbWRuYW1lIgorCSAgaWYgJERFQlVHX0lOREVYSU5HOworCSRjbWQgPSAiaWR4X2NtZF8kY21kbmFtZSI7CisJaWYgKCFkZWZpbmVkICYkY21kKSB7CisJICAgIGxhc3Q7CisJfQorCWVsc2UgeworCSAgICBzL15bXHNcbl0qXFwkY21kbmFtZS8vOworCSAgICAmJGNtZCgkYWhyZWYpOworCX0KKyAgICB9CisgICAgaWYgKC9eWyBcdFxyXG5dLykgeworICAgICAgICAkXyA9IHN1YnN0cigkXywgMSk7CisgICAgfQorICAgIHJldHVybiAiJGFuYW1lJGFuY2hvcl9pbnZpc2libGVfbWFyazwvYT4iIC4gJF87Cit9CisKK2RlZmluZV9pbmRleGluZ19tYWNybygnaW5kZXgnKTsKK3N1YiBpZHhfY21kX2luZGV4eworICAgIG15ICRzdHIgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgYWRkX2luZGV4X2VudHJ5KCIkc3RyIiwgQF9bMF0pOworfQorCitkZWZpbmVfaW5kZXhpbmdfbWFjcm8oJ2t3aW5kZXgnKTsKK3N1YiBpZHhfY21kX2t3aW5kZXh7CisgICAgbXkgJHN0ciA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBhZGRfaW5kZXhfZW50cnkoIjx0dD4kc3RyPC90dD4ha2V5d29yZCIsIEBfWzBdKTsKKyAgICBhZGRfaW5kZXhfZW50cnkoImtleXdvcmQhPHR0PiRzdHI8L3R0PiIsIEBfWzBdKTsKK30KKworZGVmaW5lX2luZGV4aW5nX21hY3JvKCdpbmRleGlpJyk7CitzdWIgaWR4X2NtZF9pbmRleGlpeworICAgIG15ICRzdHIxID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICRzdHIyID0gbmV4dF9hcmd1bWVudCgpOworICAgIGFkZF9pbmRleF9lbnRyeSgiJHN0cjEhJHN0cjIiLCBAX1swXSk7CisgICAgYWRkX2luZGV4X2VudHJ5KCIkc3RyMiEkc3RyMSIsIEBfWzBdKTsKK30KKworZGVmaW5lX2luZGV4aW5nX21hY3JvKCdpbmRleGlpaScpOworc3ViIGlkeF9jbWRfaW5kZXhpaWl7CisgICAgbXkgJHN0cjEgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJHN0cjIgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJHN0cjMgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgYWRkX2luZGV4X2VudHJ5KCIkc3RyMSEkc3RyMiAkc3RyMyIsIEBfWzBdKTsKKyAgICBhZGRfaW5kZXhfZW50cnkoIiRzdHIyISRzdHIzLCAkc3RyMSIsIEBfWzBdKTsKKyAgICBhZGRfaW5kZXhfZW50cnkoIiRzdHIzISRzdHIxICRzdHIyIiwgQF9bMF0pOworfQorCitkZWZpbmVfaW5kZXhpbmdfbWFjcm8oJ2luZGV4aXYnKTsKK3N1YiBpZHhfY21kX2luZGV4aXZ7CisgICAgbXkgJHN0cjEgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJHN0cjIgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJHN0cjMgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJHN0cjQgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgYWRkX2luZGV4X2VudHJ5KCIkc3RyMSEkc3RyMiAkc3RyMyAkc3RyNCIsIEBfWzBdKTsKKyAgICBhZGRfaW5kZXhfZW50cnkoIiRzdHIyISRzdHIzICRzdHI0LCAkc3RyMSIsIEBfWzBdKTsKKyAgICBhZGRfaW5kZXhfZW50cnkoIiRzdHIzISRzdHI0LCAkc3RyMSAkc3RyMiIsIEBfWzBdKTsKKyAgICBhZGRfaW5kZXhfZW50cnkoIiRzdHI0ISQkc3RyMSAkc3RyMiAkc3RyMyIsIEBfWzBdKTsKK30KKworZGVmaW5lX2luZGV4aW5nX21hY3JvKCd0dGluZGV4Jyk7CitzdWIgaWR4X2NtZF90dGluZGV4eworICAgIG15ICRzdHIgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJGVudHJ5ID0gJHN0ciAuIGdldF9pbmRleHN1Yml0ZW0oKTsKKyAgICBhZGRfaW5kZXhfZW50cnkoJGVudHJ5LCBAX1swXSk7Cit9CisKK3N1YiBteV90eXBlZF9pbmRleF9oZWxwZXJ7CisgICAgbXkoJHdvcmQsJGFocmVmKSA9IEBfOworICAgIG15ICRzdHIgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgYWRkX2luZGV4X2VudHJ5KCIkc3RyICR3b3JkIiwgJGFocmVmKTsKKyAgICBhZGRfaW5kZXhfZW50cnkoIiR3b3JkISRzdHIiLCAkYWhyZWYpOworfQorCitkZWZpbmVfaW5kZXhpbmdfbWFjcm8oJ3N0aW5kZXgnLCAnb3BpbmRleCcsICdleGluZGV4JywgJ29iaW5kZXgnKTsKK3N1YiBpZHhfY21kX3N0aW5kZXh7IG15X3R5cGVkX2luZGV4X2hlbHBlcignc3RhdGVtZW50JywgQF9bMF0pOyB9CitzdWIgaWR4X2NtZF9vcGluZGV4eyBteV90eXBlZF9pbmRleF9oZWxwZXIoJ29wZXJhdG9yJywgQF9bMF0pOyB9CitzdWIgaWR4X2NtZF9leGluZGV4eyBteV90eXBlZF9pbmRleF9oZWxwZXIoJ2V4Y2VwdGlvbicsIEBfWzBdKTsgfQorc3ViIGlkeF9jbWRfb2JpbmRleHsgbXlfdHlwZWRfaW5kZXhfaGVscGVyKCdvYmplY3QnLCBAX1swXSk7IH0KKworZGVmaW5lX2luZGV4aW5nX21hY3JvKCdiaWZ1bmNpbmRleCcpOworc3ViIGlkeF9jbWRfYmlmdW5jaW5kZXh7CisgICAgbXkgJHN0ciA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBhZGRfaW5kZXhfZW50cnkoIjx0dCBjbGFzcz0nZnVuY3Rpb24nPiRzdHIoKTwvdHQ+IChidWlsdC1pbiBmdW5jdGlvbikiLAorICAgICAgICAgICAgICAgICAgICBAX1swXSk7Cit9CisKKworc3ViIG1ha2VfbW9kX2luZGV4X2VudHJ5eworICAgIG15KCRzdHIsJGRlZmluZSkgPSBAXzsKKyAgICBteSgkbmFtZSwkYW5hbWUsJGFocmVmKSA9IG5ld19saW5rX2luZm8oKTsKKyAgICAjIGVxdWl2YWxlbnQgb2YgYWRkX2luZGV4X2VudHJ5KCkgdXNpbmcgJGRlZmluZSBpbnN0ZWFkIG9mICcnCisgICAgJGFocmVmID1+IHMvXCNbLV9hLXpBLVowLTldKlwiL1wiLworICAgICAgaWYgKCRkZWZpbmUgZXEgJ0RFRicpOworICAgICRzdHIgPSBnZW5faW5kZXhfaWQoJHN0ciwgJGRlZmluZSk7CisgICAgJGluZGV4eyRzdHJ9IC49ICRhaHJlZjsKKyAgICB3cml0ZV9pZHhmaWxlKCRhaHJlZiwgJHN0cik7CisKKyAgICBpZiAoJGRlZmluZSBlcSAnREVGJykgeworCSMgYWRkIHRvIHRoZSBtb2R1bGUgaW5kZXgKKyAgICAgICAgJHN0ciA9fiAvKDx0dC4qPFwvdHQ+KS87CisgICAgICAgIG15ICRuc3RyID0gJDE7CisJJE1vZHVsZXN7JG5zdHJ9IC49ICRhaHJlZjsKKyAgICB9CisgICAgcmV0dXJuICIkYW5hbWUkYW5jaG9yX2ludmlzaWJsZV9tYXJrMjwvYT4iOworfQorCisKKyRUSElTX01PRFVMRSA9ICcnOworJFRISVNfQ0xBU1MgPSAnJzsKKworc3ViIGRlZmluZV9tb2R1bGV7CisgICAgbXkoJHdvcmQsJG5hbWUpID0gQF87CisgICAgbXkgJHNlY3Rpb25fdGFnID0gam9pbignJywgQGN1cnJfc2VjX2lkKTsKKyAgICBpZiAoJHdvcmQgbmUgImJ1aWx0LWluIiAmJiAkd29yZCBuZSAiZXh0ZW5zaW9uIgorCSYmICR3b3JkIG5lICJzdGFuZGFyZCIgJiYgJHdvcmQgbmUgIiIpIHsKKwl3cml0ZV93YXJuaW5ncygiQmFkIG1vZHVsZSB0eXBlICckd29yZCciCisJCSAgICAgICAuICIgZm9yIFxcZGVjbGFyZW1vZHVsZSAobW9kdWxlICRuYW1lKSIpOworCSR3b3JkID0gIiI7CisgICAgfQorICAgICR3b3JkID0gIiR3b3JkICIgaWYgJHdvcmQ7CisgICAgJFRISVNfTU9EVUxFID0gIiRuYW1lIjsKKyAgICAkSU5ERVhfU1VCSVRFTSA9ICIoaW4gbW9kdWxlICRuYW1lKSI7CisgICAgcHJpbnQgIlskbmFtZV0iOworICAgIHJldHVybiBtYWtlX21vZF9pbmRleF9lbnRyeSgKKyAgICAgICAgIjx0dCBjbGFzcz0nbW9kdWxlJz4kbmFtZTwvdHQ+ICgke3dvcmR9bW9kdWxlKSIsICdERUYnKTsKK30KKworc3ViIG15X21vZHVsZV9pbmRleF9oZWxwZXJ7CisgICAgbG9jYWwoJHdvcmQsICRfKSA9IEBfOworICAgIG15ICRuYW1lID0gbmV4dF9hcmd1bWVudCgpOworICAgIHJldHVybiBkZWZpbmVfbW9kdWxlKCR3b3JkLCAkbmFtZSkgLiAkXzsKK30KKworc3ViIGRvX2NtZF9tb2RpbmRleHsgcmV0dXJuIG15X21vZHVsZV9pbmRleF9oZWxwZXIoJycsIEBfKTsgfQorc3ViIGRvX2NtZF9iaW1vZGluZGV4eyByZXR1cm4gbXlfbW9kdWxlX2luZGV4X2hlbHBlcignYnVpbHQtaW4nLCBAXyk7IH0KK3N1YiBkb19jbWRfZXhtb2RpbmRleHsgcmV0dXJuIG15X21vZHVsZV9pbmRleF9oZWxwZXIoJ2V4dGVuc2lvbicsIEBfKTsgfQorc3ViIGRvX2NtZF9zdG1vZGluZGV4eyByZXR1cm4gbXlfbW9kdWxlX2luZGV4X2hlbHBlcignc3RhbmRhcmQnLCBAXyk7IH0KKworc3ViIHJlZl9tb2R1bGVfaW5kZXhfaGVscGVyeworICAgIG15KCR3b3JkLCAkYWhyZWYpID0gQF87CisgICAgbXkgJHN0ciA9IG5leHRfYXJndW1lbnQoKTsKKyAgICAkd29yZCA9ICIkd29yZCAiIGlmICR3b3JkOworICAgICRzdHIgPSAiPHR0IGNsYXNzPSdtb2R1bGUnPiRzdHI8L3R0PiAoJHt3b3JkfW1vZHVsZSkiOworICAgICMgY2FuJ3QgdXNlIGFkZF9pbmRleF9lbnRyeSgpIHNpbmNlIHRoZSAybmQgYXJnIHRvIGdlbl9pbmRleF9pZCgpIGlzIHVzZWQ7CisgICAgIyBqdXN0IGlubGluZSBpdCBhbGwgaGVyZQorICAgICRzdHIgPSBnZW5faW5kZXhfaWQoJHN0ciwgJ1JFRicpOworICAgICRpbmRleHskc3RyfSAuPSAkYWhyZWY7CisgICAgd3JpdGVfaWR4ZmlsZSgkYWhyZWYsICRzdHIpOworfQorCisjIHRoZXNlIHNob3VsZCBiZSBhZGp1c3RlZCBhIGJpdC4uLi4KK2RlZmluZV9pbmRleGluZ19tYWNybygncmVmbW9kaW5kZXgnLCAncmVmYmltb2RpbmRleCcsCisJCSAgICAgICdyZWZleG1vZGluZGV4JywgJ3JlZnN0bW9kaW5kZXgnKTsKK3N1YiBpZHhfY21kX3JlZm1vZGluZGV4eyByZXR1cm4gcmVmX21vZHVsZV9pbmRleF9oZWxwZXIoJycsIEBfKTsgfQorc3ViIGlkeF9jbWRfcmVmYmltb2RpbmRleHsgcmV0dXJuIHJlZl9tb2R1bGVfaW5kZXhfaGVscGVyKCdidWlsdC1pbicsIEBfKTsgfQorc3ViIGlkeF9jbWRfcmVmZXhtb2RpbmRleHsgcmV0dXJuIHJlZl9tb2R1bGVfaW5kZXhfaGVscGVyKCdleHRlbnNpb24nLCBAXyk7IH0KK3N1YiBpZHhfY21kX3JlZnN0bW9kaW5kZXh7IHJldHVybiByZWZfbW9kdWxlX2luZGV4X2hlbHBlcignc3RhbmRhcmQnLCBAXyk7IH0KKworc3ViIGRvX2NtZF9ub2RlbmFtZXsgcmV0dXJuIGRvX2NtZF9sYWJlbChAXyk7IH0KKworc3ViIGluaXRfbXlmb3JtYXR7CisgICAgJGFuY2hvcl9pbnZpc2libGVfbWFyayA9ICcmbmJzcDsnOworICAgICRhbmNob3JfaW52aXNpYmxlX21hcmsyID0gJyc7CisgICAgJGFuY2hvcl9tYXJrID0gJyc7CisgICAgJGljb25zeydhbmNob3JfbWFyayd9ID0gJyc7Cit9Citpbml0X215Zm9ybWF0KCk7CisKKyMgQ3JlYXRlIGFuIGluZGV4IGVudHJ5LCBidXQgaW5jbHVkZSB0aGUgc3RyaW5nIGluIHRoZSB0YXJnZXQgYW5jaG9yCisjIGluc3RlYWQgb2YgdGhlIGR1bW15IGZpbGxlci4KKyMKK3N1YiBtYWtlX3N0cl9pbmRleF9lbnRyeXsKKyAgICBteSgkc3RyKSA9IEBfOworICAgIG15KCRuYW1lLCRhbmFtZSwkYWhyZWYpID0gbmV3X2xpbmtfaW5mbygpOworICAgIGFkZF9pbmRleF9lbnRyeSgkc3RyLCAkYWhyZWYpOworICAgIHJldHVybiAiJGFuYW1lJHN0cjwvYT4iOworfQorCiskUkVGQ09VTlRTX0xPQURFRCA9IDA7CisKK3N1YiBsb2FkX3JlZmNvdW50c3sKKyAgICAkUkVGQ09VTlRTX0xPQURFRCA9IDE7CisKKyAgICBteSAkbXluYW1lLCAkbXlkaXIsICRteWV4dDsKKyAgICAoJG15bmFtZSwgJG15ZGlyLCAkbXlleHQpID0gZmlsZXBhcnNlKF9fRklMRV9fLCAnXC4uKicpOworICAgIGNob3AgJG15ZGlyOwkJCSMgcmVtb3ZlIHRyYWlsaW5nICcvJworICAgICgkbXluYW1lLCAkbXlkaXIsICRteWV4dCkgPSBmaWxlcGFyc2UoJG15ZGlyLCAnXC4uKicpOworICAgIGNob3AgJG15ZGlyOwkJCSMgcmVtb3ZlIHRyYWlsaW5nICcvJworICAgICRteWRpciA9IGdldGN3ZCgpIC4gIiRkZCRteWRpciIKKyAgICAgIHVubGVzcyAkbXlkaXIgPX4gc3xeL3wvfDsKKyAgICBsb2NhbCAkXzsKKyAgICBteSAkZmlsZW5hbWUgPSAiJG15ZGlyJHtkZH1hcGkke2RkfXJlZmNvdW50cy5kYXQiOworICAgIG9wZW4oUkVGQ09VTlRfRklMRSwgIjwkZmlsZW5hbWUiKSB8fCBkaWUgIlxuJCFcbiI7CisgICAgcHJpbnQgIltsb2FkaW5nIEFQSSByZWZjb3VudCBkYXRhXSI7CisgICAgd2hpbGUgKDxSRUZDT1VOVF9GSUxFPikgeworICAgICAgICBpZiAoLyhbYS16QS1aMC05X10rKTpQeU9iamVjdFwqOihbYS16QS1aMC05X10qKTooMHxbLStdMXxudWxsKTooLiopJC8pIHsKKyAgICAgICAgICAgIG15KCRmdW5jLCAkcGFyYW0sICRjb3VudCwgJGNvbW1lbnQpID0gKCQxLCAkMiwgJDMsICQ0KTsKKyAgICAgICAgICAgICNwcmludCAiXG4kZnVuYygkcGFyYW0pIC0tPiAkY291bnQiOworICAgICAgICAgICAgJFJFRkNPVU5UU3siJGZ1bmM6JHBhcmFtIn0gPSAkY291bnQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N1YiBnZXRfcmVmY291bnR7CisgICAgbXkgKCRmdW5jLCAkcGFyYW0pID0gQF87CisgICAgbG9hZF9yZWZjb3VudHMoKQorICAgICAgICB1bmxlc3MgJFJFRkNPVU5UU19MT0FERUQ7CisgICAgcmV0dXJuICRSRUZDT1VOVFN7IiRmdW5jOiRwYXJhbSJ9OworfQorCitzdWIgZG9fZW52X2NmdW5jZGVzY3sKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBteSAkcmV0dXJuX3R5cGUgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJGZ1bmN0aW9uX25hbWUgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJGFyZ19saXN0ID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICRpZHggPSBtYWtlX3N0cl9pbmRleF9lbnRyeSgKKyAgICAgICAgIjx0dCBjbGFzcz0nY2Z1bmN0aW9uJz4kZnVuY3Rpb25fbmFtZSgpPC90dD4iIC4gZ2V0X2luZGV4c3ViaXRlbSgpKTsKKyAgICAkaWR4ID1+IHMvIFwoLipcKS8vOworICAgICRpZHggPX4gcy9cKFwpLy87CQkjID8/Pz8gLSB3aHkgYm90aCBvZiB0aGVzZT8KKyAgICBteSAkcmVzdWx0X3JjID0gZ2V0X3JlZmNvdW50KCRmdW5jdGlvbl9uYW1lLCAnJyk7CisgICAgbXkgJHJjaW5mbyA9ICcnOworICAgIGlmICgkcmVzdWx0X3JjIGVxICcrMScpIHsKKyAgICAgICAgJHJjaW5mbyA9ICdOZXcgcmVmZXJlbmNlJzsKKyAgICB9CisgICAgZWxzaWYgKCRyZXN1bHRfcmMgZXEgJzAnKSB7CisgICAgICAgICRyY2luZm8gPSAnQm9ycm93ZWQgcmVmZXJlbmNlJzsKKyAgICB9CisgICAgZWxzaWYgKCRyZXN1bHRfcmMgZXEgJ251bGwnKSB7CisgICAgICAgICRyY2luZm8gPSAnQWx3YXlzIDx0dCBjbGFzcz0iY29uc3RhbnQiPk5VTEw8L3R0Pic7CisgICAgfQorICAgIGlmICgkcmNpbmZvIG5lICcnKSB7CisgICAgICAgICRyY2luZm8gPSAoICAiXG48ZGl2IGNsYXNzPVwicmVmY291bnQtaW5mb1wiPiIKKyAgICAgICAgICAgICAgICAgICAuICJcbiAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPlJldHVybiB2YWx1ZTo8L3NwYW4+IgorICAgICAgICAgICAgICAgICAgIC4gIlxuICA8c3BhbiBjbGFzcz1cInZhbHVlXCI+JHJjaW5mby48L3NwYW4+IgorICAgICAgICAgICAgICAgICAgIC4gIlxuPC9kaXY+Iik7CisgICAgfQorICAgIHJldHVybiAiPGRsPjxkdD4kcmV0dXJuX3R5cGUgPGI+JGlkeDwvYj4oPHZhcj4kYXJnX2xpc3Q8L3Zhcj4pXG48ZGQ+IgorICAgICAgICAgICAuICRyY2luZm8KKyAgICAgICAgICAgLiAkXworICAgICAgICAgICAuICc8L2RsPic7Cit9CisKK3N1YiBkb19lbnZfY3NpbXBsZW1hY3JvZGVzY3sKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBteSAkbmFtZSA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBteSAkaWR4ID0gbWFrZV9zdHJfaW5kZXhfZW50cnkoIjx0dCBjbGFzcz0nbWFjcm8nPiRuYW1lPC90dD4iKTsKKyAgICByZXR1cm4gIjxkbD48ZHQ+PGI+JGlkeDwvYj5cbjxkZD4iCisgICAgICAgICAgIC4gJF8KKyAgICAgICAgICAgLiAnPC9kbD4nCit9CisKK3N1YiBkb19lbnZfY3R5cGVkZXNjeworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG15ICRpbmRleF9uYW1lID0gbmV4dF9vcHRpb25hbF9hcmd1bWVudCgpOworICAgIG15ICR0eXBlX25hbWUgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgJGluZGV4X25hbWUgPSAkdHlwZV9uYW1lCisgICAgICB1bmxlc3MgJGluZGV4X25hbWU7CisgICAgbXkoJG5hbWUsJGFuYW1lLCRhaHJlZikgPSBuZXdfbGlua19pbmZvKCk7CisgICAgYWRkX2luZGV4X2VudHJ5KCI8dHQgY2xhc3M9J2N0eXBlJz4kaW5kZXhfbmFtZTwvdHQ+IChDIHR5cGUpIiwgJGFocmVmKTsKKyAgICByZXR1cm4gIjxkbD48ZHQ+PGI+PHR0IGNsYXNzPSdjdHlwZSc+JGFuYW1lJHR5cGVfbmFtZTwvYT48L3R0PjwvYj5cbjxkZD4iCisgICAgICAgICAgIC4gJF8KKyAgICAgICAgICAgLiAnPC9kbD4nCit9CisKK3N1YiBkb19lbnZfY3ZhcmRlc2N7CisgICAgbG9jYWwoJF8pID0gQF87CisgICAgbXkgJHZhcl90eXBlID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICR2YXJfbmFtZSA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBteSAkaWR4ID0gbWFrZV9zdHJfaW5kZXhfZW50cnkoIjx0dCBjbGFzcz0nY2RhdGEnPiR2YXJfbmFtZTwvdHQ+IgorCQkJCSAgIC4gZ2V0X2luZGV4c3ViaXRlbSgpKTsKKyAgICAkaWR4ID1+IHMvIFwoLipcKS8vOworICAgIHJldHVybiAiPGRsPjxkdD4kdmFyX3R5cGUgPGI+JGlkeDwvYj5cbiIKKyAgICAgICAgICAgLiAnPGRkPicKKyAgICAgICAgICAgLiAkXworICAgICAgICAgICAuICc8L2RsPic7Cit9CisKK3N1YiBjb252ZXJ0X2FyZ3MoJCl7CisgICAgbG9jYWwoJElOX0RFU0NfSEFORExFUikgPSAxOworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIHJldHVybiB0cmFuc2xhdGVfY29tbWFuZHMoJF8pOworfQorCitzdWIgZG9fZW52X2Z1bmNkZXNjeworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG15ICRmdW5jdGlvbl9uYW1lID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICRhcmdfbGlzdCA9IGNvbnZlcnRfYXJncyhuZXh0X2FyZ3VtZW50KCkpOworICAgIG15ICRpZHggPSBtYWtlX3N0cl9pbmRleF9lbnRyeSgiPHR0IGNsYXNzPSdmdW5jdGlvbic+JGZ1bmN0aW9uX25hbWUoKTwvdHQ+IgorCQkJCSAgIC4gZ2V0X2luZGV4c3ViaXRlbSgpKTsKKyAgICAkaWR4ID1+IHMvIFwoLipcKS8vOworICAgICRpZHggPX4gcy9cKFwpPFwvdHQ+LzxcL3R0Pi87CisgICAgcmV0dXJuICI8ZGw+PGR0PjxiPiRpZHg8L2I+KDx2YXI+JGFyZ19saXN0PC92YXI+KVxuPGRkPiIgLiAkXyAuICc8L2RsPic7Cit9CisKK3N1YiBkb19lbnZfZnVuY2Rlc2NuaXsKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBteSAkZnVuY3Rpb25fbmFtZSA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBteSAkYXJnX2xpc3QgPSBjb252ZXJ0X2FyZ3MobmV4dF9hcmd1bWVudCgpKTsKKyAgICByZXR1cm4gIjxkbD48ZHQ+PGI+PHR0IGNsYXNzPSdmdW5jdGlvbic+JGZ1bmN0aW9uX25hbWU8L3R0PjwvYj4iCisgICAgICAuICIoPHZhcj4kYXJnX2xpc3Q8L3Zhcj4pXG4iCisgICAgICAuICc8ZGQ+JworICAgICAgLiAkXworICAgICAgLiAnPC9kbD4nOworfQorCitzdWIgZG9fY21kX2Z1bmNsaW5leworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG15ICRmdW5jdGlvbl9uYW1lID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICRhcmdfbGlzdCA9IGNvbnZlcnRfYXJncyhuZXh0X2FyZ3VtZW50KCkpOworICAgIG15ICRwcmVmaXggPSAiPHR0IGNsYXNzPSdmdW5jdGlvbic+JGZ1bmN0aW9uX25hbWUoKTwvdHQ+IjsKKyAgICBteSAkaWR4ID0gbWFrZV9zdHJfaW5kZXhfZW50cnkoJHByZWZpeCAuIGdldF9pbmRleHN1Yml0ZW0oKSk7CisgICAgJHByZWZpeCA9fiBzL1woXCkvLzsKKworICAgIHJldHVybiAiPGR0PjxiPiRwcmVmaXg8L2I+KDx2YXI+JGFyZ19saXN0PC92YXI+KVxuPGRkPiIgLiAkXzsKK30KKworc3ViIGRvX2NtZF9mdW5jbGluZW5peworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG15ICRmdW5jdGlvbl9uYW1lID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICRhcmdfbGlzdCA9IGNvbnZlcnRfYXJncyhuZXh0X2FyZ3VtZW50KCkpOworICAgIG15ICRwcmVmaXggPSAiPHR0IGNsYXNzPSdmdW5jdGlvbic+JGZ1bmN0aW9uX25hbWU8L3R0PiI7CisKKyAgICByZXR1cm4gIjxkdD48Yj4kcHJlZml4PC9iPig8dmFyPiRhcmdfbGlzdDwvdmFyPilcbjxkZD4iIC4gJF87Cit9CisKKyMgQ2hhbmdlIHRoaXMgZmxhZyB0byBpbmRleCB0aGUgb3Bjb2RlIGVudHJpZXMuICBJIGRvbid0IHRoaW5rIGl0J3MgdmVyeQorIyB1c2VmdWwgdG8gaW5kZXggdGhlbSwgc2luY2UgdGhleSdyZSBvbmx5IHByZXNlbnRlZCB0byBkZXNjcmliZSB0aGUgZGlzCisjIG1vZHVsZS4KKyMKKyRJTkRFWF9PUENPREVTID0gMDsKKworc3ViIGRvX2Vudl9vcGNvZGVkZXNjeworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG15ICRvcGNvZGVfbmFtZSA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBteSAkYXJnX2xpc3QgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJGlkeDsKKyAgICBpZiAoJElOREVYX09QQ09ERVMpIHsKKwkkaWR4ID0gbWFrZV9zdHJfaW5kZXhfZW50cnkoIjx0dCBjbGFzcz0nb3Bjb2RlJz4kb3Bjb2RlX25hbWU8L3R0PiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiAoYnl0ZSBjb2RlIGluc3RydWN0aW9uKSIpOworCSRpZHggPX4gcy8gXChieXRlIGNvZGUgaW5zdHJ1Y3Rpb25cKS8vOworICAgIH0KKyAgICBlbHNlIHsKKwkkaWR4ID0gIjx0dCBjbGFzcz0nb3Bjb2RlJz4kb3Bjb2RlX25hbWU8L3R0PiI7CisgICAgfQorICAgIG15ICRzdHVmZiA9ICI8ZGw+PGR0PjxiPiRpZHg8L2I+IjsKKyAgICBpZiAoJGFyZ19saXN0KSB7CisJJHN0dWZmIC49ICImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8dmFyPiRhcmdfbGlzdDwvdmFyPiI7CisgICAgfQorICAgIHJldHVybiAkc3R1ZmYgLiAiXG48ZGQ+IiAuICRfIC4gJzwvZGw+JzsKK30KKworc3ViIGRvX2Vudl9kYXRhZGVzY3sKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBteSAkZGF0YW5hbWUgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJGlkeCA9IG1ha2Vfc3RyX2luZGV4X2VudHJ5KCI8dHQ+JGRhdGFuYW1lPC90dD4iIC4gZ2V0X2luZGV4c3ViaXRlbSgpKTsKKyAgICAkaWR4ID1+IHMvIFwoLipcKS8vOworICAgIHJldHVybiAiPGRsPjxkdD48Yj4kaWR4PC9iPlxuPGRkPiIKKyAgICAgICAgICAgLiAkXworCSAgIC4gJzwvZGw+JzsKK30KKworc3ViIGRvX2Vudl9kYXRhZGVzY25peworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG15ICRpZHggPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgaWYgKCEgJFNUUklOR19JTkRFWF9UVCkgeworCSRpZHggPSAiPHR0PiRpZHg8L3R0PiI7CisgICAgfQorICAgIHJldHVybiAiPGRsPjxkdD48Yj4kaWR4PC9iPlxuPGRkPiIgLiAkXyAuICc8L2RsPic7Cit9CisKK3N1YiBkb19jbWRfZGF0YWxpbmV7CisgICAgbG9jYWwoJF8pID0gQF87CisgICAgbXkgJGRhdGFfbmFtZSA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBteSAkaWR4ID0gbWFrZV9zdHJfaW5kZXhfZW50cnkoIjx0dD4kZGF0YV9uYW1lPC90dD4iIC4gZ2V0X2luZGV4c3ViaXRlbSgpKTsKKyAgICAkaWR4ID1+IHMvIFwoLipcKS8vOworICAgIHJldHVybiAiPGR0PjxiPiRpZHg8L2I+PGRkPiIgLiAkXzsKK30KKworc3ViIGRvX2NtZF9kYXRhbGluZW5peworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG15ICRkYXRhX25hbWUgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgcmV0dXJuICI8ZHQ+PGI+PHR0PiRkYXRhX25hbWU8L3R0PjwvYj48ZGQ+IiAuICRfOworfQorCitzdWIgZG9fZW52X2V4Y2Rlc2N7CisgICAgbG9jYWwoJF8pID0gQF87CisgICAgbXkgJGV4Y25hbWUgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJGlkeCA9IG1ha2Vfc3RyX2luZGV4X2VudHJ5KCI8dHQgY2xhc3M9J2V4Y2VwdGlvbic+JGV4Y25hbWU8L3R0PiIpOworICAgIHJldHVybiAiPGRsPjxkdD48Yj5leGNlcHRpb24gJGlkeDwvYj5cbjxkZD4iIC4gJF8gLiAnPC9kbD4nCit9CisKK3N1YiBkb19lbnZfZnVsbGxpbmVpdGVtc3sgcmV0dXJuIGRvX2Vudl9pdGVtaXplKEBfKTsgfQorCisKK3N1YiBoYW5kbGVfY2xhc3NsaWtlX2Rlc2NyaXB0b3J7CisgICAgbG9jYWwoJF8sICR3aGF0KSA9IEBfOworICAgICRUSElTX0NMQVNTID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICRhcmdfbGlzdCA9IGNvbnZlcnRfYXJncyhuZXh0X2FyZ3VtZW50KCkpOworICAgICRpZHggPSBtYWtlX3N0cl9pbmRleF9lbnRyeSgKKwkJIjx0dCBjbGFzcz0nJHdoYXQnPiRUSElTX0NMQVNTPC90dD4gKCR3aGF0IGluICRUSElTX01PRFVMRSkiICk7CisgICAgJGlkeCA9fiBzLyBcKC4qXCkvLzsKKyAgICByZXR1cm4gKCI8ZGw+PGR0PjxiPiR3aGF0ICRpZHg8L2I+KDx2YXI+JGFyZ19saXN0PC92YXI+KVxuPGRkPiIKKyAgICAgICAgICAgIC4gJF8KKyAgICAgICAgICAgIC4gJzwvZGw+Jyk7Cit9CisKK3N1YiBkb19lbnZfY2xhc3NkZXNjeworICAgIHJldHVybiBoYW5kbGVfY2xhc3NsaWtlX2Rlc2NyaXB0b3IoQF9bMF0sICJjbGFzcyIpOworfQorCitzdWIgZG9fZW52X2V4Y2NsYXNzZGVzY3sKKyAgICByZXR1cm4gaGFuZGxlX2NsYXNzbGlrZV9kZXNjcmlwdG9yKEBfWzBdLCAiZXhjZXB0aW9uIik7Cit9CisKKworc3ViIGRvX2Vudl9tZXRob2RkZXNjeworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG15ICRjbGFzc19uYW1lID0gbmV4dF9vcHRpb25hbF9hcmd1bWVudCgpOworICAgICRjbGFzc19uYW1lID0gJFRISVNfQ0xBU1MKKyAgICAgICAgdW5sZXNzICRjbGFzc19uYW1lOworICAgIG15ICRtZXRob2QgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJGFyZ19saXN0ID0gY29udmVydF9hcmdzKG5leHRfYXJndW1lbnQoKSk7CisgICAgbXkgJGV4dHJhID0gJyc7CisgICAgaWYgKCRjbGFzc19uYW1lKSB7CisJJGV4dHJhID0gIiAoJGNsYXNzX25hbWUgbWV0aG9kKSI7CisgICAgfQorICAgIG15ICRpZHggPSBtYWtlX3N0cl9pbmRleF9lbnRyeSgiPHR0IGNsYXNzPSdtZXRob2QnPiRtZXRob2QoKTwvdHQ+JGV4dHJhIik7CisgICAgJGlkeCA9fiBzLyBcKC4qXCkvLzsKKyAgICAkaWR4ID1+IHMvXChcKS8vOworICAgIHJldHVybiAiPGRsPjxkdD48Yj4kaWR4PC9iPig8dmFyPiRhcmdfbGlzdDwvdmFyPilcbjxkZD4iIC4gJF8gLiAnPC9kbD4nOworfQorCisKK3N1YiBkb19jbWRfbWV0aG9kbGluZXsKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBteSAkY2xhc3NfbmFtZSA9IG5leHRfb3B0aW9uYWxfYXJndW1lbnQoKTsKKyAgICAkY2xhc3NfbmFtZSA9ICRUSElTX0NMQVNTCisgICAgICAgIHVubGVzcyAkY2xhc3NfbmFtZTsKKyAgICBteSAkbWV0aG9kID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICRhcmdfbGlzdCA9IGNvbnZlcnRfYXJncyhuZXh0X2FyZ3VtZW50KCkpOworICAgIG15ICRleHRyYSA9ICcnOworICAgIGlmICgkY2xhc3NfbmFtZSkgeworCSRleHRyYSA9ICIgKCRjbGFzc19uYW1lIG1ldGhvZCkiOworICAgIH0KKyAgICBteSAkaWR4ID0gbWFrZV9zdHJfaW5kZXhfZW50cnkoIjx0dCBjbGFzcz0nbWV0aG9kJz4kbWV0aG9kKCk8L3R0PiRleHRyYSIpOworICAgICRpZHggPX4gcy8gXCguKlwpLy87CisgICAgJGlkeCA9fiBzL1woXCkvLzsKKyAgICByZXR1cm4gIjxkdD48Yj4kaWR4PC9iPig8dmFyPiRhcmdfbGlzdDwvdmFyPilcbjxkZD4iCisgICAgICAgICAgIC4gJF87Cit9CisKKworc3ViIGRvX2NtZF9tZXRob2RsaW5lbml7CisgICAgbG9jYWwoJF8pID0gQF87CisgICAgbmV4dF9vcHRpb25hbF9hcmd1bWVudCgpOworICAgIG15ICRtZXRob2QgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJGFyZ19saXN0ID0gY29udmVydF9hcmdzKG5leHRfYXJndW1lbnQoKSk7CisgICAgcmV0dXJuICI8ZHQ+PGI+JG1ldGhvZDwvYj4oPHZhcj4kYXJnX2xpc3Q8L3Zhcj4pXG48ZGQ+IgorICAgICAgICAgICAuICRfOworfQorCitzdWIgZG9fZW52X21ldGhvZGRlc2NuaXsKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBuZXh0X29wdGlvbmFsX2FyZ3VtZW50KCk7CisgICAgbXkgJG1ldGhvZCA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBteSAkYXJnX2xpc3QgPSBjb252ZXJ0X2FyZ3MobmV4dF9hcmd1bWVudCgpKTsKKyAgICByZXR1cm4gIjxkbD48ZHQ+PGI+JG1ldGhvZDwvYj4oPHZhcj4kYXJnX2xpc3Q8L3Zhcj4pXG48ZGQ+IgorICAgICAgICAgICAuICRfCisJICAgLiAnPC9kbD4nOworfQorCisKK3N1YiBkb19lbnZfbWVtYmVyZGVzY3sKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBteSAkY2xhc3MgPSBuZXh0X29wdGlvbmFsX2FyZ3VtZW50KCk7CisgICAgbXkgJG1lbWJlciA9IG5leHRfYXJndW1lbnQoKTsKKyAgICAkY2xhc3MgPSAkVEhJU19DTEFTUworICAgICAgICB1bmxlc3MgJGNsYXNzOworICAgIG15ICRleHRyYSA9ICcnOworICAgICRleHRyYSA9ICIgKCRjbGFzcyBhdHRyaWJ1dGUpIgorICAgICAgICBpZiAoJGNsYXNzIG5lICcnKTsKKyAgICBteSAkaWR4ID0gbWFrZV9zdHJfaW5kZXhfZW50cnkoIjx0dCBjbGFzcz0nbWVtYmVyJz4kbWVtYmVyPC90dD4kZXh0cmEiKTsKKyAgICAkaWR4ID1+IHMvIFwoLipcKS8vOworICAgICRpZHggPX4gcy9cKFwpLy87CisgICAgcmV0dXJuICI8ZGw+PGR0PjxiPiRpZHg8L2I+XG48ZGQ+IiAuICRfIC4gJzwvZGw+JzsKK30KKworCitzdWIgZG9fY21kX21lbWJlcmxpbmV7CisgICAgbG9jYWwoJF8pID0gQF87CisgICAgbXkgJGNsYXNzID0gbmV4dF9vcHRpb25hbF9hcmd1bWVudCgpOworICAgIG15ICRtZW1iZXIgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgJGNsYXNzID0gJFRISVNfQ0xBU1MKKyAgICAgICAgdW5sZXNzICRjbGFzczsKKyAgICBteSAkZXh0cmEgPSAnJzsKKyAgICAkZXh0cmEgPSAiICgkY2xhc3MgYXR0cmlidXRlKSIKKyAgICAgICAgaWYgKCRjbGFzcyBuZSAnJyk7CisgICAgbXkgJGlkeCA9IG1ha2Vfc3RyX2luZGV4X2VudHJ5KCI8dHQgY2xhc3M9J21lbWJlcic+JG1lbWJlcjwvdHQ+JGV4dHJhIik7CisgICAgJGlkeCA9fiBzLyBcKC4qXCkvLzsKKyAgICAkaWR4ID1+IHMvXChcKS8vOworICAgIHJldHVybiAiPGR0PjxiPiRpZHg8L2I+PGRkPiIgLiAkXzsKK30KKworc3ViIGRvX2Vudl9tZW1iZXJkZXNjbml7CisgICAgbG9jYWwoJF8pID0gQF87CisgICAgbmV4dF9vcHRpb25hbF9hcmd1bWVudCgpOworICAgIG15ICRtZW1iZXIgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgcmV0dXJuICI8ZGw+PGR0PjxiPjx0dCBjbGFzcz0nbWVtYmVyJz4kbWVtYmVyPC90dD48L2I+XG48ZGQ+IgorICAgICAgICAgICAuICRfCisgICAgICAgICAgIC4gJzwvZGw+JzsKK30KKworCitzdWIgZG9fY21kX21lbWJlcmxpbmVuaXsKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBuZXh0X29wdGlvbmFsX2FyZ3VtZW50KCk7CisgICAgbXkgJG1lbWJlciA9IG5leHRfYXJndW1lbnQoKTsKKyAgICByZXR1cm4gIjxkdD48Yj48dHQgY2xhc3M9J21lbWJlcic+JG1lbWJlcjwvdHQ+PC9iPjxkZD4iIC4gJF87Cit9CisKK0Bjb2xfYWxpZ25zID0gKCc8dGQ+JywgJzx0ZD4nLCAnPHRkPicsICc8dGQ+Jyk7CisKK3N1YiBmaXhfZm9udHsKKyAgICAjIGRvIGEgbGl0dGxlIG1hZ2ljIG9uIGEgZm9udCBuYW1lIHRvIGdldCB0aGUgcmlnaHQgYmVoYXZpb3IgaW4gdGhlIGZpcnN0CisgICAgIyBjb2x1bW4gb2YgdGhlIG91dHB1dCB0YWJsZQorICAgIG15ICRmb250ID0gQF9bMF07CisgICAgaWYgKCRmb250IGVxICd0ZXh0cm0nKSB7CisJJGZvbnQgPSAnJzsKKyAgICB9CisgICAgZWxzaWYgKCRmb250IGVxICdmaWxlJyB8fCAkZm9udCBlcSAnZmlsZW5xJykgeworCSRmb250ID0gJ3R0IGNsYXNzPSJmaWxlIic7CisgICAgfQorICAgIGVsc2lmICgkZm9udCBlcSAnbWVtYmVyJykgeworICAgICAgICAkZm9udCA9ICd0dCBjbGFzcz0ibWVtYmVyIic7CisgICAgfQorICAgIGVsc2lmICgkZm9udCBlcSAnY2xhc3MnKSB7CisgICAgICAgICRmb250ID0gJ3R0IGNsYXNzPSJjbGFzcyInOworICAgIH0KKyAgICBlbHNpZiAoJGZvbnQgZXEgJ2NvbnN0YW50JykgeworICAgICAgICAkZm9udCA9ICd0dCBjbGFzcz0iY29uc3RhbnQiJzsKKyAgICB9CisgICAgZWxzaWYgKCRmb250IGVxICdrYmQnKSB7CisgICAgICAgICRmb250ID0gJ2tiZCc7CisgICAgfQorICAgIGVsc2lmICgkZm9udCBlcSAncHJvZ3JhbW9wdCcpIHsKKyAgICAgICAgJGZvbnQgPSAnYic7CisgICAgfQorICAgIGVsc2lmICgkZm9udCBlcSAnZXhjZXB0aW9uJykgeworICAgICAgICAkZm9udCA9ICd0dCBjbGFzcz0iZXhjZXB0aW9uIic7CisgICAgfQorICAgIHJldHVybiAkZm9udDsKK30KKworc3ViIGZpZ3VyZV9jb2x1bW5fYWxpZ25tZW50eworICAgIG15ICRhID0gQF9bMF07CisgICAgbXkgJG1hcmsgPSBzdWJzdHIoJGEsIDAsIDEpOworICAgIG15ICRyID0gJyc7CisgICAgaWYgKCRtYXJrIGVxICdjJykKKyAgICAgIHsgJHIgPSAnIGFsaWduPSJjZW50ZXIiJzsgfQorICAgIGVsc2lmICgkbWFyayBlcSAncicpCisgICAgICB7ICRyID0gJyBhbGlnbj0icmlnaHQiJzsgfQorICAgIGVsc2lmICgkbWFyayBlcSAnbCcpCisgICAgICB7ICRyID0gJyBhbGlnbj0ibGVmdCInOyB9CisgICAgZWxzaWYgKCRtYXJrIGVxICdwJykKKyAgICAgIHsgJHIgPSAnIGFsaWduPSJsZWZ0Iic7IH0KKyAgICByZXR1cm4gJHI7Cit9CisKK3N1YiBzZXR1cF9jb2x1bW5fYWxpZ25tZW50c3sKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBteSgkczEsJHMyLCRzMywkczQpID0gc3BsaXQoL1t8XS8sJF8pOworICAgIG15ICRhMSA9IGZpZ3VyZV9jb2x1bW5fYWxpZ25tZW50KCRzMSk7CisgICAgbXkgJGEyID0gZmlndXJlX2NvbHVtbl9hbGlnbm1lbnQoJHMyKTsKKyAgICBteSAkYTMgPSBmaWd1cmVfY29sdW1uX2FsaWdubWVudCgkczMpOworICAgIG15ICRhNCA9IGZpZ3VyZV9jb2x1bW5fYWxpZ25tZW50KCRzNCk7CisgICAgJGNvbF9hbGlnbnNbMF0gPSAiPHRkJGExIHZhbGlnbj1cImJhc2VsaW5lXCI+IjsKKyAgICAkY29sX2FsaWduc1sxXSA9ICI8dGQkYTI+IjsKKyAgICAkY29sX2FsaWduc1syXSA9ICI8dGQkYTM+IjsKKyAgICAkY29sX2FsaWduc1szXSA9ICI8dGQkYTQ+IjsKKyAgICAjIHJldHVybiB0aGUgYWxpZ25lZCBoZWFkZXIgc3RhcnQgdGFncworICAgIHJldHVybiAoIjx0aCRhMT4iLCAiPHRoJGEyPiIsICI8dGgkYTM+IiwgIjx0aCRhND4iKTsKK30KKworc3ViIGdldF90YWJsZV9jb2wxX2ZvbnRzeworICAgIG15ICRmb250ID0gJGdsb2JhbHN7J2xpbmVpZm9udCd9OworICAgIG15ICgkc2ZvbnQsJGVmb250KSA9ICgnJywgJycpOworICAgIGlmICgkZm9udCkgeworICAgICAgICAkc2ZvbnQgPSAiPCRmb250PiI7CisgICAgICAgICRlZm9udCA9ICI8LyRmb250PiI7CisgICAgICAgICRlZm9udCA9fiBzLyAuKj4vPi87CisgICAgfQorICAgIHJldHVybiAoJHNmb250LCAkZWZvbnQpOworfQorCitzdWIgZG9fZW52X3RhYmxlaWl7CisgICAgbG9jYWwoJF8pID0gQF87CisgICAgbXkoJHRoMSwkdGgyLCR0aDMsJHRoNCkgPSBzZXR1cF9jb2x1bW5fYWxpZ25tZW50cyhuZXh0X2FyZ3VtZW50KCkpOworICAgIG15ICRmb250ID0gZml4X2ZvbnQobmV4dF9hcmd1bWVudCgpKTsKKyAgICBteSAkaDEgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJGgyID0gbmV4dF9hcmd1bWVudCgpOworICAgIHMvW1xzXG5dKy8vOworICAgICRnbG9iYWxzeydsaW5laWZvbnQnfSA9ICRmb250OworICAgIG15ICRhMSA9ICRjb2xfYWxpZ25zWzBdOworICAgIG15ICRhMiA9ICRjb2xfYWxpZ25zWzFdOworICAgIHMvXFxsaW5laWk8L1xcbGluZWlpWyRhMXwkYTJdPC9nOworICAgIHJldHVybiAnPHRhYmxlIGJvcmRlciBhbGlnbj0iY2VudGVyIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSI+JworCSAgIC4gIlxuICA8dGhlYWQ+IgorCSAgIC4gIlxuICAgIDx0ciBjbGFzcz1cInRhYmxlaGVhZGVyXCI+IgorCSAgIC4gIlxuICAgICAgJHRoMTxiPiRoMTwvYj5cJm5ic3A7PC90aD4iCisJICAgLiAiXG4gICAgICAkdGgyPGI+JGgyPC9iPlwmbmJzcDs8L3RoPiIKKwkgICAuICJcbiAgICAgIDwvdHI+IgorCSAgIC4gIlxuICAgIDwvdGhlYWQ+IgorCSAgIC4gIlxuICA8dGJvZHkgdmFsaWduPSdiYXNlbGluZSc+IgorCSAgIC4gJF8KKwkgICAuICJcbiAgICA8L3Rib2R5PiIKKwkgICAuICJcbjwvdGFibGU+IjsKK30KKworc3ViIGRvX2Vudl9sb25ndGFibGVpaXsKKyAgICByZXR1cm4gZG9fZW52X3RhYmxlaWkoQF8pOworfQorCitzdWIgZG9fY21kX2xpbmVpaXsKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBteSAkYWxpZ25zID0gbmV4dF9vcHRpb25hbF9hcmd1bWVudCgpOworICAgIG15ICRjMSA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBteSAkYzIgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgcy9bXHNcbl0rLy87CisgICAgbXkoJHNmb250LCRlZm9udCkgPSBnZXRfdGFibGVfY29sMV9mb250cygpOworICAgICRjMiA9ICcmbmJzcDsnIGlmICgkYzIgZXEgJycpOworICAgIG15KCRjMWFsaWduLCRjMmFsaWduKSA9IHNwbGl0KCdcfCcsICRhbGlnbnMpOworICAgIG15ICRwYWRkaW5nID0gJyc7CisgICAgaWYgKCRjMWFsaWduID1+IC9hbGlnbj0icmlnaHQiLyB8fCAkYzEgZXEgJycpIHsKKyAgICAgICAgJHBhZGRpbmcgPSAnJm5ic3A7JzsKKyAgICB9CisgICAgcmV0dXJuICJcbiAgICA8dHI+JGMxYWxpZ24kc2ZvbnQkYzEkZWZvbnQkcGFkZGluZzwvdGQ+XG4iCisgICAgICAgICAgIC4gIiAgICAgICAgJGMyYWxpZ24kYzI8L3RkPiIKKwkgICAuICRfOworfQorCitzdWIgZG9fZW52X3RhYmxlaWlpeworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG15KCR0aDEsJHRoMiwkdGgzLCR0aDQpID0gc2V0dXBfY29sdW1uX2FsaWdubWVudHMobmV4dF9hcmd1bWVudCgpKTsKKyAgICBteSAkZm9udCA9IGZpeF9mb250KG5leHRfYXJndW1lbnQoKSk7CisgICAgbXkgJGgxID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICRoMiA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBteSAkaDMgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgcy9bXHNcbl0rLy87CisgICAgJGdsb2JhbHN7J2xpbmVpZm9udCd9ID0gJGZvbnQ7CisgICAgbXkgJGExID0gJGNvbF9hbGlnbnNbMF07CisgICAgbXkgJGEyID0gJGNvbF9hbGlnbnNbMV07CisgICAgbXkgJGEzID0gJGNvbF9hbGlnbnNbMl07CisgICAgcy9cXGxpbmVpaWk8L1xcbGluZWlpaVskYTF8JGEyfCRhM108L2c7CisgICAgcmV0dXJuICc8dGFibGUgYm9yZGVyIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIj4nCisJICAgLiAiXG4gIDx0aGVhZD4iCisJICAgLiAiXG4gICAgPHRyIGNsYXNzPVwidGFibGVoZWFkZXJcIj4iCisJICAgLiAiXG4gICAgICAkdGgxPGI+JGgxPC9iPlwmbmJzcDs8L3RoPiIKKwkgICAuICJcbiAgICAgICR0aDI8Yj4kaDI8L2I+XCZuYnNwOzwvdGg+IgorCSAgIC4gIlxuICAgICAgJHRoMzxiPiRoMzwvYj5cJm5ic3A7PC90aD4iCisJICAgLiAiXG4gICAgICA8L3RyPiIKKwkgICAuICJcbiAgICA8L3RoZWFkPiIKKwkgICAuICJcbiAgPHRib2R5IHZhbGlnbj0nYmFzZWxpbmUnPiIKKwkgICAuICRfCisJICAgLiAiXG4gICAgPC90Ym9keT4iCisJICAgLiAiXG48L3RhYmxlPiI7Cit9CisKK3N1YiBkb19lbnZfbG9uZ3RhYmxlaWlpeworICAgIHJldHVybiBkb19lbnZfdGFibGVpaWkoQF8pOworfQorCitzdWIgZG9fY21kX2xpbmVpaWl7CisgICAgbG9jYWwoJF8pID0gQF87CisgICAgbXkgJGFsaWducyA9IG5leHRfb3B0aW9uYWxfYXJndW1lbnQoKTsKKyAgICBteSAkYzEgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJGMyID0gbmV4dF9hcmd1bWVudCgpOyAKKyAgICBteSAkYzMgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgcy9bXHNcbl0rLy87CisgICAgbXkoJHNmb250LCRlZm9udCkgPSBnZXRfdGFibGVfY29sMV9mb250cygpOworICAgICRjMyA9ICcmbmJzcDsnIGlmICgkYzMgZXEgJycpOworICAgIG15KCRjMWFsaWduLCRjMmFsaWduLCRjM2FsaWduKSA9IHNwbGl0KCdcfCcsICRhbGlnbnMpOworICAgIG15ICRwYWRkaW5nID0gJyc7CisgICAgaWYgKCRjMWFsaWduID1+IC9hbGlnbj0icmlnaHQiLyB8fCAkYzEgZXEgJycpIHsKKyAgICAgICAgJHBhZGRpbmcgPSAnJm5ic3A7JzsKKyAgICB9CisgICAgcmV0dXJuICJcbiAgICA8dHI+JGMxYWxpZ24kc2ZvbnQkYzEkZWZvbnQkcGFkZGluZzwvdGQ+XG4iCisgICAgICAgICAgIC4gIiAgICAgICAgJGMyYWxpZ24kYzI8L3RkPlxuIgorCSAgIC4gIiAgICAgICAgJGMzYWxpZ24kYzM8L3RkPiIKKwkgICAuICRfOworfQorCitzdWIgZG9fZW52X3RhYmxlaXZ7CisgICAgbG9jYWwoJF8pID0gQF87CisgICAgbXkoJHRoMSwkdGgyLCR0aDMsJHRoNCkgPSBzZXR1cF9jb2x1bW5fYWxpZ25tZW50cyhuZXh0X2FyZ3VtZW50KCkpOworICAgIG15ICRmb250ID0gZml4X2ZvbnQobmV4dF9hcmd1bWVudCgpKTsKKyAgICBteSAkaDEgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJGgyID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICRoMyA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBteSAkaDQgPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgcy9bXHNcbl0rLy87CisgICAgJGdsb2JhbHN7J2xpbmVpZm9udCd9ID0gJGZvbnQ7CisgICAgbXkgJGExID0gJGNvbF9hbGlnbnNbMF07CisgICAgbXkgJGEyID0gJGNvbF9hbGlnbnNbMV07CisgICAgbXkgJGEzID0gJGNvbF9hbGlnbnNbMl07CisgICAgbXkgJGE0ID0gJGNvbF9hbGlnbnNbM107CisgICAgcy9cXGxpbmVpdjwvXFxsaW5laXZbJGExfCRhMnwkYTN8JGE0XTwvZzsKKyAgICByZXR1cm4gJzx0YWJsZSBib3JkZXIgYWxpZ249ImNlbnRlciIgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UiPicKKwkgICAuICJcbiAgPHRoZWFkPiIKKwkgICAuICJcbiAgICA8dHIgY2xhc3M9XCJ0YWJsZWhlYWRlclwiPiIKKwkgICAuICJcbiAgICAgICR0aDE8Yj4kaDE8L2I+XCZuYnNwOzwvdGg+IgorCSAgIC4gIlxuICAgICAgJHRoMjxiPiRoMjwvYj5cJm5ic3A7PC90aD4iCisJICAgLiAiXG4gICAgICAkdGgzPGI+JGgzPC9iPlwmbmJzcDs8L3RoPiIKKwkgICAuICJcbiAgICAgICR0aDQ8Yj4kaDQ8L2I+XCZuYnNwOzwvdGg+IgorCSAgIC4gIlxuICAgICAgPC90cj4iCisJICAgLiAiXG4gICAgPC90aGVhZD4iCisJICAgLiAiXG4gIDx0Ym9keSB2YWxpZ249J2Jhc2VsaW5lJz4iCisJICAgLiAkXworCSAgIC4gIlxuICAgIDwvdGJvZHk+IgorCSAgIC4gIlxuPC90YWJsZT4iOworfQorCitzdWIgZG9fZW52X2xvbmd0YWJsZWl2eworICAgIHJldHVybiBkb19lbnZfdGFibGVpdihAXyk7Cit9CisKK3N1YiBkb19jbWRfbGluZWl2eworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG15ICRhbGlnbnMgPSBuZXh0X29wdGlvbmFsX2FyZ3VtZW50KCk7CisgICAgbXkgJGMxID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICRjMiA9IG5leHRfYXJndW1lbnQoKTsgCisgICAgbXkgJGMzID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICRjNCA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBzL1tcc1xuXSsvLzsKKyAgICBteSgkc2ZvbnQsJGVmb250KSA9IGdldF90YWJsZV9jb2wxX2ZvbnRzKCk7CisgICAgJGM0ID0gJyZuYnNwOycgaWYgKCRjNCBlcSAnJyk7CisgICAgbXkoJGMxYWxpZ24sJGMyYWxpZ24sJGMzYWxpZ24sJGM0YWxpZ24pID0gc3BsaXQoJ1x8JywgJGFsaWducyk7CisgICAgbXkgJHBhZGRpbmcgPSAnJzsKKyAgICBpZiAoJGMxYWxpZ24gPX4gL2FsaWduPSJyaWdodCIvIHx8ICRjMSBlcSAnJykgeworICAgICAgICAkcGFkZGluZyA9ICcmbmJzcDsnOworICAgIH0KKyAgICByZXR1cm4gIlxuICAgIDx0cj4kYzFhbGlnbiRzZm9udCRjMSRlZm9udCRwYWRkaW5nPC90ZD5cbiIKKyAgICAgICAgICAgLiAiICAgICAgICAkYzJhbGlnbiRjMjwvdGQ+XG4iCisJICAgLiAiICAgICAgICAkYzNhbGlnbiRjMzwvdGQ+XG4iCisJICAgLiAiICAgICAgICAkYzRhbGlnbiRjNDwvdGQ+IgorCSAgIC4gJF87Cit9CisKKworIyBUaGVzZSBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSB0aXRsZSBwYWdlIGFwcGVhcmFuY2U7CisjIHRoZXkgbmVlZCBhIGxpdHRsZSBiaXQgb2YgZG9jdW1lbnRhdGlvbi4KKyMKKyMgSWYgJFRJVExFX1BBR0VfR1JBUEhJQyBpcyBzZXQsIGl0IHNob3VsZCBiZSB0aGUgbmFtZSBvZiBhIGZpbGUgaW4gdGhlCisjICRJQ09OU0VSVkVSIGRpcmVjdG9yeSwgb3IgaW5jbHVkZSBwYXRoIGluZm9ybWF0aW9uIChvdGhlciB0aGFuICIuLyIpLiAgVGhlCisjIGRlZmF1bHQgaW1hZ2UgdHlwZSB3aWxsIGJlIGFzc3VtZWQgaWYgYW4gZXh0ZW5zaW9uIGlzIG5vdCBwcm92aWRlZC4KKyMKKyMgSWYgc3BlY2lmaWVkLCB0aGUgInRpdGxlIHBhZ2UiIHdpbGwgY29udGFpbiB0d28gY29sdW1zOiBvbmUgY29udGFpbmluZyB0aGUKKyMgdGl0bGUvYXV0aG9yL2V0Yy4sIGFuZCB0aGUgb3RoZXIgY29udGFpbmluZyB0aGUgZ3JhcGhpYy4gIFVzZSB0aGUgb3RoZXIKKyMgZm91ciB2YXJpYWJsZXMgbGlzdGVkIGhlcmUgdG8gY29udHJvbCBzcGVjaWZpYyBkZXRhaWxzIG9mIHRoZSBsYXlvdXQ7IGFsbAorIyBhcmUgb3B0aW9uYWwuCisjCisjICRUSVRMRV9QQUdFX0dSQVBISUMgPSAibXktY29tcGFueS1sb2dvIjsKKyMgJFRJVExFX1BBR0VfR1JBUEhJQ19DT0xXSURUSCA9ICIzMCUiOworIyAkVElUTEVfUEFHRV9HUkFQSElDX1dJRFRIID0gMTUwOworIyAkVElUTEVfUEFHRV9HUkFQSElDX0hFSUdIVCA9IDE1MDsKKyMgJFRJVExFX1BBR0VfR1JBUEhJQ19PTl9SSUdIVCA9IDA7CisKK3N1YiBtYWtlX215X3RpdGxlcGFnZSgpIHsKKyAgICBteSAkdGhlX3RpdGxlID0gIiI7CisgICAgaWYgKCR0X3RpdGxlKSB7CisJJHRoZV90aXRsZSAuPSAiXG48aDE+JHRfdGl0bGU8L2gxPiI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB3cml0ZV93YXJuaW5ncygiXG5UaGlzIGRvY3VtZW50IGhhcyBubyB0aXRsZS4iKTsKKyAgICB9CisgICAgaWYgKCR0X2F1dGhvcikgeworCWlmICgkdF9hdXRob3JVUkwpIHsKKwkgICAgbXkgJGhyZWYgPSB0cmFuc2xhdGVfY29tbWFuZHMoJHRfYXV0aG9yVVJMKTsKKwkgICAgJGhyZWYgPSBtYWtlX25hbWVkX2hyZWYoJ2F1dGhvcicsICRocmVmLAorCQkJCSAgICAiPGI+PGZvbnQgc2l6ZT0nKzInPiR0X2F1dGhvcjwvZm9udD48L2I+Iik7CisJICAgICR0aGVfdGl0bGUgLj0gIlxuPHA+JGhyZWY8L3A+IjsKKwl9CisgICAgICAgIGVsc2UgeworCSAgICAkdGhlX3RpdGxlIC49ICgiXG48cD48Yj48Zm9udCBzaXplPScrMic+JHRfYXV0aG9yPC9mb250PjwvYj48L3A+Iik7CisJfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgd3JpdGVfd2FybmluZ3MoIlxuVGhlcmUgaXMgbm8gYXV0aG9yIGZvciB0aGlzIGRvY3VtZW50LiIpOworICAgIH0KKyAgICBpZiAoJHRfaW5zdGl0dXRlKSB7CisgICAgICAgICR0aGVfdGl0bGUgLj0gIlxuPHA+JHRfaW5zdGl0dXRlPC9wPiI7CisgICAgfQorICAgIGlmICgkREVWRUxPUEVSX0FERFJFU1MpIHsKKyAgICAgICAgJHRoZV90aXRsZSAuPSAiXG48cD4kREVWRUxPUEVSX0FERFJFU1M8L3A+IjsKKyAgICB9CisgICAgaWYgKCR0X2FmZmlsKSB7CisJJHRoZV90aXRsZSAuPSAiXG48cD48aT4kdF9hZmZpbDwvaT48L3A+IjsKKyAgICB9CisgICAgaWYgKCR0X2RhdGUpIHsKKwkkdGhlX3RpdGxlIC49ICJcbjxwPiI7CisJaWYgKCRQQUNLQUdFX1ZFUlNJT04pIHsKKwkgICAgJHRoZV90aXRsZSAuPSAiPHN0cm9uZz5SZWxlYXNlICRQQUNLQUdFX1ZFUlNJT048L3N0cm9uZz48YnI+XG4iOworICAgICAgICB9CisJJHRoZV90aXRsZSAuPSAiPHN0cm9uZz4kdF9kYXRlPC9zdHJvbmc+PC9wPiIKKyAgICB9CisgICAgaWYgKCR0X2FkZHJlc3MpIHsKKwkkdGhlX3RpdGxlIC49ICJcbjxwPiR0X2FkZHJlc3M8L3A+IjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICR0aGVfdGl0bGUgLj0gIlxuPHA+IjsKKyAgICB9CisgICAgaWYgKCR0X2VtYWlsKSB7CisJJHRoZV90aXRsZSAuPSAiXG48cD4kdF9lbWFpbDwvcD4iOworICAgIH0KKyAgICByZXR1cm4gJHRoZV90aXRsZTsKK30KKworc3ViIG1ha2VfbXlfdGl0bGVncmFwaGljKCkgeworICAgIG15ICRmaWxlbmFtZSA9IG1ha2VfaWNvbl9maWxlbmFtZSgkVElUTEVfUEFHRV9HUkFQSElDKTsKKyAgICBteSAkZ3JhcGhpYyA9ICI8dGQgY2xhc3M9XCJ0aXRsZWdyYXBoaWNcIiI7CisgICAgJGdyYXBoaWMgLj0gIiB3aWR0aD1cIiRUSVRMRV9QQUdFX0dSQVBISUNfQ09MV0lEVEhcIiIKKyAgICAgIGlmICgkVElUTEVfUEFHRV9HUkFQSElDX0NPTFdJRFRIKTsKKyAgICAkZ3JhcGhpYyAuPSAiPjxpbWciOworICAgICRncmFwaGljIC49ICIgd2lkdGg9XCIkVElUTEVfUEFHRV9HUkFQSElDX1dJRFRIXCIiCisgICAgICBpZiAoJFRJVExFX1BBR0VfR1JBUEhJQ19XSURUSCk7CisgICAgJGdyYXBoaWMgLj0gIiBoZWlnaHQ9XCIkVElUTEVfUEFHRV9HUkFQSElDX0hFSUdIVFwiIgorICAgICAgaWYgKCRUSVRMRV9QQUdFX0dSQVBISUNfSEVJR0hUKTsKKyAgICAkZ3JhcGhpYyAuPSAiXG4gIHNyYz1cIiRmaWxlbmFtZVwiPjwvdGQ+XG4iOworICAgIHJldHVybiAkZ3JhcGhpYzsKK30KKworc3ViIGRvX2NtZF9tYWtldGl0bGUgeworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG15ICR0aGVfdGl0bGUgPSAiXG48ZGl2IGNsYXNzPVwidGl0bGVwYWdlXCI+IjsKKyAgICBpZiAoJFRJVExFX1BBR0VfR1JBUEhJQykgeworICAgICAgICBpZiAoJFRJVExFX1BBR0VfR1JBUEhJQ19PTl9SSUdIVCkgeworICAgICAgICAgICAgJHRoZV90aXRsZSAuPSAoIlxuPHRhYmxlIGJvcmRlcj1cIjBcIiB3aWR0aD1cIjEwMCVcIj4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuICI8dHIgYWxpZ249XCJyaWdodFwiPlxuPHRkPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gbWFrZV9teV90aXRsZXBhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiPC90ZD5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gbWFrZV9teV90aXRsZWdyYXBoaWMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiPC90cj5cbjwvdGFibGU+Iik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkdGhlX3RpdGxlIC49ICgiXG48dGFibGUgYm9yZGVyPVwiMFwiIHdpZHRoPVwiMTAwJVwiPjx0cj5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gbWFrZV9teV90aXRsZWdyYXBoaWMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiPHRkPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gbWFrZV9teV90aXRsZXBhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiPC90ZD48L3RyPlxuPC90YWJsZT4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHRoZV90aXRsZSAuPSAoIlxuPGNlbnRlcj4iCisgICAgICAgICAgICAgICAgICAgICAgIC4gbWFrZV9teV90aXRsZXBhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgICAuICJcbjwvY2VudGVyPiIpOworICAgIH0KKyAgICAkdGhlX3RpdGxlIC49ICJcbjwvZGl2PiI7CisgICAgcmV0dXJuICR0aGVfdGl0bGUgLiAkXzsKKyAgICAkdGhlX3RpdGxlIC49ICJcbjwvY2VudGVyPjwvZGl2PiI7CisgICAgcmV0dXJuICR0aGVfdGl0bGUgLiAkXyA7Cit9CisKKworIworIyAgTW9kdWxlIHN5bm9wc2lzIHN1cHBvcnQKKyMKKworcmVxdWlyZSBTeW5vcHNpc1RhYmxlOworCitzdWIgZ2V0X2NoYXB0ZXJfaWQoKXsKKyAgICBteSAkaWQgPSBkb19jbWRfdGhlY2hhcHRlcignJyk7CisgICAgJGlkID1+IHMvPFNQQU4gQ0xBU1M9ImFyYWJpYyI+KFxkKyk8XC9TUEFOPi9cMS87CisgICAgJGlkID1+IHMvXC4vLzsKKyAgICByZXR1cm4gJGlkOworfQorCisjICdjaGFwdGVyJyA9PiAnU3lub3BzaXNUYWJsZSBpbnN0YW5jZScKKyVNb2R1bGVTeW5vcHNlcyA9ICgpOworCitzdWIgZ2V0X3N5bm9wc2lzX3RhYmxlKCQpeworICAgIG15KCRjaGFwKSA9IEBfOworICAgIG15ICRrZXk7CisgICAgZm9yZWFjaCAka2V5IChrZXlzICVNb2R1bGVTeW5vcHNlcykgeworCWlmICgka2V5IGVxICRjaGFwKSB7CisJICAgIHJldHVybiAkTW9kdWxlU3lub3BzZXN7JGNoYXB9OworCX0KKyAgICB9CisgICAgbXkgJHN0ID0gU3lub3BzaXNUYWJsZS0+bmV3KCk7CisgICAgJE1vZHVsZVN5bm9wc2VzeyRjaGFwfSA9ICRzdDsKKyAgICByZXR1cm4gJHN0OworfQorCitzdWIgZG9fY21kX21vZHVsZWF1dGhvcnsKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBuZXh0X2FyZ3VtZW50KCk7CisgICAgbmV4dF9hcmd1bWVudCgpOworICAgIHJldHVybiAkXzsKK30KKworc3ViIGRvX2NtZF9zZWN0aW9uYXV0aG9yeworICAgIGxvY2FsKCRfKSA9IEBfOworICAgIG5leHRfYXJndW1lbnQoKTsKKyAgICBuZXh0X2FyZ3VtZW50KCk7CisgICAgcmV0dXJuICRfOworfQorCitzdWIgZG9fY21kX2RlY2xhcmVtb2R1bGV7CisgICAgbG9jYWwoJF8pID0gQF87CisgICAgbXkgJGtleSA9IG5leHRfb3B0aW9uYWxfYXJndW1lbnQoKTsKKyAgICBteSAkdHlwZSA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBteSAkbmFtZSA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBteSAkc3QgPSBnZXRfc3lub3BzaXNfdGFibGUoZ2V0X2NoYXB0ZXJfaWQoKSk7CisgICAgIworICAgICRrZXkgPSAkbmFtZSB1bmxlc3MgJGtleTsKKyAgICAkdHlwZSA9ICdidWlsdC1pbicgaWYgJHR5cGUgZXEgJ2J1aWx0aW4nOworICAgICRzdC0+ZGVjbGFyZSgkbmFtZSwgJGtleSwgJHR5cGUpOworICAgIGRlZmluZV9tb2R1bGUoJHR5cGUsICRuYW1lKTsKKyAgICByZXR1cm4gYW5jaG9yX2xhYmVsKCJtb2R1bGUtJGtleSIsJENVUlJFTlRfRklMRSwkXykKK30KKworc3ViIGRvX2NtZF9tb2R1bGVzeW5vcHNpc3sKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBteSAkc3QgPSBnZXRfc3lub3BzaXNfdGFibGUoZ2V0X2NoYXB0ZXJfaWQoKSk7CisgICAgJHN0LT5zZXRfc3lub3BzaXMoJFRISVNfTU9EVUxFLCB0cmFuc2xhdGVfY29tbWFuZHMobmV4dF9hcmd1bWVudCgpKSk7CisgICAgcmV0dXJuICRfOworfQorCitzdWIgZG9fY21kX2xvY2FsbW9kdWxldGFibGV7CisgICAgbG9jYWwoJF8pID0gQF87CisgICAgbXkgJGNoYXAgPSBnZXRfY2hhcHRlcl9pZCgpOworICAgIG15ICRzdCA9IGdldF9zeW5vcHNpc190YWJsZSgkY2hhcCk7CisgICAgJHN0LT5zZXRfZmlsZSgiJENVUlJFTlRfRklMRSIpOworICAgIHJldHVybiAiPHRleDJodG1sLWxvY2FsbW9kdWxldGFibGU+PCRjaGFwPlxcdGFibGVvZmNoaWxkbGlua3Nbb2ZmXSIgLiAkXzsKK30KKworc3ViIHByb2Nlc3NfYWxsX2xvY2FsbW9kdWxldGFibGVzeworICAgIG15ICRrZXk7CisgICAgbXkgJHN0LCAkZmlsZTsKKyAgICBmb3JlYWNoICRrZXkgKGtleXMgJU1vZHVsZVN5bm9wc2VzKSB7CisgICAgICAgICRzdCA9ICRNb2R1bGVTeW5vcHNlc3ska2V5fTsKKyAgICAgICAgJGZpbGUgPSAkc3QtPmdldF9maWxlKCk7CisgICAgICAgIGlmICgkZmlsZSkgeworICAgICAgICAgICAgcHJvY2Vzc19sb2NhbG1vZHVsZXRhYmxlc19pbl9maWxlKCRmaWxlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ICJcbnN5bm9wc2lzIHRhYmxlICRrZXkgaGFzIG5vIGZpbGUgYXNzb2NpYXRpb24iOworICAgICAgICB9CisgICAgfQorfQorCitzdWIgcHJvY2Vzc19sb2NhbG1vZHVsZXRhYmxlc19pbl9maWxleworICAgIG15ICRmaWxlID0gQF9bMF07CisgICAgb3BlbihNWUZJTEUsICI8JGZpbGUiKTsKKyAgICBsb2NhbCgkXyk7CisgICAgc3lzcmVhZChNWUZJTEUsICRfLCAxMDI0KjEwMjQpOworICAgIGNsb3NlKE1ZRklMRSk7CisgICAgIyBuZWVkIHRvIGdldCBjb250ZW50cyBvZiBmaWxlIGluICRfCisgICAgd2hpbGUgKC88dGV4Mmh0bWwtbG9jYWxtb2R1bGV0YWJsZT48KFxkKyk+LykgeworCW15ICRtYXRjaCA9ICQmOworCW15ICRjaGFwID0gJDE7CisJbXkgJHN0ID0gZ2V0X3N5bm9wc2lzX3RhYmxlKCRjaGFwKTsKKwlteSAkZGF0YSA9ICRzdC0+dG9odG1sKCk7CisJcy8kbWF0Y2gvJGRhdGEvOworICAgIH0KKyAgICBvcGVuKE1ZRklMRSwiPiRmaWxlIik7CisgICAgcHJpbnQgTVlGSUxFICRfOworICAgIGNsb3NlKE1ZRklMRSk7Cit9CitzdWIgcHJvY2Vzc19weXRob25fc3RhdGV7CisgICAgcHJvY2Vzc19hbGxfbG9jYWxtb2R1bGV0YWJsZXMoKTsKK30KKworCisjCisjICAiU2VlIGFsc286IiAtLSByZWZlcmVuY2VzIHBsYWNlZCBhdCB0aGUgZW5kIG9mIGEgXHNlY3Rpb24KKyMKKworc3ViIGRvX2Vudl9zZWVhbHNveworICAgIHJldHVybiAiPGRpdiBjbGFzcz0nc2VlYWxzbyc+XG4gICIKKyAgICAgIC4gIjxwIGNsYXNzPSdoZWFkaW5nJz48Yj5TZWUgQWxzbzo8L2I+PC9wPlxuIgorICAgICAgLiBAX1swXQorICAgICAgLiAnPC9kaXY+JzsKK30KKworc3ViIGRvX2NtZF9zZWVtb2R1bGV7CisgICAgIyBJbnNlcnQgdGhlIHJpZ2h0IG1hZ2ljIHRvIGp1bXAgdG8gdGhlIG1vZHVsZSBkZWZpbml0aW9uLiAgVGhpcyBzaG91bGQKKyAgICAjIHdvcmsgbW9zdCBvZiB0aGUgdGltZSwgYXQgbGVhc3QgZm9yIHJlcGVhdCBidWlsZHMuLi4uCisgICAgbG9jYWwoJF8pID0gQF87CisgICAgbXkgJGtleSA9IG5leHRfb3B0aW9uYWxfYXJndW1lbnQoKTsKKyAgICBteSAkbW9kdWxlID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICR0ZXh0ID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICRwZXJpb2QgPSAnLic7CisgICAgJGtleSA9ICRtb2R1bGUKKyAgICAgICAgdW5sZXNzICRrZXk7CisgICAgaWYgKCR0ZXh0ID1+IC9cLiQvKSB7CisJJHBlcmlvZCA9ICcnOworICAgIH0KKyAgICByZXR1cm4gJzxkbCBjb21wYWN0IGNsYXNzPSJzZWVtb2R1bGUiPicKKyAgICAgIC4gIlxuICAgIDxkdD5Nb2R1bGUgPGI+PHR0IGNsYXNzPSdtb2R1bGUnPjxhIGhyZWY9J21vZHVsZS0ka2V5Lmh0bWwnPiIKKyAgICAgIC4gIiRtb2R1bGU8L2E+PC90dD46PC9iPiIKKyAgICAgIC4gIlxuICAgIDxkZD4kdGV4dCRwZXJpb2RcbiAgPC9kbD4iCisgICAgICAuICRfOworfQorCitzdWIgc3RyaXBfaHRtbF9tYXJrdXAoJCl7CisgICAgbXkgJHN0ciA9IEBfWzBdOworICAgIG15ICRzID0gIiRzdHIiOworICAgICRzID1+IHMvPFthLXpBLVowLTldKyhccytbYS16QS1aMC05XSsoXHMqPVxzKihcJ1teXCddKlwnfFwiW15cIl0qXCJ8W2EtekEtWjAtOV0rKSk/KSpccyo+Ly9nOworICAgICRzID1+IHMvPFwvW2EtekEtWjAtOV0rPi8vZzsKKyAgICByZXR1cm4gJHM7Cit9CisKK3N1YiBoYW5kbGVfcmZjbGlrZV9yZWZlcmVuY2V7CisgICAgbG9jYWwoJF8sICR3aGF0LCAkZm9ybWF0KSA9IEBfOworICAgIG15ICRyZmNudW0gPSBuZXh0X2FyZ3VtZW50KCk7CisgICAgbXkgJHRpdGxlID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICR0ZXh0ID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICR1cmwgPSBnZXRfcmZjX3VybCgkcmZjbnVtLCAkZm9ybWF0KTsKKyAgICBteSAkaWNvbiA9IGdldF9saW5rX2ljb24oJHVybCk7CisgICAgbXkgJGF0dHJ0aXRsZSA9IHN0cmlwX2h0bWxfbWFya3VwKCR0aXRsZSk7CisgICAgcmV0dXJuICc8ZGwgY29tcGFjdCBjbGFzcz0ic2VlcmZjIj4nCisgICAgICAuICJcbiAgICA8ZHQ+PGEgaHJlZj1cIiR1cmxcIiIKKyAgICAgIC4gIlxuICAgICAgICB0aXRsZT1cIiRhdHRydGl0bGVcIiIKKyAgICAgIC4gIlxuICAgICAgICA+JHdoYXQgJHJmY251bSwgPGVtPiR0aXRsZTwvZW0+JGljb248L2E+IgorICAgICAgLiAiXG4gICAgPGRkPiR0ZXh0XG4gIDwvZGw+IgorICAgICAgLiAkXzsKK30KKworc3ViIGRvX2NtZF9zZWVwZXB7CisgICAgcmV0dXJuIGhhbmRsZV9yZmNsaWtlX3JlZmVyZW5jZShAX1swXSwgIlBFUCIsICRQRVBfRk9STUFUKTsKK30KKworc3ViIGRvX2NtZF9zZWVyZmN7CisgICAgcmV0dXJuIGhhbmRsZV9yZmNsaWtlX3JlZmVyZW5jZShAX1swXSwgIlJGQyIsICRSRkNfRk9STUFUKTsKK30KKworc3ViIGRvX2NtZF9zZWV0aXRsZXsKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBteSAkdXJsID0gbmV4dF9vcHRpb25hbF9hcmd1bWVudCgpOworICAgIG15ICR0aXRsZSA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBteSAkdGV4dCA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBpZiAoJHVybCkgeworICAgICAgICBteSAkaWNvbiA9IGdldF9saW5rX2ljb24oJHVybCk7CisgICAgICAgIHJldHVybiAnPGRsIGNvbXBhY3QgY2xhc3M9InNlZXRpdGxlIj4nCisgICAgICAgICAgLiAiXG4gICAgPGR0PjxlbSBjbGFzcz1cImNpdGV0aXRsZVwiPjxhIGhyZWY9XCIkdXJsXCIiCisgICAgICAgICAgLiAiXG4gICAgICAgID4kdGl0bGUkaWNvbjwvYT48L2VtPiIKKyAgICAgICAgICAuICJcbiAgICA8ZGQ+JHRleHRcbiAgPC9kbD4iCisgICAgICAgICAgLiAkXzsKKyAgICB9CisgICAgcmV0dXJuICc8ZGwgY29tcGFjdCBjbGFzcz0ic2VldGl0bGUiPicKKyAgICAgIC4gIlxuICAgIDxkdD48ZW0gY2xhc3M9XCJjaXRldGl0bGVcIiIKKyAgICAgIC4gIlxuICAgICAgICA+JHRpdGxlPC9lbT4iCisgICAgICAuICJcbiAgICA8ZGQ+JHRleHRcbiAgPC9kbD4iCisgICAgICAuICRfOworfQorCitzdWIgZG9fY21kX3NlZXVybHsKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBteSAkdXJsID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICR0ZXh0ID0gbmV4dF9hcmd1bWVudCgpOworICAgIG15ICRpY29uID0gZ2V0X2xpbmtfaWNvbigkdXJsKTsKKyAgICByZXR1cm4gJzxkbCBjb21wYWN0IGNsYXNzPSJzZWV1cmwiPicKKyAgICAgIC4gIlxuICAgIDxkdD48YSBocmVmPVwiJHVybFwiIgorICAgICAgLiAiXG4gICAgICAgIGNsYXNzPVwidXJsXCI+JHVybCRpY29uPC9hPiIKKyAgICAgIC4gIlxuICAgIDxkZD4kdGV4dFxuICA8L2RsPiIKKyAgICAgIC4gJF87Cit9CisKK3N1YiBkb19jbWRfc2VldGV4dHsKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBteSAkY29udGVudCA9IG5leHRfYXJndW1lbnQoKTsKKyAgICByZXR1cm4gJzxkaXYgY2xhc3M9InNlZXRleHQiPjxwPicgLiAkY29udGVudCAuICc8L2Rpdj4nIC4gJF87Cit9CisKKworIworIyAgRGVmaW5pdGlvbiBsaXN0IHN1cHBvcnQuCisjCisKK3N1YiBkb19lbnZfZGVmaW5pdGlvbnN7CisgICAgcmV0dXJuICI8ZGwgY2xhc3M9J2RlZmluaXRpb25zJz4iIC4gQF9bMF0gLiAiPC9kbD5cbiI7Cit9CisKK3N1YiBkb19jbWRfdGVybXsKKyAgICBsb2NhbCgkXykgPSBAXzsKKyAgICBteSAkdGVybSA9IG5leHRfYXJndW1lbnQoKTsKKyAgICBteSgkbmFtZSwkYW5hbWUsJGFocmVmKSA9IG5ld19saW5rX2luZm8oKTsKKyAgICAjIGNvdWxkIGVhc2lseSBhZGQgYW4gaW5kZXggZW50cnkgaGVyZS4uLgorICAgIHJldHVybiAiPGR0PjxiPiRhbmFtZSIgLiAkdGVybSAuICI8L2E+PC9iPlxuPGRkPiIgLiAkXzsKK30KKworCisjIEkgZG9uJ3QgcmVjYWxsIGV4YWN0bHkgd2h5IHRoaXMgd2FzIG5lZWRlZCwgYnV0IGl0IHdhcyB2ZXJ5IG11Y2ggbmVlZGVkLgorIyBXZSdsbCBzZWUgaWYgYW55dGhpbmcgYnJlYWtzIHdoZW4gSSBtb3ZlIHRoZSAiY29kZSIgbGluZSBvdXQgLS0gc29tZQorIyB0aGluZ3MgYnJva2Ugd2l0aCBpdCBpbi4KKworI2NvZGUgIyB7fQorcHJvY2Vzc19jb21tYW5kc193cmFwX2RlZmVycmVkKDw8X1JBV19BUkdfREVGRVJSRURfQ01EU18pOworZGVjbGFyZW1vZHVsZSAjIFtdICMge30gIyB7fQorbWVtYmVybGluZSAjIFtdICMge30KK21ldGhvZGxpbmUgIyBbXSAjIHt9ICMge30KK21vZHVsZXN5bm9wc2lzICMge30KK3BsYXRmb3JtICMge30KK3NhbXAgIyB7fQorc2V0aW5kZXhzdWJpdGVtICMge30KK3dpdGhzdWJpdGVtICMge30gIyB7fQorX1JBV19BUkdfREVGRVJSRURfQ01EU18KKworCiskYWxsdHRfc3RhcnQgPSAnPGRsPjxkZD48cHJlIGNsYXNzPSJ2ZXJiYXRpbSI+JzsKKyRhbGx0dF9lbmQgPSAnPC9wcmU+PC9kbD4nOworCitzdWIgZG9fZW52X2FsbHR0IHsKKyAgICBsb2NhbCAoJF8pID0gQF87CisgICAgbG9jYWwoJGNsb3N1cmVzLCRyZW9wZW5zLEBvcGVuX2Jsb2NrX3RhZ3MpOworCisgICAgIyBnZXQgdGhlIHRhZy1zdHJpbmdzIGZvciBhbGwgb3BlbiB0YWdzCisgICAgbG9jYWwoQGtlZXBfb3Blbl90YWdzKSA9IEAkb3Blbl90YWdzX1I7CisgICAgKCRjbG9zdXJlcywkcmVvcGVucykgPSAmcHJlc2VydmVfb3Blbl90YWdzKCkgaWYgKEAkb3Blbl90YWdzX1IpOworCisgICAgIyBnZXQgdGhlIHRhZ3MgZm9yIHRleHQtbGV2ZWwgdGFncyBvbmx5CisgICAgJG9wZW5fdGFnc19SID0gWyBAa2VlcF9vcGVuX3RhZ3MgXTsKKyAgICBsb2NhbCgkbG9jYWxfY2xvc3VyZXMsICRsb2NhbF9yZW9wZW5zKTsKKyAgICAoJGxvY2FsX2Nsb3N1cmVzLCAkbG9jYWxfcmVvcGVucyxAb3Blbl9ibG9ja190YWdzKQorICAgICAgPSAmcHJlc2VydmVfb3Blbl9ibG9ja190YWdzCisJaWYgKEAkb3Blbl90YWdzX1IpOworCisgICAgJG9wZW5fdGFnc19SID0gWyBAb3Blbl9ibG9ja190YWdzIF07CisKKyAgICBkbyB7CisJbG9jYWwoJG9wZW5fdGFnc19SKSA9IFsgQG9wZW5fYmxvY2tfdGFncyBdOworCWxvY2FsKEBzYXZlX29wZW5fdGFncykgPSAoKTsKKworCWxvY2FsKCRjbnQpID0gKyskZ2xvYmFseydtYXhfaWQnfTsKKwkkXyA9IGpvaW4oJycsIiRPJGNudCRDXFx0dCRPIiwgKyskZ2xvYmFseydtYXhfaWQnfSwgJEMKKwkJLCAkXyAsICRPLCAkZ2xvYmFseydtYXhfaWQnfSwgIiRDJE8kY250JEMiKTsKKworCSRfID0gJnRyYW5zbGF0ZV9lbnZpcm9ubWVudHMoJF8pOworCSRfID0gJnRyYW5zbGF0ZV9jb21tYW5kcygkXykgaWYgKC9cXC8pOworCisJIyBwcmVzZXJ2ZSBzcGFjZS1ydW5zLCB1c2luZyAmbmJzcDsKKwl3aGlsZSAocy8oXFMpICggKykvJDEkMjtTUE1uYnNwOy9nKXt9OworCXMvKDxCUj4pIC8kMTtTUE1uYnNwOy9nOworCisJJF8gPSBqb2luKCcnLCAkY2xvc3VyZXMsICRhbGx0dF9zdGFydCwgJGxvY2FsX3Jlb3BlbnMKKwkJLCAkXworCQksICZiYWxhbmNlX3RhZ3MoKSAjLCAkbG9jYWxfY2xvc3VyZXMKKwkJLCAkYWxsdHRfZW5kLCAkcmVvcGVucyk7CisJdW5kZWYgJG9wZW5fdGFnc19SOyB1bmRlZiBAc2F2ZV9vcGVuX3RhZ3M7CisgICAgfTsKKyAgICAkb3Blbl90YWdzX1IgPSBbIEBrZWVwX29wZW5fdGFncyBdOworICAgICRfOworfQorCisKKzE7CQkJCSMgVGhpcyBtdXN0IGJlIHRoZSBsYXN0IGxpbmUKZGlmZiAtLWdpdCBhL2RvYy90b29scy9wdXNoLWRvY3Muc2ggYi9kb2MvdG9vbHMvcHVzaC1kb2NzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMyMjdiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvcHVzaC1kb2NzLnNoCkBAIC0wLDAgKzEsNDIgQEAKKyMhIC9iaW4vc2gKKworIyAgU2NyaXB0IHRvIHB1c2ggZG9jcyBmcm9tIG15IGRldmVsb3BtZW50IGFyZWEgdG8gU291cmNlRm9yZ2UsIHdoZXJlIHRoZQorIyAgdXBkYXRlLWRvY3Muc2ggc2NyaXB0IHVucGFja3MgdGhlbSBpbnRvIHRoZWlyIGZpbmFsIGRlc3RpbmF0aW9uLgorCitUQVJHRVQ9cHl0aG9uLnNvdXJjZWZvcmdlLm5ldDovaG9tZS91c2Vycy9mZHJha2UvdG1wCisKK0FERFJFU1NFUz0ncHl0aG9uLWRldkBweXRob24ub3JnIGRvYy1zaWdAcHl0aG9uLm9yZyBweXRob24tbGlzdEBweXRob24ub3JnJworCitFWFBMQU5BVElPTj0nJworCitpZiBbICIkMSIgPSAnLW0nIF0gOyB0aGVuCisgICAgRVhQTEFOQVRJT049IiQyIgorICAgIHNoaWZ0IDIKK2VsaWYgWyAiJDEiIF0gOyB0aGVuCisgICAgRVhQTEFOQVRJT049ImBjYXQgJDFgIgorICAgIHNoaWZ0IDEKK2ZpCisKK1NUQVJUPSJgcHdkYCIKK01ZRElSPSJgZGlybmFtZSAkMGAiCitjZCAiJE1ZRElSIgorTVlESVI9ImBwd2RgIgorCitjZCAuLgorCisjIG5vdyBpbiAuLi4vRG9jLworbWFrZSAtLW5vLXByaW50LWRpcmVjdG9yeSB8fCBleGl0ICQ/CittYWtlIC0tbm8tcHJpbnQtZGlyZWN0b3J5IGJ6aXBodG1sIHx8IGV4aXQgJD8KK1JFTEVBU0U9YGdyZXAgJ15SRUxFQVNFPScgTWFrZWZpbGUgfCBzZWQgJ3N8UkVMRUFTRT18fCdgCitQQUNLQUdFPSJodG1sLSRSRUxFQVNFLnRhci5iejIiCitzY3AgIiRQQUNLQUdFIiB0b29scy91cGRhdGUtZG9jcy5zaCAkVEFSR0VULyB8fCBleGl0ICQ/Citzc2ggcHl0aG9uLnNvdXJjZWZvcmdlLm5ldCB0bXAvdXBkYXRlLWRvY3Muc2ggJFBBQ0tBR0UgJyYmJyBybSB0bXAvdXBkYXRlLWRvY3Muc2ggfHwgZXhpdCAkPworCitNYWlsIC1zICdbZGV2ZWxvcG1lbnQgZG9jIHVwZGF0ZXNdJyAkQUREUkVTU0VTIDw8RU9GCitUaGUgZGV2ZWxvcG1lbnQgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiB1cGRhdGVkOgorCisJaHR0cDovL3B5dGhvbi5zb3VyY2Vmb3JnZS5uZXQvZGV2ZWwtZG9jcy8KKworJEVYUExBTkFUSU9OCitFT0YKK2V4aXQgJD8KZGlmZiAtLWdpdCBhL2RvYy90b29scy9yZWZjb3VudHMucHkgYi9kb2MvdG9vbHMvcmVmY291bnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYzkwMDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvcmVmY291bnRzLnB5CkBAIC0wLDAgKzEsOTcgQEAKKyIiIlN1cHBvcnQgZnVuY3Rpb25zIGZvciBsb2FkaW5nIHRoZSByZWZlcmVuY2UgY291bnQgZGF0YSBmaWxlLiIiIgorX192ZXJzaW9uX18gPSAnJFJldmlzaW9uOiAxLjEuMS4xICQnCisKK2ltcG9ydCBvcworaW1wb3J0IHN0cmluZworaW1wb3J0IHN5cworCisKKyMgRGV0ZXJtaW5lIHRoZSBleHBlY3RlZCBsb2NhdGlvbiBvZiB0aGUgcmVmZXJlbmNlIGNvdW50IGZpbGU6Cit0cnk6CisgICAgcCA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgcCA9IHN5cy5wYXRoWzBdCitwID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksIHAsIG9zLnBhcmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXBpIiwgInJlZmNvdW50cy5kYXQiKSkKK0RFRkFVTFRfUEFUSCA9IHAKK2RlbCBwCisKKworZGVmIGxvYWQocGF0aD1ERUZBVUxUX1BBVEgpOgorICAgIHJldHVybiBsb2FkZmlsZShvcGVuKHBhdGgpKQorCisKK2RlZiBsb2FkZmlsZShmcCk6CisgICAgZCA9IHt9CisgICAgd2hpbGUgMToKKyAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICBicmVhaworICAgICAgICBsaW5lID0gc3RyaW5nLnN0cmlwKGxpbmUpCisgICAgICAgIGlmIGxpbmVbOjFdIGluICgiIiwgIiMiKToKKyAgICAgICAgICAgICMgYmxhbmsgbGluZXMgYW5kIGNvbW1lbnRzCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBwYXJ0cyA9IHN0cmluZy5zcGxpdChsaW5lLCAiOiIsIDQpCisgICAgICAgIGZ1bmN0aW9uLCB0eXBlLCBhcmcsIHJlZmNvdW50LCBjb21tZW50ID0gcGFydHMKKyAgICAgICAgaWYgcmVmY291bnQgPT0gIm51bGwiOgorICAgICAgICAgICAgcmVmY291bnQgPSBOb25lCisgICAgICAgIGVsaWYgcmVmY291bnQ6CisgICAgICAgICAgICByZWZjb3VudCA9IGludChyZWZjb3VudCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlZmNvdW50ID0gTm9uZQorICAgICAgICAjCisgICAgICAgICMgR2V0IHRoZSBlbnRyeSwgY3JlYXRpbmcgaXQgaWYgbmVlZGVkOgorICAgICAgICAjCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVudHJ5ID0gZFtmdW5jdGlvbl0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgZW50cnkgPSBkW2Z1bmN0aW9uXSA9IEVudHJ5KGZ1bmN0aW9uKQorICAgICAgICAjCisgICAgICAgICMgVXBkYXRlIHRoZSBlbnRyeSB3aXRoIHRoZSBuZXcgcGFyYW1ldGVyIG9yIHRoZSByZXN1bHQgaW5mb3JtYXRpb24uCisgICAgICAgICMKKyAgICAgICAgaWYgYXJnOgorICAgICAgICAgICAgZW50cnkuYXJncy5hcHBlbmQoKGFyZywgdHlwZSwgcmVmY291bnQpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW50cnkucmVzdWx0X3R5cGUgPSB0eXBlCisgICAgICAgICAgICBlbnRyeS5yZXN1bHRfcmVmcyA9IHJlZmNvdW50CisgICAgcmV0dXJuIGQKKworCitjbGFzcyBFbnRyeToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5hcmdzID0gW10KKyAgICAgICAgc2VsZi5yZXN1bHRfdHlwZSA9ICcnCisgICAgICAgIHNlbGYucmVzdWx0X3JlZnMgPSBOb25lCisKKworZGVmIGR1bXAoZCk6CisgICAgIiIiRHVtcCB0aGUgZGF0YSBpbiB0aGUgJ2Nhbm9uaWNhbCcgZm9ybWF0LCB3aXRoIGZ1bmN0aW9ucyBpbgorICAgIHNvcnRlZCBvcmRlci4iIiIKKyAgICBpdGVtcyA9IGQuaXRlbXMoKQorICAgIGl0ZW1zLnNvcnQoKQorICAgIGZpcnN0ID0gMQorICAgIGZvciBrLCBlbnRyeSBpbiBpdGVtczoKKyAgICAgICAgaWYgZmlyc3Q6CisgICAgICAgICAgICBmaXJzdCA9IDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50CisgICAgICAgIHMgPSBlbnRyeS5uYW1lICsgIjolczolczolczoiCisgICAgICAgIGlmIGVudHJ5LnJlc3VsdF9yZWZzIGlzIE5vbmU6CisgICAgICAgICAgICByID0gIiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHIgPSBlbnRyeS5yZXN1bHRfcmVmcworICAgICAgICBwcmludCBzICUgKGVudHJ5LnJlc3VsdF90eXBlLCAiIiwgcikKKyAgICAgICAgZm9yIHQsIG4sIHIgaW4gZW50cnkuYXJnczoKKyAgICAgICAgICAgIGlmIHIgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByID0gIiIKKyAgICAgICAgICAgIHByaW50IHMgJSAodCwgbiwgcikKKworCitkZWYgbWFpbigpOgorICAgIGQgPSBsb2FkKCkKKyAgICBkdW1wKGQpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2RvYy90b29scy9zZ21sY29udi9NYWtlZmlsZSBiL2RvYy90b29scy9zZ21sY29udi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGE4NDZlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL3NnbWxjb252L01ha2VmaWxlCkBAIC0wLDAgKzEsNjcgQEAKKyMgU2ltcGxlIG1ha2VmaWxlIHRvIGNvbnRyb2wgWE1MIGdlbmVyYXRpb24gZm9yIHRoZSBlbnRpcmUgZG9jdW1lbnQgdHJlZS4KKyMgVGhpcyBzaG91bGQgYmUgdXNlZCBmcm9tIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IChEb2MvKSwgbm90IHRoZSBkaXJlY3RvcnkKKyMgdGhhdCBhY3R1YWxseSBjb250YWlucyB0aGlzIGZpbGU6CisjCisjICAkIHB3ZAorIyAgLi4uL0RvYworIyAgJCBtYWtlIC1mIHRvb2xzL3NnbWxjb252L01ha2VmaWxlCisKK1RPUERJUj0uCitUT09MU0RJUj10b29scworCitTR01MUlVMRVM9Li4vJChUT09MU0RJUikvc2dtbGNvbnYvbWFrZS5ydWxlcworIyBUaGUgJ2luc3QnIGRpcmVjdG9yeSBicmVha3MgdGhlIGNvbnZlcnNpb24sIHNvIHNraXAgaXQgZm9yIG5vdy4KK1NVQkRJUlM9YXBpIGRpc3QgZXh0IGxpYiBtYWMgcmVmIHR1dAorU1VCTUFLRT0kKE1BS0UpIC1mICQoU0dNTFJVTEVTKSBUT09MU0RJUj0uLi8kKFRPT0xTRElSKQorCithbGw6CXhtbAorCisuUEhPTlk6IGVzaXMgeG1sCisuUEhPTlk6ICQoU1VCRElSUykKKworeG1sOgorCWZvciBESVIgaW4gJChTVUJESVJTKSA7IGRvIFwKKwkgICAgKGNkICQkRElSOyAkKFNVQk1BS0UpIHhtbCkgfHwgZXhpdCAkJD8gOyBkb25lCisKK2VzaXM6CisJZm9yIERJUiBpbiAkKFNVQkRJUlMpIDsgZG8gXAorCSAgICAoY2QgJCRESVI7ICQoU1VCTUFLRSkgZXNpcykgfHwgZXhpdCAkJD8gOyBkb25lCisKK2VzaXMxOgorCWZvciBESVIgaW4gJChTVUJESVJTKSA7IGRvIFwKKwkgICAgKGNkICQkRElSOyAkKFNVQk1BS0UpIGVzaXMxKSB8fCBleGl0ICQkPyA7IGRvbmUKKwordGFyYmFsbDogIHhtbAorCXRhciBjZiAtIHRvb2xzL3NnbWxjb252ICovKi54bWwgfCBnemlwIC05ID54bWwtMS41LjJiMi50Z3oKKworYXBpOgorCWNkIGFwaTsgJChTVUJNQUtFKQorCitkaXN0OgorCWNkIGRpc3Q7ICQoU1VCTUFLRSkKKworZXh0OgorCWNkIGV4dDsgJChTVUJNQUtFKQorCitpbnN0OgorCWNkIGluc3Q7ICQoU1VCTUFLRSkKKworbGliOgorCWNkIGxpYjsgJChTVUJNQUtFKQorCittYWM6CisJY2QgbWFjOyAkKFNVQk1BS0UpCisKK3JlZjoKKwljZCByZWY7ICQoU1VCTUFLRSkKKwordHV0OgorCWNkIHR1dDsgJChTVUJNQUtFKQorCitjbGVhbjoKKwlmb3IgRElSIGluICQoU1VCRElSUykgOyBkbyBcCisJICAgIChjZCAkJERJUjsgJChTVUJNQUtFKSBjbGVhbikgOyBkb25lCisKK2Nsb2JiZXI6CisJZm9yIERJUiBpbiAkKFNVQkRJUlMpIDsgZG8gXAorCSAgICAoY2QgJCRESVI7ICQoU1VCTUFLRSkgY2xvYmJlcikgOyBkb25lCmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvc2dtbGNvbnYvUkVBRE1FIGIvZG9jL3Rvb2xzL3NnbWxjb252L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTQ2MjkzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL3NnbWxjb252L1JFQURNRQpAQCAtMCwwICsxLDU4IEBACitUaGVzZSBzY3JpcHRzIGFuZCBNYWtlZmlsZSBmcmFnbWVudCBhcmUgdXNlZCB0byBjb252ZXJ0IHRoZSBQeXRob24KK2RvY3VtZW50YXRpb24gaW4gTGFUZVggZm9ybWF0IHRvIFhNTC4KKworVGhpcyBtYXRlcmlhbCBpcyBwcmVsaW1pbmFyeSBhbmQgaW5jb21wbGV0ZS4gIFB5dGhvbiAyLjAgaXMgcmVxdWlyZWQuCisKK1RvIGNvbnZlcnQgYWxsIGRvY3VtZW50cyB0byBYTUw6CisKKwljZCBEb2MvCisJbWFrZSAtZiB0b29scy9zZ21sY29udi9NYWtlZmlsZQorCitUbyBjb252ZXJ0IG9uZSBkb2N1bWVudCB0byBYTUw6CisKKwljZCBEb2MvPGRvY3VtZW50LWRpcj4KKwltYWtlIC1mIC4uL3Rvb2xzL3NnbWxjb252L21ha2UucnVsZXMgVE9PTFNESVI9Li4vdG9vbHMKKworUGxlYXNlIHNlbmQgY29tbWVudHMgYW5kIGJ1ZyByZXBvcnRzIHRvIHB5dGhvbi1kb2NzQHB5dGhvbi5vcmcuCisKKworV2hhdCBkbyB0aGUgdG9vbHMgZG8/CistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbGF0ZXgyZXNpcy5weQorICAgIFJlYWRzIGluIGEgY29udmVyc2lvbiBzcGVjaWZpY2F0aW9uIHdyaXR0ZW4gaW4gWE1MCisgICAgKGNvbnZlcnNpb24ueG1sKSwgcmVhZHMgYSBMYVRlWCBkb2N1bWVudCBmcmFnbWVudCwgYW5kIGludGVycHJldHMKKyAgICB0aGUgbWFya3VwIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZSBvdXRwdXQgaXMgYSBzdHJlYW0KKyAgICBvZiBFU0lTIGV2ZW50cyBsaWtlIHRob3NlIGNyZWF0ZWQgYnkgdGhlIG5zZ21scyBTR01MIHBhcnNlciwgYnV0CisgICAgaXMgKm5vdCogZ3VhcmFudGVlZCB0byByZXByZXNlbnQgYSBzaW5nbGUgdHJlZSEgIFRoaXMgaXMgZG9uZSB0bworICAgIGFsbG93IGNvbnZlcnNpb24gcGVyIGVudGl0eSByYXRoZXIgdGhhbiBwZXIgZG9jdW1lbnQuICBTaW5jZSBtYW55CisgICAgb2YgdGhlIExhVGVYIGZpbGVzIGZvciB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24gY29udGFpbiB0d28KKyAgICBzZWN0aW9ucyBvbiBjbG9zZWx5IHJlbGF0ZWQgbW9kdWxlcywgaXQgaXMgaW1wb3J0YW50IHRvIGFsbG93IGJvdGgKKyAgICBvZiB0aGUgcmVzdWx0aW5nIDxzZWN0aW9uPiBlbGVtZW50cyB0byBleGlzdCBpbiB0aGUgc2FtZSBvdXRwdXQKKyAgICBzdHJlYW0uICBBZGRpdGlvbmFsbHksIHNpbmNlIGNvbW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIEVTSVMsCisgICAgY29tbWVudHMgYXJlIGNvbnZlcnRlZCB0byA8Q09NTUVOVD4gZWxlbWVudHMsIHdoaWNoIG1pZ2h0IGV4aXN0IGF0CisgICAgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIHRvcC1sZXZlbCBjb250ZW50IGVsZW1lbnRzLgorCisgICAgVGhlIG91dHB1dCBvZiBsYXRleDJlc2lzLnB5IGdldHMgc2F2ZWQgYXMgPGZpbGVuYW1lPi5lc2lzMS4KKworZG9jZml4ZXIucHkKKyAgICBUaGlzIGlzIHRoZSByZWFsbHkgcGFpbmZ1bCBwYXJ0IG9mIHRoZSBjb252ZXJzaW9uLiAgV2VsbCwgaXQncyB0aGUgCisgICAgc2Vjb25kIHJlYWxseSBwYWluZnVsIHBhcnQsIGJ1dCBtb3JlIG9mIHRoZSBwYWluIGlzIHNwZWNpZmljIHRvCisgICAgdGhlIHN0cnVjdHVyZSBvZiB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24gYW5kIGRlc2lyZWQgb3V0cHV0CisgICAgcmF0aGVyIHRoYW4gdG8gdGhlIHBhcnNpbmcgb2YgTGFUZVggbWFya3VwLgorCisgICAgVGhpcyBzY3JpcHQgbG9hZHMgdGhlIEVTSVMgZGF0YSBjcmVhdGVkIGJ5IGxhdGV4MmVzaXMucHkgaW50byBhCisgICAgRE9NIGRvY3VtZW50ICpmcmFnbWVudCogKHJlbWVtYmVyLCB0aGUgbGF0ZXgyZXNpcy5weSBvdXRwdXQgbWF5CisgICAgbm90IGJlIHdlbGwtZm9ybWVkKS4gIE9uY2UgbG9hZGVkLCBpdCB3YWxrcyBvdmVyIHRoZSB0cmVlIG1hbnkKKyAgICB0aW1lcyBsb29raW5nIGZvciBhIHZhcmlldHkgb2YgcG9zc2libGUgc3BlY2lmaWMKKyAgICBtaWNyby1jb252ZXJzaW9ucy4gIE1vc3Qgb2YgdGhlIGNvZGUgaXMgbm90IGluIGFueSB3YXkgImdlbmVyYWwiLgorICAgIEFmdGVyIHByb2Nlc3NpbmcgdGhlIGZyYWdtZW50LCBhIG5ldyBFU0lTIGRhdGEgc3RyZWFtIGlzIHdyaXR0ZW4KKyAgICBvdXQuICBMaWtlIHRoZSBpbnB1dCwgaXQgbWF5IG5vdCByZXByZXNlbnQgYSB3ZWxsLWZvcm1lZAorICAgIGRvY3VtZW50LCBidXQgZG9lcyByZXByZXNlbnQgYSBwYXJzZWQgZW50aXR5LgorCisgICAgVGhlIG91dHB1dCBvZiBkb2NmaXhlci5weSBpcyB3aGF0IGdldHMgc2F2ZWQgaW4gPGZpbGVuYW1lPi5lc2lzLgorCitlc2lzMnNnbWwucHkKKyAgICBSZWFkcyBhbiBFU0lTIHN0cmVhbSBhbmQgY29udmVydCB0byBTR01MIG9yIFhNTC4gIFRoaXMgYWxzbworICAgIGNvbnZlcnRzIDxDT01NRU5UPiBlbGVtZW50cyB0byByZWFsIGNvbW1lbnRzLiAgVGhpcyB3b3JrcyBxdWlja2x5CisgICAgYmVjYXVzZSB0aGVyZSdzIG5vdCBtdWNoIHRvIGFjdHVhbGx5IGRvLgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL3NnbWxjb252L2NvbnZlcnNpb24ueG1sIGIvZG9jL3Rvb2xzL3NnbWxjb252L2NvbnZlcnNpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NTliYWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvc2dtbGNvbnYvY29udmVyc2lvbi54bWwKQEAgLTAsMCArMSw3NTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KKzxjb252ZXJzaW9uPgorICA8IS0tIE1pc2NlbGxhbmVvdXMuIC0tPgorICA8bWFjcm8gbmFtZT0iZGVjbGFyZW1vZHVsZSI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgb3B0aW9uYWw9InllcyIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJtb2R1bGVzeW5vcHNpcyI+CisgICAgPGNvbnRlbnQvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJwbGF0Zm9ybSI+CisgICAgPGNvbnRlbnQvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJkZXByZWNhdGVkIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iLz4KKyAgICA8Y29udGVudC8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9ImxhYmVsIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImlkIi8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9Im5vZGVuYW1lIiBvdXRwdXRuYW1lPSJsYWJlbCI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJsb2NhbG1vZHVsZXRhYmxlIi8+CisgIDxtYWNybyBuYW1lPSJtYW5wYWdlIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InNlY3Rpb24iLz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0ibW9kdWxlIj4KKyAgICA8Y29udGVudC8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9Im1vZHVsZWF1dGhvciI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbWFpbCIvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJjaXRldGl0bGUiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iaHJlZiIgb3B0aW9uYWw9InllcyIvPgorICAgIDxjb250ZW50Lz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0icmZjIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im51bSIvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJzZWN0aW9uYXV0aG9yIiBvdXRwdXRuYW1lPSJhdXRob3IiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW1haWwiLz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0iYXV0aG9yIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0iYXV0aG9yYWRkcmVzcyI+CisgICAgPGNvbnRlbnQvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJzaG9ydHZlcnNpb24iLz4KKyAgPG1hY3JvIG5hbWU9InZlcnNpb25hZGRlZCI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIi8+CisgICAgPC9tYWNybz4KKyAgPCEtLSBUaGlzIGlzIGJyb2tlbjogIHdlIG5lZWQgdG8gcmUtb3JkZXIgdGhlIG9wdGlvbmFsIGFuZCByZXF1aXJlZAorICAgICAgIHBhcmFtZXRlcnMsIG1ha2luZyB0aGUgb3B0aW9uYWwgcGFyYW1ldGVyIHRoZSBjb250ZW50IGZvciB0aGUKKyAgICAgICBlbGVtZW50LiAgVGhlIHByb2Nlc3NvciBpcyBub3QgcG93ZXJmdWwgZW5vdWdoIHRvIGhhbmRsZSB0aGlzLgorICAgIC0tPgorICA8bWFjcm8gbmFtZT0idmVyc2lvbmNoYW5nZWQiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iaG93IiBvcHRpb25hbD0ieWVzIi8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIi8+CisgICAgPC9tYWNybz4KKworICA8IS0tIE1vZHVsZSByZWZlcmVuY2luZy4gLS0+CisgIDxtYWNybyBuYW1lPSJyZWZtb2R1bGUiIG91dHB1dG5hbWU9Im1vZHVsZSI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSIiIG9wdGlvbmFsPSJ5ZXMiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImxpbmsiPnllczwvYXR0cmlidXRlPgorICAgIDxjb250ZW50Lz4KKyAgICA8L21hY3JvPgorCisgIDwhLS0gSW5mb3JtYXRpb24gdW5pdHMuIC0tPgorICA8IS0tIEMgdGhpbmdzLiAtLT4KKyAgPGVudmlyb25tZW50IG5hbWU9ImNmdW5jZGVzYyI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIi8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+CisgICAgPGNoaWxkIG5hbWU9ImFyZ3MiLz4KKyAgICA8L2Vudmlyb25tZW50PgorICA8ZW52aXJvbm1lbnQgbmFtZT0iY3R5cGVkZXNjIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9InRhZyIgb3B0aW9uYWw9InllcyIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgorICAgIDwvZW52aXJvbm1lbnQ+CisgIDxlbnZpcm9ubWVudCBuYW1lPSJjdmFyZGVzYyI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIi8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+CisgICAgPC9lbnZpcm9ubWVudD4KKworICA8IS0tIFB5dGhvbiB0aGluZ3MuIC0tPgorICA8bWFjcm8gbmFtZT0ib3B0aW9uYWwiPgorICAgIDxjb250ZW50Lz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0idW5zcGVjaWZpZWQiLz4KKyAgPG1hY3JvIG5hbWU9Im1vcmVhcmdzIi8+CisgIDxlbnZpcm9ubWVudCBuYW1lPSJjbGFzc2Rlc2MiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgorICAgIDxjaGlsZCBuYW1lPSJhcmdzIi8+CisgICAgPC9lbnZpcm9ubWVudD4KKyAgPGVudmlyb25tZW50IG5hbWU9ImRhdGFkZXNjIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KKyAgICA8L2Vudmlyb25tZW50PgorICA8bWFjcm8gbmFtZT0iZGF0YWxpbmUiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgorICAgIDwvbWFjcm8+CisgIDxlbnZpcm9ubWVudCBuYW1lPSJleGNkZXNjIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KKyAgICA8L2Vudmlyb25tZW50PgorCisgIDxlbnZpcm9ubWVudCBuYW1lPSJmdW5jZGVzYyI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+CisgICAgPGNoaWxkIG5hbWU9ImFyZ3MiLz4KKyAgICA8L2Vudmlyb25tZW50PgorICA8bWFjcm8gbmFtZT0iZnVuY2xpbmUiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgorICAgIDxjaGlsZCBuYW1lPSJhcmdzIi8+CisgICAgPC9tYWNybz4KKyAgPGVudmlyb25tZW50IG5hbWU9ImZ1bmNkZXNjbmkiIG91dHB1dG5hbWU9ImZ1bmNkZXNjIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImluZGV4Ij5ubzwvYXR0cmlidXRlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgorICAgIDxjaGlsZCBuYW1lPSJhcmdzIi8+CisgICAgPC9lbnZpcm9ubWVudD4KKyAgPG1hY3JvIG5hbWU9ImZ1bmNsaW5lbmkiIG91dHB1dG5hbWU9ImZ1bmNsaW5lIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImluZGV4Ij5ubzwvYXR0cmlidXRlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgorICAgIDxjaGlsZCBuYW1lPSJhcmdzIi8+CisgICAgPC9tYWNybz4KKworICA8ZW52aXJvbm1lbnQgbmFtZT0ibWVtYmVyZGVzYyI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgb3B0aW9uYWw9InllcyIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgorICAgIDwvZW52aXJvbm1lbnQ+CisgIDxlbnZpcm9ubWVudCBuYW1lPSJtZW1iZXJkZXNjbmkiIG91dHB1dG5hbWU9Im1lbWJlcmRlc2MiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5kZXgiPm5vPC9hdHRyaWJ1dGU+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgb3B0aW9uYWw9InllcyIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgorICAgIDwvZW52aXJvbm1lbnQ+CisKKyAgPGVudmlyb25tZW50IG5hbWU9Im1ldGhvZGRlc2MiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIG9wdGlvbmFsPSJ5ZXMiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KKyAgICA8Y2hpbGQgbmFtZT0iYXJncyIvPgorICAgIDwvZW52aXJvbm1lbnQ+CisgIDxtYWNybyBuYW1lPSJtZXRob2RsaW5lIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiBvcHRpb25hbD0ieWVzIi8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+CisgICAgPGNoaWxkIG5hbWU9ImFyZ3MiLz4KKyAgICA8L21hY3JvPgorICA8ZW52aXJvbm1lbnQgbmFtZT0ibWV0aG9kZGVzY25pIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImluZGV4Ij5ubzwvYXR0cmlidXRlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIG9wdGlvbmFsPSJ5ZXMiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KKyAgICA8Y2hpbGQgbmFtZT0iYXJncyIvPgorICAgIDwvZW52aXJvbm1lbnQ+CisgIDxtYWNybyBuYW1lPSJtZXRob2RsaW5lbmkiIG91dHB1dG5hbWU9Im1ldGhvZGxpbmUiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5kZXgiPm5vPC9hdHRyaWJ1dGU+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgb3B0aW9uYWw9InllcyIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgorICAgIDxjaGlsZCBuYW1lPSJhcmdzIi8+CisgICAgPC9tYWNybz4KKworICA8ZW52aXJvbm1lbnQgbmFtZT0ib3Bjb2RlZGVzYyI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YXIiLz4KKyAgICA8L2Vudmlyb25tZW50PgorCisgIDwhLS0gIlNlZSBhbHNvOiIgc2VjdGlvbnMuIC0tPgorICA8bWFjcm8gbmFtZT0ic2VlbW9kdWxlIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9InJlZiIgb3B0aW9uYWw9InllcyIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgorICAgIDxjaGlsZCBuYW1lPSJkZXNjcmlwdGlvbiIvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJzZWVwZXAiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibnVtYmVyIi8+CisgICAgPGNoaWxkIG5hbWU9InRpdGxlIi8+CisgICAgPGNoaWxkIG5hbWU9ImRlc2NyaXB0aW9uIi8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9InNlZXJmYyI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJudW1iZXIiLz4KKyAgICA8Y2hpbGQgbmFtZT0idGl0bGUiLz4KKyAgICA8Y2hpbGQgbmFtZT0iZGVzY3JpcHRpb24iLz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0ic2VldGV4dCI+CisgICAgPGNoaWxkIG5hbWU9ImRlc2NyaXB0aW9uIi8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9InNlZXRpdGxlIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImhyZWYiIG9wdGlvbmFsPSJ5ZXMiLz4KKyAgICA8Y2hpbGQgbmFtZT0idGl0bGUiLz4KKyAgICA8Y2hpbGQgbmFtZT0iZGVzY3JpcHRpb24iLz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0ic2VldXJsIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImhyZWYiLz4KKyAgICA8Y2hpbGQgbmFtZT0iZGVzY3JpcHRpb24iLz4KKyAgICA8L21hY3JvPgorCisgIDwhLS0gSW5kZXgtZ2VuZXJhdGluZyBtYXJrdXAuIC0tPgorICA8bWFjcm8gbmFtZT0iaW5kZXgiIG91dHB1dG5hbWU9ImluZGV4dGVybSI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0ZXJtMSIvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJpbmRleGlpIiBvdXRwdXRuYW1lPSJpbmRleHRlcm0iPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idGVybTEiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InRlcm0yIi8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9ImluZGV4aWlpIiBvdXRwdXRuYW1lPSJpbmRleHRlcm0iPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idGVybTEiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InRlcm0yIi8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0ZXJtMyIvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJpbmRleGl2IiBvdXRwdXRuYW1lPSJpbmRleHRlcm0iPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idGVybTEiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InRlcm0yIi8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0ZXJtMyIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idGVybTQiLz4KKyAgICA8L21hY3JvPgorCisgIDxtYWNybyBuYW1lPSJ0dGluZGV4IiBvdXRwdXRuYW1lPSJpbmRleHRlcm0iPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3R5bGUiPnR0PC9hdHRyaWJ1dGU+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0ZXJtMSIvPgorICAgIDwvbWFjcm8+CisKKyAgPG1hY3JvIG5hbWU9InJlZm1vZGluZGV4Ij4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im1vZHVsZSIvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJzdG1vZGluZGV4Ij4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im1vZHVsZSIvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJyZWZiaW1vZGluZGV4IiBvdXRwdXRuYW1lPSJyZWZtb2RpbmRleCI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJtb2R1bGUiLz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0icmVmZXhtb2RpbmRleCIgb3V0cHV0bmFtZT0icmVmbW9kaW5kZXgiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibW9kdWxlIi8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9InJlZnN0bW9kaW5kZXgiIG91dHB1dG5hbWU9InJlZm1vZGluZGV4Ij4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im1vZHVsZSIvPgorICAgIDwvbWFjcm8+CisKKyAgPG1hY3JvIG5hbWU9ImJpZnVuY2luZGV4Ij4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0iZXhpbmRleCI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIi8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9Im9iaW5kZXgiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJrd2luZGV4Ij4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0ib3BpbmRleCI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIi8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9InN0aW5kZXgiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJ3aXRoc3ViaXRlbSI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0ZXh0Ii8+CisgICAgPGNvbnRlbnQvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJzZXRpbmRleHN1Yml0ZW0iPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idGV4dCIvPgorICAgIDwvbWFjcm8+CisKKyAgPCEtLSBFbnRpdHkgbWFuYWdlbWVudC4gLS0+CisgIDxtYWNybyBuYW1lPSJpbmNsdWRlIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9InNvdXJjZSIvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJpbnB1dCI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3VyY2UiLz4KKyAgICA8L21hY3JvPgorCisgIDwhLS0gTGFyZ2Utc2NhbGUgZG9jdW1lbnQgc3RydWN0dXJlLiAtLT4KKyAgPG1hY3JvIG5hbWU9ImRvY3VtZW50Y2xhc3MiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NuYW1lIi8+CisgICAgPC9tYWNybz4KKworICA8bWFjcm8gbmFtZT0idXNlcGFja2FnZSI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcHRpb25zIiBvcHRpb25hbD0ieWVzIi8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJwa2ciLz4KKyAgICA8L21hY3JvPgorCisgIDxlbnZpcm9ubWVudCBuYW1lPSJkb2N1bWVudCIKKyAgICAgICAgICAgICAgIGVuZGNsb3Nlcz0iY2hhcHRlciBjaGFwdGVyKiBzZWN0aW9uIHNlY3Rpb24qCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNlY3Rpb24gc3Vic2VjdGlvbioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3Vic2VjdGlvbiBzdWJzdWJzZWN0aW9uKgorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGggcGFyYWdyYXBoKiBzdWJwYXJhZ3JhcGggc3VicGFyYWdyYXBoKiIvPgorCisgIDxtYWNybyBuYW1lPSJjaGFwdGVyIgorICAgICAgICAgY2xvc2VzPSJjaGFwdGVyIGNoYXB0ZXIqIHNlY3Rpb24gc2VjdGlvbiogc3Vic2VjdGlvbiBzdWJzZWN0aW9uKgorICAgICAgICAgICAgICAgICBzdWJzdWJzZWN0aW9uIHN1YnN1YnNlY3Rpb24qCisgICAgICAgICAgICAgICAgIHBhcmFncmFwaCBwYXJhZ3JhcGgqIHN1YnBhcmFncmFwaCBzdWJwYXJhZ3JhcGgqIj4KKyAgICA8dGV4dD4KKzwvdGV4dD4KKyAgICA8Y2hpbGQgbmFtZT0idGl0bGUiLz4KKyAgICA8Y29udGVudCBpbXBsaWVkPSJ5ZXMiLz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0iY2hhcHRlcioiIG91dHB1dG5hbWU9ImNoYXB0ZXIiCisgICAgICAgICBjbG9zZXM9ImNoYXB0ZXIgY2hhcHRlciogc2VjdGlvbiBzZWN0aW9uKiBzdWJzZWN0aW9uIHN1YnNlY3Rpb24qCisgICAgICAgICAgICAgICAgIHN1YnN1YnNlY3Rpb24gc3Vic3Vic2VjdGlvbioKKyAgICAgICAgICAgICAgICAgcGFyYWdyYXBoIHBhcmFncmFwaCogc3VicGFyYWdyYXBoIHN1YnBhcmFncmFwaCoiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibnVtYmVyZWQiPm5vPC9hdHRyaWJ1dGU+CisgICAgPHRleHQ+Cis8L3RleHQ+CisgICAgPGNoaWxkIG5hbWU9InRpdGxlIi8+CisgICAgPGNvbnRlbnQgaW1wbGllZD0ieWVzIi8+CisgICAgPC9tYWNybz4KKworICA8bWFjcm8gbmFtZT0ic2VjdGlvbiIKKyAgICAgICAgIGNsb3Nlcz0ic2VjdGlvbiBzZWN0aW9uKiBzdWJzZWN0aW9uIHN1YnNlY3Rpb24qCisgICAgICAgICAgICAgICAgIHN1YnN1YnNlY3Rpb24gc3Vic3Vic2VjdGlvbioKKyAgICAgICAgICAgICAgICAgcGFyYWdyYXBoIHBhcmFncmFwaCogc3VicGFyYWdyYXBoIHN1YnBhcmFncmFwaCoiPgorICAgIDx0ZXh0PgorPC90ZXh0PgorICAgIDxjaGlsZCBuYW1lPSJ0aXRsZSIvPgorICAgIDxjb250ZW50IGltcGxpZWQ9InllcyIvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJzZWN0aW9uKiIgb3V0cHV0bmFtZT0ic2VjdGlvbiIKKyAgICAgICAgIGNsb3Nlcz0ic2VjdGlvbiBzZWN0aW9uKiBzdWJzZWN0aW9uIHN1YnNlY3Rpb24qCisgICAgICAgICAgICAgICAgIHN1YnN1YnNlY3Rpb24gc3Vic3Vic2VjdGlvbioKKyAgICAgICAgICAgICAgICAgcGFyYWdyYXBoIHBhcmFncmFwaCogc3VicGFyYWdyYXBoIHN1YnBhcmFncmFwaCoiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibnVtYmVyZWQiPm5vPC9hdHRyaWJ1dGU+CisgICAgPHRleHQ+Cis8L3RleHQ+CisgICAgPGNoaWxkIG5hbWU9InRpdGxlIi8+CisgICAgPGNvbnRlbnQgaW1wbGllZD0ieWVzIi8+CisgICAgPC9tYWNybz4KKworICA8bWFjcm8gbmFtZT0ic3Vic2VjdGlvbiIKKyAgICAgICAgIGNsb3Nlcz0ic3Vic2VjdGlvbiBzdWJzZWN0aW9uKiBzdWJzdWJzZWN0aW9uIHN1YnN1YnNlY3Rpb24qCisgICAgICAgICAgICAgICAgIHBhcmFncmFwaCBwYXJhZ3JhcGgqIHN1YnBhcmFncmFwaCBzdWJwYXJhZ3JhcGgqIj4KKyAgICA8dGV4dD4KKzwvdGV4dD4KKyAgICA8Y2hpbGQgbmFtZT0idGl0bGUiLz4KKyAgICA8Y29udGVudCBpbXBsaWVkPSJ5ZXMiLz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0ic3Vic2VjdGlvbioiIG91dHB1dG5hbWU9InN1YnNlY3Rpb24iCisgICAgICAgICBjbG9zZXM9InN1YnNlY3Rpb24gc3Vic2VjdGlvbiogc3Vic3Vic2VjdGlvbiBzdWJzdWJzZWN0aW9uKgorICAgICAgICAgICAgICAgICBwYXJhZ3JhcGggcGFyYWdyYXBoKiBzdWJwYXJhZ3JhcGggc3VicGFyYWdyYXBoKiI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJudW1iZXJlZCI+bm88L2F0dHJpYnV0ZT4KKyAgICA8dGV4dD4KKzwvdGV4dD4KKyAgICA8Y2hpbGQgbmFtZT0idGl0bGUiLz4KKyAgICA8Y29udGVudCBpbXBsaWVkPSJ5ZXMiLz4KKyAgICA8L21hY3JvPgorCisgIDxtYWNybyBuYW1lPSJzdWJzdWJzZWN0aW9uIgorICAgICAgICAgY2xvc2VzPSJzdWJzdWJzZWN0aW9uIHN1YnN1YnNlY3Rpb24qCisgICAgICAgICAgICAgICAgIHBhcmFncmFwaCBwYXJhZ3JhcGgqIHN1YnBhcmFncmFwaCBzdWJwYXJhZ3JhcGgqIj4KKyAgICA8dGV4dD4KKzwvdGV4dD4KKyAgICA8Y2hpbGQgbmFtZT0idGl0bGUiLz4KKyAgICA8Y29udGVudCBpbXBsaWVkPSJ5ZXMiLz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0ic3Vic3Vic2VjdGlvbioiIG91dHB1dG5hbWU9InN1YnN1YnNlY3Rpb24iCisgICAgICAgICBjbG9zZXM9InN1YnN1YnNlY3Rpb24gc3Vic3Vic2VjdGlvbioKKyAgICAgICAgICAgICAgICAgcGFyYWdyYXBoIHBhcmFncmFwaCogc3VicGFyYWdyYXBoIHN1YnBhcmFncmFwaCoiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibnVtYmVyZWQiPm5vPC9hdHRyaWJ1dGU+CisgICAgPHRleHQ+Cis8L3RleHQ+CisgICAgPGNoaWxkIG5hbWU9InRpdGxlIi8+CisgICAgPGNvbnRlbnQgaW1wbGllZD0ieWVzIi8+CisgICAgPC9tYWNybz4KKworICA8bWFjcm8gbmFtZT0icGFyYWdyYXBoIgorICAgICAgICAgY2xvc2VzPSJwYXJhZ3JhcGggcGFyYWdyYXBoKiBzdWJwYXJhZ3JhcGggc3VicGFyYWdyYXBoKiI+CisgICAgPHRleHQ+Cis8L3RleHQ+CisgICAgPGNoaWxkIG5hbWU9InRpdGxlIi8+CisgICAgPGNvbnRlbnQgaW1wbGllZD0ieWVzIi8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9InBhcmFncmFwaCoiIG91dHB1dG5hbWU9InBhcmFncmFwaCIKKyAgICAgICAgIGNsb3Nlcz0icGFyYWdyYXBoIHBhcmFncmFwaCogc3VicGFyYWdyYXBoIHN1YnBhcmFncmFwaCoiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibnVtYmVyZWQiPm5vPC9hdHRyaWJ1dGU+CisgICAgPHRleHQ+Cis8L3RleHQ+CisgICAgPGNoaWxkIG5hbWU9InRpdGxlIi8+CisgICAgPGNvbnRlbnQgaW1wbGllZD0ieWVzIi8+CisgICAgPC9tYWNybz4KKworICA8bWFjcm8gbmFtZT0ic3VicGFyYWdyYXBoIgorICAgICAgICAgY2xvc2VzPSJzdWJwYXJhZ3JhcGggc3VicGFyYWdyYXBoKiI+CisgICAgPHRleHQ+Cis8L3RleHQ+CisgICAgPGNoaWxkIG5hbWU9InRpdGxlIi8+CisgICAgPGNvbnRlbnQgaW1wbGllZD0ieWVzIi8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9InN1YnBhcmFncmFwaCoiIG91dHB1dG5hbWU9InN1YnBhcmFncmFwaCIKKyAgICAgICAgIGNsb3Nlcz0ic3VicGFyYWdyYXBoIHN1YnBhcmFncmFwaCoiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibnVtYmVyZWQiPm5vPC9hdHRyaWJ1dGU+CisgICAgPHRleHQ+Cis8L3RleHQ+CisgICAgPGNoaWxkIG5hbWU9InRpdGxlIi8+CisgICAgPGNvbnRlbnQgaW1wbGllZD0ieWVzIi8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9InRpdGxlIj4KKyAgICA8Y29udGVudC8+CisgICAgPC9tYWNybz4KKworICA8bWFjcm8gbmFtZT0iYXBwZW5kaXgiIG91dHB1dG5hbWU9ImJhY2stbWF0dGVyIgorICAgICAgICAgY2xvc2VzPSJjaGFwdGVyIGNoYXB0ZXIqIHNlY3Rpb24gc3Vic2VjdGlvbiBzdWJzdWJzZWN0aW9uCisgICAgICAgICAgICAgICAgIHBhcmFncmFwaCBzdWJwYXJhZ3JhcGgiLz4KKworICA8ZW52aXJvbm1lbnQgbmFtZT0ibGlzdCIKKyAgICAgICAgICAgICAgIGVuZGNsb3Nlcz0iaXRlbSI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJidWxsZXQiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImluaXQiLz4KKyAgICA8L2Vudmlyb25tZW50PgorICA8bWFjcm8gbmFtZT0iaXRlbSIgY2xvc2VzPSJpdGVtIj4KKyAgICA8Y2hpbGQgbmFtZT0ibGVhZGVyIiBvcHRpb25hbD0ieWVzIi8+CisgICAgPGNvbnRlbnQgaW1wbGllZD0ieWVzIi8+CisgICAgPC9tYWNybz4KKworICA8bWFjcm8gbmFtZT0icmVmIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9InJlZiIvPgorICAgIDwvbWFjcm8+CisKKyAgPGVudmlyb25tZW50IG5hbWU9ImRlc2NyaXB0aW9uIiBvdXRwdXRuYW1lPSJkZXNjcmlwdGlvbmxpc3QiCisgICAgICAgICAgICAgICBlbmRjbG9zZXM9Iml0ZW0iLz4KKworICA8ZW52aXJvbm1lbnQgbmFtZT0iZW51bWVyYXRlIiBvdXRwdXRuYW1lPSJlbnVtZXJhdGlvbiIKKyAgICAgICAgICAgICAgIGVuZGNsb3Nlcz0iaXRlbSIvPgorCisgIDxlbnZpcm9ubWVudCBuYW1lPSJmdWxsbGluZWl0ZW1zIgorICAgICAgICAgICAgICAgZW5kY2xvc2VzPSJpdGVtIi8+CisKKyAgPGVudmlyb25tZW50IG5hbWU9Iml0ZW1pemUiCisgICAgICAgICAgICAgICBlbmRjbG9zZXM9Iml0ZW0iLz4KKworICA8ZW52aXJvbm1lbnQgbmFtZT0iZGVmaW5pdGlvbnMiIG91dHB1dG5hbWU9ImRlZmluaXRpb25saXN0IgorICAgICAgICAgICAgICAgZW5jbG9zZXM9InRlcm0iLz4KKyAgPG1hY3JvIG5hbWU9InRlcm0iIGNsb3Nlcz0iZGVmaW5pdGlvbiI+CisgICAgPCEtLSBub3QgcmVhbGx5IG9wdGlvbmFsLCBidXQgdXNlcyB0aGUgW10gc3ludGF4IC0tPgorICAgIDxjaGlsZCBuYW1lPSJ0ZXJtIiBvcHRpb25hbD0ieWVzIi8+CisgICAgPGNoaWxkIG5hbWU9ImRlZmluaXRpb24iIGltcGxpZWQ9InllcyIvPgorICAgIDwvbWFjcm8+CisKKyAgPGVudmlyb25tZW50IG5hbWU9ImFsbHR0IiBvdXRwdXRuYW1lPSJ2ZXJiYXRpbSIvPgorICA8ZW52aXJvbm1lbnQgbmFtZT0iY29tbWVudCIgdmVyYmF0aW09InllcyIvPgorICA8ZW52aXJvbm1lbnQgbmFtZT0idmVyYmF0aW0iIHZlcmJhdGltPSJ5ZXMiLz4KKyAgPGVudmlyb25tZW50IG5hbWU9InZlcmJhdGltKiIgdmVyYmF0aW09InllcyI+CisgICAgPCEtLSBub3QgdXNlZCBhbnl3aGVyZSwgYnV0IGl0J3MgYSBzdGFuZGFyZCBMYVRlWGlzbSAtLT4KKyAgICA8YXR0cmlidXRlIG5hbWU9InNwYWNlcyI+dmlzaWJsZTwvYXR0cmlidXRlPgorICAgIDwvZW52aXJvbm1lbnQ+CisKKyAgPCEtLSBUYWJsZSBtYXJrdXAuIC0tPgorICA8bWFjcm8gbmFtZT0iaGxpbmUiLz4KKyAgPGVudmlyb25tZW50IG5hbWU9InRhYmxlaWkiIG91dHB1dG5hbWU9InRhYmxlIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbHMiPjI8L2F0dHJpYnV0ZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbHNwZWMiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InN0eWxlIi8+CisgICAgPGNoaWxkIG5hbWU9ImVudHJ5Ii8+CisgICAgPHRleHQ+CisgICAgICAgICA8L3RleHQ+CisgICAgPGNoaWxkIG5hbWU9ImVudHJ5Ii8+CisgICAgPC9lbnZpcm9ubWVudD4KKyAgPGVudmlyb25tZW50IG5hbWU9Imxvbmd0YWJsZWlpIiBvdXRwdXRuYW1lPSJ0YWJsZSI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb2xzIj4yPC9hdHRyaWJ1dGU+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb2xzcGVjIi8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdHlsZSIvPgorICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgorICAgIDx0ZXh0PgorICAgICAgICAgPC90ZXh0PgorICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgorICAgIDwvZW52aXJvbm1lbnQ+CisgIDxtYWNybyBuYW1lPSJsaW5laWkiIG91dHB1dG5hbWU9InJvdyI+CisgICAgPGNoaWxkIG5hbWU9ImVudHJ5Ii8+CisgICAgPHRleHQ+CisgICAgICAgICA8L3RleHQ+CisgICAgPGNoaWxkIG5hbWU9ImVudHJ5Ii8+CisgICAgPC9tYWNybz4KKworICA8ZW52aXJvbm1lbnQgbmFtZT0idGFibGVpaWkiIG91dHB1dG5hbWU9InRhYmxlIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbHMiPjM8L2F0dHJpYnV0ZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImNvbHNwZWMiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InN0eWxlIi8+CisgICAgPGNoaWxkIG5hbWU9ImVudHJ5Ii8+CisgICAgPHRleHQ+CisgICAgICAgICA8L3RleHQ+CisgICAgPGNoaWxkIG5hbWU9ImVudHJ5Ii8+CisgICAgPHRleHQ+CisgICAgICAgICA8L3RleHQ+CisgICAgPGNoaWxkIG5hbWU9ImVudHJ5Ii8+CisgICAgPC9lbnZpcm9ubWVudD4KKyAgPGVudmlyb25tZW50IG5hbWU9Imxvbmd0YWJsZWlpaSIgb3V0cHV0bmFtZT0idGFibGUiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29scyI+MzwvYXR0cmlidXRlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29sc3BlYyIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3R5bGUiLz4KKyAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KKyAgICA8dGV4dD4KKyAgICAgICAgIDwvdGV4dD4KKyAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KKyAgICA8dGV4dD4KKyAgICAgICAgIDwvdGV4dD4KKyAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KKyAgICA8L2Vudmlyb25tZW50PgorICA8bWFjcm8gbmFtZT0ibGluZWlpaSIgb3V0cHV0bmFtZT0icm93Ij4KKyAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KKyAgICA8dGV4dD4KKyAgICAgICAgIDwvdGV4dD4KKyAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KKyAgICA8dGV4dD4KKyAgICAgICAgIDwvdGV4dD4KKyAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KKyAgICA8L21hY3JvPgorCisgIDxlbnZpcm9ubWVudCBuYW1lPSJ0YWJsZWl2IiBvdXRwdXRuYW1lPSJ0YWJsZSI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb2xzIj40PC9hdHRyaWJ1dGU+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb2xzcGVjIi8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdHlsZSIvPgorICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgorICAgIDx0ZXh0PgorICAgICAgICAgPC90ZXh0PgorICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgorICAgIDx0ZXh0PgorICAgICAgICAgPC90ZXh0PgorICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgorICAgIDx0ZXh0PgorICAgICAgICAgPC90ZXh0PgorICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgorICAgIDwvZW52aXJvbm1lbnQ+CisgIDxlbnZpcm9ubWVudCBuYW1lPSJsb25ndGFibGVpdiIgb3V0cHV0bmFtZT0idGFibGUiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29scyI+NDwvYXR0cmlidXRlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29sc3BlYyIvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3R5bGUiLz4KKyAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KKyAgICA8dGV4dD4KKyAgICAgICAgIDwvdGV4dD4KKyAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KKyAgICA8dGV4dD4KKyAgICAgICAgIDwvdGV4dD4KKyAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KKyAgICA8dGV4dD4KKyAgICAgICAgIDwvdGV4dD4KKyAgICA8Y2hpbGQgbmFtZT0iZW50cnkiLz4KKyAgICA8L2Vudmlyb25tZW50PgorICA8bWFjcm8gbmFtZT0ibGluZWl2IiBvdXRwdXRuYW1lPSJyb3ciPgorICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgorICAgIDx0ZXh0PgorICAgICAgICAgPC90ZXh0PgorICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgorICAgIDx0ZXh0PgorICAgICAgICAgPC90ZXh0PgorICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgorICAgIDx0ZXh0PgorICAgICAgICAgPC90ZXh0PgorICAgIDxjaGlsZCBuYW1lPSJlbnRyeSIvPgorICAgIDwvbWFjcm8+CisKKyAgPCEtLSBUaGVzZSBhcmUgaGFuZGxlZCBhdCBhIGxhdGVyIHRyYW5zbGF0aW9uIHN0YWdlLCBhdCBsZWFzdCBmb3Igbm93LiAtLT4KKyAgPG1hY3JvIG5hbWU9IkNwcCIgb3V0cHV0bmFtZT0iIj4KKyAgICA8dGV4dD5DKys8L3RleHQ+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9ImdlcSIgb3V0cHV0bmFtZT0iIj4KKyAgICA8ZW50aXR5cmVmIG5hbWU9ImdlcSIvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJMYVRlWCIgb3V0cHV0bmFtZT0iIj4KKyAgICA8dGV4dD5MYVRlWDwvdGV4dD4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0ibGRvdHMiIG91dHB1dG5hbWU9IiI+CisgICAgPHRleHQ+Li4uPC90ZXh0PgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJsZXEiIG91dHB1dG5hbWU9IiI+CisgICAgPGVudGl0eXJlZiBuYW1lPSJsZXEiLz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0iVGVYIiBvdXRwdXRuYW1lPSIiPgorICAgIDx0ZXh0PlRlWDwvdGV4dD4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0idmVyc2lvbiIvPgorCisgIDwhLS0gRGlzdHV0aWxzIHRoaW5ncy4gLS0+CisgIDxtYWNybyBuYW1lPSJjb21tYW5kIj4KKyAgICA8Y29udGVudC8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9Im9wdGlvbiI+CisgICAgPGNvbnRlbnQvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJmaWxldmFyIiBvdXRwdXRuYW1lPSJ2YXIiPgorICAgIDxjb250ZW50Lz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0iWFhYIiBvdXRwdXRuYW1lPSJlZGl0b3JpYWwtY29tbWVudCI+CisgICAgPGNvbnRlbnQvPgorICAgIDwvbWFjcm8+CisKKyAgPCEtLSBNaXNjLiAtLT4KKyAgPG1hY3JvIG5hbWU9ImVtcGgiPgorICAgIDxjb250ZW50Lz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0ic3Ryb25nIj4KKyAgICA8Y29udGVudC8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9InRleHRybSI+CisgICAgPGNvbnRlbnQvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJ0ZXh0dHQiPgorICAgIDxjb250ZW50Lz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0iY29kZSI+CisgICAgPGNvbnRlbnQvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJleGNlcHRpb24iPgorICAgIDxjb250ZW50Lz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0ia2V5d29yZCI+CisgICAgPGNvbnRlbnQvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJzYW1wIj4KKyAgICA8Y29udGVudC8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9ImNsYXNzIj4KKyAgICA8Y29udGVudC8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9ImNkYXRhIj4KKyAgICA8Y29udGVudC8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9ImNmdW5jdGlvbiI+CisgICAgPGNvbnRlbnQvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJjdHlwZSI+CisgICAgPGNvbnRlbnQvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJweXR5cGUiPgorICAgIDxjb250ZW50Lz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0iY2hhcmFjdGVyIj4KKyAgICA8Y29udGVudC8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9ImNvbnN0YW50Ij4KKyAgICA8Y29udGVudC8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9ImVudnZhciIgb3V0cHV0bmFtZT0iZW52YXIiPgorICAgIDxjb250ZW50Lz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0iZmlsZSIgb3V0cHV0bmFtZT0iZmlsZW5hbWUiPgorICAgIDxjb250ZW50Lz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0iZmlsZW5xIiBvdXRwdXRuYW1lPSJmaWxlbmFtZSI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJxdW90ZSI+bm88L2F0dHJpYnV0ZT4KKyAgICA8Y29udGVudC8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9ImZ1bmN0aW9uIj4KKyAgICA8Y29udGVudC8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9ImtiZCI+CisgICAgPGNvbnRlbnQvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJtYWtldmFyIj4KKyAgICA8Y29udGVudC8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9Im1ldGhvZCI+CisgICAgPGNvbnRlbnQvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJtZW1iZXIiPgorICAgIDxjb250ZW50Lz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0ibWltZXR5cGUiPgorICAgIDxjb250ZW50Lz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0ibmV3c2dyb3VwIj4KKyAgICA8Y29udGVudC8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9InByb2dyYW0iIG91dHB1dG5hbWU9ImNvbW1hbmQiPgorICAgIDxjb250ZW50Lz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0icHJvZ3JhbW9wdCIgb3V0cHV0bmFtZT0ib3B0aW9uIj4KKyAgICA8Y29udGVudC8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9Imxvbmdwcm9ncmFtb3B0IiBvdXRwdXRuYW1lPSJsb25nb3B0aW9uIj4KKyAgICA8Y29udGVudC8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9InJlZ2V4cCI+CisgICAgPGNvbnRlbnQvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJ2YXIiPgorICAgIDxjb250ZW50Lz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0iZW1haWwiPgorICAgIDxjb250ZW50Lz4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0idXJsIj4KKyAgICA8Y29udGVudC8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9ImZvb3Rub3RlIj4KKyAgICA8Y29udGVudC8+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9ImRmbiIgb3V0cHV0bmFtZT0iZGVmaW5lZHRlcm0iPgorICAgIDxjb250ZW50Lz4KKyAgICA8L21hY3JvPgorCisgIDxtYWNybyBuYW1lPSJtYm94Ij4KKyAgICA8Y29udGVudC8+CisgICAgPC9tYWNybz4KKworICA8IS0tIG1pbmltYWwgbWF0aCBzdHVmZiB0byBnZXQgYnkgLS0+CisgIDxtYWNybyBuYW1lPSJwaSIvPgorICA8bWFjcm8gbmFtZT0ic3FydCI+CisgICAgPGNvbnRlbnQvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJmcmFjIiBvdXRwdXRuYW1lPSJmcmFjdGlvbiI+CisgICAgPGNoaWxkIG5hbWU9Im51bWVyYXRvciIvPgorICAgIDxjaGlsZCBuYW1lPSJkZW5vbWluYXRvciIvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJzdW0iPgorICAgIDxjb250ZW50Lz4KKyAgICA8L21hY3JvPgorCisgIDwhLS0gQ29udmVyc2lvbnMgdG8gdGV4dDsgcGVyaGFwcyBjb3VsZCBiZSBkaWZmZXJlbnQ/ICBUaGVyZSdzIC0tPgorICA8IS0tIG5vIHdheSBmb3IgYSBzdHlsZSBzaGVldCB0byB3b3JrIHdpdGggdGhlc2UgdGhpcyB3YXkuCSAtLT4KKyAgPG1hY3JvIG5hbWU9IkFCQyIgb3V0cHV0bmFtZT0iIj4KKyAgICA8dGV4dD5BQkM8L3RleHQ+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9IkFTQ0lJIiBvdXRwdXRuYW1lPSIiPgorICAgIDx0ZXh0PkFTQ0lJPC90ZXh0PgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJDIiBvdXRwdXRuYW1lPSIiPgorICAgIDx0ZXh0PkM8L3RleHQ+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9IkVPRiIgb3V0cHV0bmFtZT0iIj4KKyAgICA8dGV4dD5FT0Y8L3RleHQ+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9ImUiIG91dHB1dG5hbWU9IiI+CisgICAgPHRleHQ+XDwvdGV4dD4KKyAgICA8L21hY3JvPgorICA8bWFjcm8gbmFtZT0iTlVMTCIgb3V0cHV0bmFtZT0iY29uc3RhbnQiPgorICAgIDx0ZXh0Pk5VTEw8L3RleHQ+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9IlBPU0lYIiBvdXRwdXRuYW1lPSIiPgorICAgIDx0ZXh0PlBPU0lYPC90ZXh0PgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJVTklYIiBvdXRwdXRuYW1lPSIiPgorICAgIDx0ZXh0PlVuaXg8L3RleHQ+CisgICAgPC9tYWNybz4KKyAgPG1hY3JvIG5hbWU9InRleHRhc2NpaXRpbGRlIiBvdXRwdXRuYW1lPSIiPgorICAgIDx0ZXh0Pn48L3RleHQ+CisgICAgPC9tYWNybz4KKworICA8IS0tIFRoZXNlIHdpbGwgZW5kIHVwIGRpc2FwcGVhcmluZyBhcyB3ZWxsISAtLT4KKyAgPG1hY3JvIG5hbWU9ImNhdGNvZGUiIG91dHB1dG5hbWU9IiIvPgorICA8bWFjcm8gbmFtZT0iZmkiIG91dHB1dG5hbWU9IiIvPgorICA8bWFjcm8gbmFtZT0iaWZodG1sIiBvdXRwdXRuYW1lPSIiLz4KKyAgPG1hY3JvIG5hbWU9ImluZGV4bmFtZSIgb3V0cHV0bmFtZT0iIi8+CisgIDxtYWNybyBuYW1lPSJsYWJlbHdpZHRoIiBvdXRwdXRuYW1lPSIiLz4KKyAgPG1hY3JvIG5hbWU9ImxhcmdlIiBvdXRwdXRuYW1lPSIiLz4KKyAgPG1hY3JvIG5hbWU9ImxlZnRtYXJnaW4iIG91dHB1dG5hbWU9IiIvPgorICA8bWFjcm8gbmFtZT0ibWFrZWluZGV4IiBvdXRwdXRuYW1lPSIiLz4KKyAgPG1hY3JvIG5hbWU9Im1ha2Vtb2RpbmRleCIgb3V0cHV0bmFtZT0iIi8+CisgIDxtYWNybyBuYW1lPSJtYWtldGl0bGUiIG91dHB1dG5hbWU9IiIvPgorICA8bWFjcm8gbmFtZT0ibm9pbmRlbnQiIG91dHB1dG5hbWU9IiIvPgorICA8bWFjcm8gbmFtZT0icHJvdGVjdCIgb3V0cHV0bmFtZT0iIi8+CisgIDxtYWNybyBuYW1lPSJyZW5ld2NvbW1hbmQiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWFjcm8iLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hcmdzIiBvcHRpb25hbD0ieWVzIi8+CisgICAgPGNvbnRlbnQvPgorICAgIDwvbWFjcm8+CisgIDxtYWNybyBuYW1lPSJ0YWJsZW9mY29udGVudHMiIG91dHB1dG5hbWU9IiIvPgorICA8bWFjcm8gbmFtZT0idnNwYWNlIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9InNpemUiLz4KKyAgICA8L21hY3JvPgorPC9jb252ZXJzaW9uPgpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL3NnbWxjb252L2RvY2ZpeGVyLnB5IGIvZG9jL3Rvb2xzL3NnbWxjb252L2RvY2ZpeGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ2MzI3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvc2dtbGNvbnYvZG9jZml4ZXIucHkKQEAgLTAsMCArMSwxMDMzIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIlBlcmZvcm0gbWFzc2l2ZSB0cmFuc2Zvcm1hdGlvbnMgb24gYSBkb2N1bWVudCB0cmVlIGNyZWF0ZWQgZnJvbSB0aGUgTGFUZVgKK29mIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiwgYW5kIGR1bXAgdGhlIEVTSVMgZGF0YSBmb3IgdGhlIHRyYW5zZm9ybWVkIHRyZWUuCisiIiIKKworCitpbXBvcnQgZXJybm8KK2ltcG9ydCBlc2lzdG9vbHMKK2ltcG9ydCByZQoraW1wb3J0IHN0cmluZworaW1wb3J0IHN5cworaW1wb3J0IHhtbC5kb20KK2ltcG9ydCB4bWwuZG9tLm1pbmlkb20KKworRUxFTUVOVCA9IHhtbC5kb20uTm9kZS5FTEVNRU5UX05PREUKK0VOVElUWV9SRUZFUkVOQ0UgPSB4bWwuZG9tLk5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFCitURVhUID0geG1sLmRvbS5Ob2RlLlRFWFRfTk9ERQorCisKK2NsYXNzIENvbnZlcnNpb25FcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitld3JpdGUgPSBzeXMuc3RkZXJyLndyaXRlCit0cnk6CisgICAgIyBXZSBjYW4gb25seSBkbyB0aGlzIHRyaWNrIG9uIFVuaXggKGlmIHRwdXQgaXMgb24gJFBBVEgpIQorICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAicG9zaXgiIG9yIG5vdCBzeXMuc3RkZXJyLmlzYXR0eSgpOgorICAgICAgICByYWlzZSBJbXBvcnRFcnJvcgorICAgIGltcG9ydCBjb21tYW5kcworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGJ3cml0ZSA9IGV3cml0ZQorZWxzZToKKyAgICBkZWYgYndyaXRlKHMsIEJPTERPTj1jb21tYW5kcy5nZXRvdXRwdXQoInRwdXQgYm9sZCIpLAorICAgICAgICAgICAgICAgQk9MRE9GRj1jb21tYW5kcy5nZXRvdXRwdXQoInRwdXQgc2dyMCIpKToKKyAgICAgICAgZXdyaXRlKCIlcyVzJXMiICUgKEJPTERPTiwgcywgQk9MRE9GRikpCisKKworUEFSQV9FTEVNRU5UID0gInBhcmEiCisKK0RFQlVHX1BBUkFfRklYRVIgPSAwCisKK2lmIERFQlVHX1BBUkFfRklYRVI6CisgICAgZGVmIHBhcmFfbXNnKHMpOgorICAgICAgICBld3JpdGUoIioqKiAlc1xuIiAlIHMpCitlbHNlOgorICAgIGRlZiBwYXJhX21zZyhzKToKKyAgICAgICAgcGFzcworCisKK2RlZiBnZXRfZmlyc3RfZWxlbWVudChkb2MsIGdpKToKKyAgICBmb3IgbiBpbiBkb2MuY2hpbGROb2RlczoKKyAgICAgICAgaWYgbi5ub2RlTmFtZSA9PSBnaToKKyAgICAgICAgICAgIHJldHVybiBuCisKK2RlZiBleHRyYWN0X2ZpcnN0X2VsZW1lbnQoZG9jLCBnaSk6CisgICAgbm9kZSA9IGdldF9maXJzdF9lbGVtZW50KGRvYywgZ2kpCisgICAgaWYgbm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgZG9jLnJlbW92ZUNoaWxkKG5vZGUpCisgICAgcmV0dXJuIG5vZGUKKworCitkZWYgZ2V0X2RvY3VtZW50RWxlbWVudChub2RlKToKKyAgICByZXN1bHQgPSBOb25lCisgICAgZm9yIGNoaWxkIGluIG5vZGUuY2hpbGROb2RlczoKKyAgICAgICAgaWYgY2hpbGQubm9kZVR5cGUgPT0gRUxFTUVOVDoKKyAgICAgICAgICAgIHJlc3VsdCA9IGNoaWxkCisgICAgcmV0dXJuIHJlc3VsdAorCisKK2RlZiBzZXRfdGFnTmFtZShlbGVtLCBnaSk6CisgICAgZWxlbS5ub2RlTmFtZSA9IGVsZW0udGFnTmFtZSA9IGdpCisKKworZGVmIGZpbmRfYWxsX2VsZW1lbnRzKGRvYywgZ2kpOgorICAgIG5vZGVzID0gW10KKyAgICBpZiBkb2Mubm9kZU5hbWUgPT0gZ2k6CisgICAgICAgIG5vZGVzLmFwcGVuZChkb2MpCisgICAgZm9yIGNoaWxkIGluIGRvYy5jaGlsZE5vZGVzOgorICAgICAgICBpZiBjaGlsZC5ub2RlVHlwZSA9PSBFTEVNRU5UOgorICAgICAgICAgICAgaWYgY2hpbGQudGFnTmFtZSA9PSBnaToKKyAgICAgICAgICAgICAgICBub2Rlcy5hcHBlbmQoY2hpbGQpCisgICAgICAgICAgICBmb3Igbm9kZSBpbiBjaGlsZC5nZXRFbGVtZW50c0J5VGFnTmFtZShnaSk6CisgICAgICAgICAgICAgICAgbm9kZXMuYXBwZW5kKG5vZGUpCisgICAgcmV0dXJuIG5vZGVzCisKK2RlZiBmaW5kX2FsbF9jaGlsZF9lbGVtZW50cyhkb2MsIGdpKToKKyAgICBub2RlcyA9IFtdCisgICAgZm9yIGNoaWxkIGluIGRvYy5jaGlsZE5vZGVzOgorICAgICAgICBpZiBjaGlsZC5ub2RlTmFtZSA9PSBnaToKKyAgICAgICAgICAgIG5vZGVzLmFwcGVuZChjaGlsZCkKKyAgICByZXR1cm4gbm9kZXMKKworCitkZWYgZmluZF9hbGxfZWxlbWVudHNfZnJvbV9zZXQoZG9jLCBnaV9zZXQpOgorICAgIHJldHVybiBfX2ZpbmRfYWxsX2VsZW1lbnRzX2Zyb21fc2V0KGRvYywgZ2lfc2V0LCBbXSkKKworZGVmIF9fZmluZF9hbGxfZWxlbWVudHNfZnJvbV9zZXQoZG9jLCBnaV9zZXQsIG5vZGVzKToKKyAgICBpZiBkb2Mubm9kZU5hbWUgaW4gZ2lfc2V0OgorICAgICAgICBub2Rlcy5hcHBlbmQoZG9jKQorICAgIGZvciBjaGlsZCBpbiBkb2MuY2hpbGROb2RlczoKKyAgICAgICAgaWYgY2hpbGQubm9kZVR5cGUgPT0gRUxFTUVOVDoKKyAgICAgICAgICAgIF9fZmluZF9hbGxfZWxlbWVudHNfZnJvbV9zZXQoY2hpbGQsIGdpX3NldCwgbm9kZXMpCisgICAgcmV0dXJuIG5vZGVzCisKKworZGVmIHNpbXBsaWZ5KGRvYywgZnJhZ21lbnQpOgorICAgICMgVHJ5IHRvIHJhdGlvbmFsaXplIHRoZSBkb2N1bWVudCBhIGJpdCwgc2luY2UgdGhlc2UgdGhpbmdzIGFyZSBzaW1wbHkKKyAgICAjIG5vdCB2YWxpZCBTR01ML1hNTCBkb2N1bWVudHMgYXMgdGhleSBzdGFuZCwgYW5kIG5lZWQgYSBsaXR0bGUgd29yay4KKyAgICBkb2N1bWVudGNsYXNzID0gImRvY3VtZW50IgorICAgIGlucHV0cyA9IFtdCisgICAgbm9kZSA9IGV4dHJhY3RfZmlyc3RfZWxlbWVudChmcmFnbWVudCwgImRvY3VtZW50Y2xhc3MiKQorICAgIGlmIG5vZGUgaXMgbm90IE5vbmU6CisgICAgICAgIGRvY3VtZW50Y2xhc3MgPSBub2RlLmdldEF0dHJpYnV0ZSgiY2xhc3NuYW1lIikKKyAgICBub2RlID0gZXh0cmFjdF9maXJzdF9lbGVtZW50KGZyYWdtZW50LCAidGl0bGUiKQorICAgIGlmIG5vZGUgaXMgbm90IE5vbmU6CisgICAgICAgIGlucHV0cy5hcHBlbmQobm9kZSkKKyAgICAjIHVwZGF0ZSB0aGUgbmFtZSBvZiB0aGUgcm9vdCBlbGVtZW50CisgICAgbm9kZSA9IGdldF9maXJzdF9lbGVtZW50KGZyYWdtZW50LCAiZG9jdW1lbnQiKQorICAgIGlmIG5vZGUgaXMgbm90IE5vbmU6CisgICAgICAgIHNldF90YWdOYW1lKG5vZGUsIGRvY3VtZW50Y2xhc3MpCisgICAgd2hpbGUgMToKKyAgICAgICAgbm9kZSA9IGV4dHJhY3RfZmlyc3RfZWxlbWVudChmcmFnbWVudCwgImlucHV0IikKKyAgICAgICAgaWYgbm9kZSBpcyBOb25lOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaW5wdXRzLmFwcGVuZChub2RlKQorICAgIGlmIGlucHV0czoKKyAgICAgICAgZG9jZWxlbSA9IGdldF9kb2N1bWVudEVsZW1lbnQoZnJhZ21lbnQpCisgICAgICAgIGlucHV0cy5yZXZlcnNlKCkKKyAgICAgICAgZm9yIG5vZGUgaW4gaW5wdXRzOgorICAgICAgICAgICAgdGV4dCA9IGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4iKQorICAgICAgICAgICAgZG9jZWxlbS5pbnNlcnRCZWZvcmUodGV4dCwgZG9jZWxlbS5maXJzdENoaWxkKQorICAgICAgICAgICAgZG9jZWxlbS5pbnNlcnRCZWZvcmUobm9kZSwgdGV4dCkKKyAgICAgICAgZG9jZWxlbS5pbnNlcnRCZWZvcmUoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiIpLCBkb2NlbGVtLmZpcnN0Q2hpbGQpCisgICAgd2hpbGUgZnJhZ21lbnQuZmlyc3RDaGlsZCBhbmQgZnJhZ21lbnQuZmlyc3RDaGlsZC5ub2RlVHlwZSA9PSBURVhUOgorICAgICAgICBmcmFnbWVudC5yZW1vdmVDaGlsZChmcmFnbWVudC5maXJzdENoaWxkKQorCisKK2RlZiBjbGVhbnVwX3Jvb3RfdGV4dChkb2MpOgorICAgIGRpc2NhcmRzID0gW10KKyAgICBza2lwID0gMAorICAgIGZvciBuIGluIGRvYy5jaGlsZE5vZGVzOgorICAgICAgICBwcmV2c2tpcCA9IHNraXAKKyAgICAgICAgc2tpcCA9IDAKKyAgICAgICAgaWYgbi5ub2RlVHlwZSA9PSBURVhUIGFuZCBub3QgcHJldnNraXA6CisgICAgICAgICAgICBkaXNjYXJkcy5hcHBlbmQobikKKyAgICAgICAgZWxpZiBuLm5vZGVOYW1lID09ICJDT01NRU5UIjoKKyAgICAgICAgICAgIHNraXAgPSAxCisgICAgZm9yIG5vZGUgaW4gZGlzY2FyZHM6CisgICAgICAgIGRvYy5yZW1vdmVDaGlsZChub2RlKQorCisKK0RFU0NSSVBUT1JfRUxFTUVOVFMgPSAoCisgICAgImNmdW5jZGVzYyIsICJjdmFyZGVzYyIsICJjdHlwZWRlc2MiLAorICAgICJjbGFzc2Rlc2MiLCAibWVtYmVyZGVzYyIsICJtZW1iZXJkZXNjbmkiLCAibWV0aG9kZGVzYyIsICJtZXRob2RkZXNjbmkiLAorICAgICJleGNkZXNjIiwgImZ1bmNkZXNjIiwgImZ1bmNkZXNjbmkiLCAib3Bjb2RlZGVzYyIsCisgICAgImRhdGFkZXNjIiwgImRhdGFkZXNjbmkiLAorICAgICkKKworZGVmIGZpeHVwX2Rlc2NyaXB0b3JzKGRvYywgZnJhZ21lbnQpOgorICAgIHNlY3Rpb25zID0gZmluZF9hbGxfZWxlbWVudHMoZnJhZ21lbnQsICJzZWN0aW9uIikKKyAgICBmb3Igc2VjdGlvbiBpbiBzZWN0aW9uczoKKyAgICAgICAgZmluZF9hbmRfZml4X2Rlc2NyaXB0b3JzKGRvYywgc2VjdGlvbikKKworCitkZWYgZmluZF9hbmRfZml4X2Rlc2NyaXB0b3JzKGRvYywgY29udGFpbmVyKToKKyAgICBjaGlsZHJlbiA9IGNvbnRhaW5lci5jaGlsZE5vZGVzCisgICAgZm9yIGNoaWxkIGluIGNoaWxkcmVuOgorICAgICAgICBpZiBjaGlsZC5ub2RlVHlwZSA9PSBFTEVNRU5UOgorICAgICAgICAgICAgdGFnTmFtZSA9IGNoaWxkLnRhZ05hbWUKKyAgICAgICAgICAgIGlmIHRhZ05hbWUgaW4gREVTQ1JJUFRPUl9FTEVNRU5UUzoKKyAgICAgICAgICAgICAgICByZXdyaXRlX2Rlc2NyaXB0b3IoZG9jLCBjaGlsZCkKKyAgICAgICAgICAgIGVsaWYgdGFnTmFtZSA9PSAic3Vic2VjdGlvbiI6CisgICAgICAgICAgICAgICAgZmluZF9hbmRfZml4X2Rlc2NyaXB0b3JzKGRvYywgY2hpbGQpCisKKworZGVmIHJld3JpdGVfZGVzY3JpcHRvcihkb2MsIGRlc2NyaXB0b3IpOgorICAgICMKKyAgICAjIERvIHRoZXNlIHRoaW5nczoKKyAgICAjICAgMS4gQWRkIGFuICJpbmRleD0nbm8nIiBhdHRyaWJ1dGUgdG8gdGhlIGVsZW1lbnQgaWYgdGhlIHRhZ05hbWUKKyAgICAjICAgICAgZW5kcyBpbiAnbmknLCByZW1vdmluZyB0aGUgJ25pJyBmcm9tIHRoZSBuYW1lLgorICAgICMgICAyLiBDcmVhdGUgYSA8c2lnbmF0dXJlPiBmcm9tIHRoZSBuYW1lIGF0dHJpYnV0ZQorICAgICMgICAyYS5DcmVhdGUgYW4gPGFyZ3M+IGlmIGl0IGFwcGVhcnMgdG8gYmUgYXZhaWxhYmxlLgorICAgICMgICAzLiBDcmVhdGUgYWRkaXRpb25hbCA8c2lnbmF0dXJlPnMgZnJvbSA8KmxpbmV7LG5pfT4gZWxlbWVudHMsCisgICAgIyAgICAgIGlmIGZvdW5kLgorICAgICMgICA0LiBJZiBhIDx2ZXJzaW9uYWRkZWQ+IGlzIGZvdW5kLCBtb3ZlIGl0IHRvIGFuIGF0dHJpYnV0ZSBvbiB0aGUKKyAgICAjICAgICAgZGVzY3JpcHRvci4KKyAgICAjICAgNS4gTW92ZSByZW1haW5pbmcgY2hpbGQgbm9kZXMgdG8gYSA8ZGVzY3JpcHRpb24+IGVsZW1lbnQuCisgICAgIyAgIDYuIFB1dCBpdCBiYWNrIHRvZ2V0aGVyLgorICAgICMKKyAgICAjIDEuCisgICAgZGVzY25hbWUgPSBkZXNjcmlwdG9yLnRhZ05hbWUKKyAgICBpbmRleCA9IDEKKyAgICBpZiBkZXNjbmFtZVstMjpdID09ICJuaSI6CisgICAgICAgIGRlc2NuYW1lID0gZGVzY25hbWVbOi0yXQorICAgICAgICBkZXNjcmlwdG9yLnNldEF0dHJpYnV0ZSgiaW5kZXgiLCAibm8iKQorICAgICAgICBzZXRfdGFnTmFtZShkZXNjcmlwdG9yLCBkZXNjbmFtZSkKKyAgICAgICAgaW5kZXggPSAwCisgICAgZGVzY3R5cGUgPSBkZXNjbmFtZVs6LTRdICMgcmVtb3ZlICdkZXNjJworICAgIGxpbmVuYW1lID0gZGVzY3R5cGUgKyAibGluZSIKKyAgICBpZiBub3QgaW5kZXg6CisgICAgICAgIGxpbmVuYW1lID0gbGluZW5hbWUgKyAibmkiCisgICAgIyAyLgorICAgIHNpZ25hdHVyZSA9IGRvYy5jcmVhdGVFbGVtZW50KCJzaWduYXR1cmUiKQorICAgIG5hbWUgPSBkb2MuY3JlYXRlRWxlbWVudCgibmFtZSIpCisgICAgc2lnbmF0dXJlLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4gICAgIikpCisgICAgc2lnbmF0dXJlLmFwcGVuZENoaWxkKG5hbWUpCisgICAgbmFtZS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoZGVzY3JpcHRvci5nZXRBdHRyaWJ1dGUoIm5hbWUiKSkpCisgICAgZGVzY3JpcHRvci5yZW1vdmVBdHRyaWJ1dGUoIm5hbWUiKQorICAgICMgMmEuCisgICAgaWYgZGVzY3JpcHRvci5oYXNBdHRyaWJ1dGUoInZhciIpOgorICAgICAgICBpZiBkZXNjbmFtZSAhPSAib3Bjb2RlZGVzYyI6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICJnb3QgJ3ZhcicgYXR0cmlidXRlIG9uIGRlc2NyaXB0b3Igb3RoZXIgdGhhbiBvcGNvZGVkZXNjIgorICAgICAgICB2YXJpYWJsZSA9IGRlc2NyaXB0b3IuZ2V0QXR0cmlidXRlKCJ2YXIiKQorICAgICAgICBpZiB2YXJpYWJsZToKKyAgICAgICAgICAgIGFyZ3MgPSBkb2MuY3JlYXRlRWxlbWVudCgiYXJncyIpCisgICAgICAgICAgICBhcmdzLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSh2YXJpYWJsZSkpCisgICAgICAgICAgICBzaWduYXR1cmUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgICAiKSkKKyAgICAgICAgICAgIHNpZ25hdHVyZS5hcHBlbmRDaGlsZChhcmdzKQorICAgICAgICBkZXNjcmlwdG9yLnJlbW92ZUF0dHJpYnV0ZSgidmFyIikKKyAgICBuZXdjaGlsZHJlbiA9IFtzaWduYXR1cmVdCisgICAgY2hpbGRyZW4gPSBkZXNjcmlwdG9yLmNoaWxkTm9kZXMKKyAgICBwb3MgPSBza2lwX2xlYWRpbmdfbm9kZXMoY2hpbGRyZW4pCisgICAgaWYgcG9zIDwgbGVuKGNoaWxkcmVuKToKKyAgICAgICAgY2hpbGQgPSBjaGlsZHJlbltwb3NdCisgICAgICAgIGlmIGNoaWxkLm5vZGVOYW1lID09ICJhcmdzIjoKKyAgICAgICAgICAgICMgbW92ZSA8YXJncz4gdG8gPHNpZ25hdHVyZT4sIG9yIHJlbW92ZSBpZiBlbXB0eToKKyAgICAgICAgICAgIGNoaWxkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpCisgICAgICAgICAgICBpZiBsZW4oY2hpbGQuY2hpbGROb2Rlcyk6CisgICAgICAgICAgICAgICAgc2lnbmF0dXJlLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4gICAgIikpCisgICAgICAgICAgICAgICAgc2lnbmF0dXJlLmFwcGVuZENoaWxkKGNoaWxkKQorICAgIHNpZ25hdHVyZS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAiKSkKKyAgICAjIDMsIDQuCisgICAgcG9zID0gc2tpcF9sZWFkaW5nX25vZGVzKGNoaWxkcmVuLCBwb3MpCisgICAgd2hpbGUgcG9zIDwgbGVuKGNoaWxkcmVuKSBcCisgICAgICAgICAgYW5kIGNoaWxkcmVuW3Bvc10ubm9kZU5hbWUgaW4gKGxpbmVuYW1lLCAidmVyc2lvbmFkZGVkIik6CisgICAgICAgIGlmIGNoaWxkcmVuW3Bvc10udGFnTmFtZSA9PSBsaW5lbmFtZToKKyAgICAgICAgICAgICMgdGhpcyBpcyByZWFsbHkgYSBzdXBwbGVtZW50YWwgc2lnbmF0dXJlLCBjcmVhdGUgPHNpZ25hdHVyZT4KKyAgICAgICAgICAgIG9sZGNoaWxkID0gY2hpbGRyZW5bcG9zXS5jbG9uZU5vZGUoMSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzaWcgPSBtZXRob2RsaW5lX3RvX3NpZ25hdHVyZShkb2MsIGNoaWxkcmVuW3Bvc10pCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcHJpbnQgb2xkY2hpbGQudG94bWwoKQorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBuZXdjaGlsZHJlbi5hcHBlbmQoc2lnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyA8dmVyc2lvbmFkZGVkIGFkZGVkPS4uLj4KKyAgICAgICAgICAgIGRlc2NyaXB0b3Iuc2V0QXR0cmlidXRlKAorICAgICAgICAgICAgICAgICJhZGRlZCIsIGNoaWxkcmVuW3Bvc10uZ2V0QXR0cmlidXRlKCJ2ZXJzaW9uIikpCisgICAgICAgIHBvcyA9IHNraXBfbGVhZGluZ19ub2RlcyhjaGlsZHJlbiwgcG9zICsgMSkKKyAgICAjIDUuCisgICAgZGVzY3JpcHRpb24gPSBkb2MuY3JlYXRlRWxlbWVudCgiZGVzY3JpcHRpb24iKQorICAgIGRlc2NyaXB0aW9uLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4iKSkKKyAgICBuZXdjaGlsZHJlbi5hcHBlbmQoZGVzY3JpcHRpb24pCisgICAgbW92ZV9jaGlsZHJlbihkZXNjcmlwdG9yLCBkZXNjcmlwdGlvbiwgcG9zKQorICAgIGxhc3QgPSBkZXNjcmlwdGlvbi5jaGlsZE5vZGVzWy0xXQorICAgIGlmIGxhc3Qubm9kZVR5cGUgPT0gVEVYVDoKKyAgICAgICAgbGFzdC5kYXRhID0gc3RyaW5nLnJzdHJpcChsYXN0LmRhdGEpICsgIlxuICAiCisgICAgIyA2LgorICAgICMgc2hvdWxkIGhhdmUgbm90aGluZyBidXQgd2hpdGVzcGFjZSBhbmQgc2lnbmF0dXJlIGxpbmVzIGluIDxkZXNjcmlwdG9yPjsKKyAgICAjIGRpc2NhcmQgdGhlbQorICAgIHdoaWxlIGRlc2NyaXB0b3IuY2hpbGROb2RlczoKKyAgICAgICAgZGVzY3JpcHRvci5yZW1vdmVDaGlsZChkZXNjcmlwdG9yLmNoaWxkTm9kZXNbMF0pCisgICAgZm9yIG5vZGUgaW4gbmV3Y2hpbGRyZW46CisgICAgICAgIGRlc2NyaXB0b3IuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgIikpCisgICAgICAgIGRlc2NyaXB0b3IuYXBwZW5kQ2hpbGQobm9kZSkKKyAgICBkZXNjcmlwdG9yLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4iKSkKKworCitkZWYgbWV0aG9kbGluZV90b19zaWduYXR1cmUoZG9jLCBtZXRob2RsaW5lKToKKyAgICBzaWduYXR1cmUgPSBkb2MuY3JlYXRlRWxlbWVudCgic2lnbmF0dXJlIikKKyAgICBzaWduYXR1cmUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgICAiKSkKKyAgICBuYW1lID0gZG9jLmNyZWF0ZUVsZW1lbnQoIm5hbWUiKQorICAgIG5hbWUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKG1ldGhvZGxpbmUuZ2V0QXR0cmlidXRlKCJuYW1lIikpKQorICAgIG1ldGhvZGxpbmUucmVtb3ZlQXR0cmlidXRlKCJuYW1lIikKKyAgICBzaWduYXR1cmUuYXBwZW5kQ2hpbGQobmFtZSkKKyAgICBpZiBsZW4obWV0aG9kbGluZS5jaGlsZE5vZGVzKToKKyAgICAgICAgYXJncyA9IGRvYy5jcmVhdGVFbGVtZW50KCJhcmdzIikKKyAgICAgICAgc2lnbmF0dXJlLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4gICAgIikpCisgICAgICAgIHNpZ25hdHVyZS5hcHBlbmRDaGlsZChhcmdzKQorICAgICAgICBtb3ZlX2NoaWxkcmVuKG1ldGhvZGxpbmUsIGFyZ3MpCisgICAgc2lnbmF0dXJlLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4gICIpKQorICAgIHJldHVybiBzaWduYXR1cmUKKworCitkZWYgbW92ZV9jaGlsZHJlbihvcmlnaW4sIGRlc3QsIHN0YXJ0PTApOgorICAgIGNoaWxkcmVuID0gb3JpZ2luLmNoaWxkTm9kZXMKKyAgICB3aGlsZSBzdGFydCA8IGxlbihjaGlsZHJlbik6CisgICAgICAgIG5vZGUgPSBjaGlsZHJlbltzdGFydF0KKyAgICAgICAgb3JpZ2luLnJlbW92ZUNoaWxkKG5vZGUpCisgICAgICAgIGRlc3QuYXBwZW5kQ2hpbGQobm9kZSkKKworCitkZWYgaGFuZGxlX2FwcGVuZGl4KGRvYywgZnJhZ21lbnQpOgorICAgICMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgc2ltcGxmeSgpIGlmIGRvY3VtZW50IGlzIG11bHRpLXJvb3RlZCB0byBiZWdpbiB3aXRoCisgICAgZG9jZWxlbSA9IGdldF9kb2N1bWVudEVsZW1lbnQoZnJhZ21lbnQpCisgICAgdG9wbGV2ZWwgPSBkb2NlbGVtLnRhZ05hbWUgPT0gIm1hbnVhbCIgYW5kICJjaGFwdGVyIiBvciAic2VjdGlvbiIKKyAgICBhcHBlbmRpY2VzID0gMAorICAgIG5vZGVzID0gW10KKyAgICBmb3Igbm9kZSBpbiBkb2NlbGVtLmNoaWxkTm9kZXM6CisgICAgICAgIGlmIGFwcGVuZGljZXM6CisgICAgICAgICAgICBub2Rlcy5hcHBlbmQobm9kZSkKKyAgICAgICAgZWxpZiBub2RlLm5vZGVUeXBlID09IEVMRU1FTlQ6CisgICAgICAgICAgICBhcHBub2RlcyA9IG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFwcGVuZGl4IikKKyAgICAgICAgICAgIGlmIGFwcG5vZGVzOgorICAgICAgICAgICAgICAgIGFwcGVuZGljZXMgPSAxCisgICAgICAgICAgICAgICAgcGFyZW50ID0gYXBwbm9kZXNbMF0ucGFyZW50Tm9kZQorICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChhcHBub2Rlc1swXSkKKyAgICAgICAgICAgICAgICBwYXJlbnQubm9ybWFsaXplKCkKKyAgICBpZiBub2RlczoKKyAgICAgICAgbWFwKGRvY2VsZW0ucmVtb3ZlQ2hpbGQsIG5vZGVzKQorICAgICAgICBkb2NlbGVtLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG5cblxuIikpCisgICAgICAgIGJhY2sgPSBkb2MuY3JlYXRlRWxlbWVudCgiYmFjay1tYXR0ZXIiKQorICAgICAgICBkb2NlbGVtLmFwcGVuZENoaWxkKGJhY2spCisgICAgICAgIGJhY2suYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiIpKQorICAgICAgICB3aGlsZSBub2RlcyBhbmQgbm9kZXNbMF0ubm9kZVR5cGUgPT0gVEVYVCBcCisgICAgICAgICAgICAgIGFuZCBub3Qgc3RyaW5nLnN0cmlwKG5vZGVzWzBdLmRhdGEpOgorICAgICAgICAgICAgZGVsIG5vZGVzWzBdCisgICAgICAgIG1hcChiYWNrLmFwcGVuZENoaWxkLCBub2RlcykKKyAgICAgICAgZG9jZWxlbS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuIikpCisKKworZGVmIGhhbmRsZV9sYWJlbHMoZG9jLCBmcmFnbWVudCk6CisgICAgZm9yIGxhYmVsIGluIGZpbmRfYWxsX2VsZW1lbnRzKGZyYWdtZW50LCAibGFiZWwiKToKKyAgICAgICAgaWQgPSBsYWJlbC5nZXRBdHRyaWJ1dGUoImlkIikKKyAgICAgICAgaWYgbm90IGlkOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcGFyZW50ID0gbGFiZWwucGFyZW50Tm9kZQorICAgICAgICBwYXJlbnRUYWdOYW1lID0gcGFyZW50LnRhZ05hbWUKKyAgICAgICAgaWYgcGFyZW50VGFnTmFtZSA9PSAidGl0bGUiOgorICAgICAgICAgICAgcGFyZW50LnBhcmVudE5vZGUuc2V0QXR0cmlidXRlKCJpZCIsIGlkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFyZW50LnNldEF0dHJpYnV0ZSgiaWQiLCBpZCkKKyAgICAgICAgIyBub3csIHJlbW92ZSA8bGFiZWwgaWQ9Ii4uLiIvPiBmcm9tIHBhcmVudDoKKyAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGxhYmVsKQorICAgICAgICBpZiBwYXJlbnRUYWdOYW1lID09ICJ0aXRsZSI6CisgICAgICAgICAgICBwYXJlbnQubm9ybWFsaXplKCkKKyAgICAgICAgICAgIGNoaWxkcmVuID0gcGFyZW50LmNoaWxkTm9kZXMKKyAgICAgICAgICAgIGlmIGNoaWxkcmVuWy0xXS5ub2RlVHlwZSA9PSBURVhUOgorICAgICAgICAgICAgICAgIGNoaWxkcmVuWy0xXS5kYXRhID0gc3RyaW5nLnJzdHJpcChjaGlsZHJlblstMV0uZGF0YSkKKworCitkZWYgZml4dXBfdHJhaWxpbmdfd2hpdGVzcGFjZShkb2MsIHdzbWFwKToKKyAgICBxdWV1ZSA9IFtkb2NdCisgICAgd2hpbGUgcXVldWU6CisgICAgICAgIG5vZGUgPSBxdWV1ZVswXQorICAgICAgICBkZWwgcXVldWVbMF0KKyAgICAgICAgaWYgd3NtYXAuaGFzX2tleShub2RlLm5vZGVOYW1lKToKKyAgICAgICAgICAgIHdzID0gd3NtYXBbbm9kZS50YWdOYW1lXQorICAgICAgICAgICAgY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXMKKyAgICAgICAgICAgIGNoaWxkcmVuLnJldmVyc2UoKQorICAgICAgICAgICAgaWYgY2hpbGRyZW5bMF0ubm9kZVR5cGUgPT0gVEVYVDoKKyAgICAgICAgICAgICAgICBkYXRhID0gc3RyaW5nLnJzdHJpcChjaGlsZHJlblswXS5kYXRhKSArIHdzCisgICAgICAgICAgICAgICAgY2hpbGRyZW5bMF0uZGF0YSA9IGRhdGEKKyAgICAgICAgICAgIGNoaWxkcmVuLnJldmVyc2UoKQorICAgICAgICAgICAgIyBoYWNrIHRvIGdldCB0aGUgdGl0bGUgaW4gcGxhY2U6CisgICAgICAgICAgICBpZiBub2RlLnRhZ05hbWUgPT0gInRpdGxlIiBcCisgICAgICAgICAgICAgICBhbmQgbm9kZS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQubm9kZVR5cGUgPT0gRUxFTUVOVDoKKyAgICAgICAgICAgICAgICBub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRvYy5jcmVhdGVUZXh0KCJcbiAgIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnBhcmVudE5vZGUuZmlyc3RDaGlsZCkKKyAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUuY2hpbGROb2RlczoKKyAgICAgICAgICAgIGlmIGNoaWxkLm5vZGVUeXBlID09IEVMRU1FTlQ6CisgICAgICAgICAgICAgICAgcXVldWUuYXBwZW5kKGNoaWxkKQorCisKK2RlZiBub3JtYWxpemUoZG9jKToKKyAgICBmb3Igbm9kZSBpbiBkb2MuY2hpbGROb2RlczoKKyAgICAgICAgaWYgbm9kZS5ub2RlVHlwZSA9PSBFTEVNRU5UOgorICAgICAgICAgICAgbm9kZS5ub3JtYWxpemUoKQorCisKK2RlZiBjbGVhbnVwX3RyYWlsaW5nX3BhcmVucyhkb2MsIGVsZW1lbnRfbmFtZXMpOgorICAgIGQgPSB7fQorICAgIGZvciBnaSBpbiBlbGVtZW50X25hbWVzOgorICAgICAgICBkW2dpXSA9IGdpCisgICAgcmV3cml0ZV9lbGVtZW50ID0gZC5oYXNfa2V5CisgICAgcXVldWUgPSBbXQorICAgIGZvciBub2RlIGluIGRvYy5jaGlsZE5vZGVzOgorICAgICAgICBpZiBub2RlLm5vZGVUeXBlID09IEVMRU1FTlQ6CisgICAgICAgICAgICBxdWV1ZS5hcHBlbmQobm9kZSkKKyAgICB3aGlsZSBxdWV1ZToKKyAgICAgICAgbm9kZSA9IHF1ZXVlWzBdCisgICAgICAgIGRlbCBxdWV1ZVswXQorICAgICAgICBpZiByZXdyaXRlX2VsZW1lbnQobm9kZS50YWdOYW1lKToKKyAgICAgICAgICAgIGNoaWxkcmVuID0gbm9kZS5jaGlsZE5vZGVzCisgICAgICAgICAgICBpZiBsZW4oY2hpbGRyZW4pID09IDEgXAorICAgICAgICAgICAgICAgYW5kIGNoaWxkcmVuWzBdLm5vZGVUeXBlID09IFRFWFQ6CisgICAgICAgICAgICAgICAgZGF0YSA9IGNoaWxkcmVuWzBdLmRhdGEKKyAgICAgICAgICAgICAgICBpZiBkYXRhWy0yOl0gPT0gIigpIjoKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5bMF0uZGF0YSA9IGRhdGFbOi0yXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUuY2hpbGROb2RlczoKKyAgICAgICAgICAgICAgICBpZiBjaGlsZC5ub2RlVHlwZSA9PSBFTEVNRU5UOgorICAgICAgICAgICAgICAgICAgICBxdWV1ZS5hcHBlbmQoY2hpbGQpCisKKworZGVmIGNvbnRlbnRzX21hdGNoKGxlZnQsIHJpZ2h0KToKKyAgICBsZWZ0X2NoaWxkcmVuID0gbGVmdC5jaGlsZE5vZGVzCisgICAgcmlnaHRfY2hpbGRyZW4gPSByaWdodC5jaGlsZE5vZGVzCisgICAgaWYgbGVuKGxlZnRfY2hpbGRyZW4pICE9IGxlbihyaWdodF9jaGlsZHJlbik6CisgICAgICAgIHJldHVybiAwCisgICAgZm9yIGwsIHIgaW4gbWFwKE5vbmUsIGxlZnRfY2hpbGRyZW4sIHJpZ2h0X2NoaWxkcmVuKToKKyAgICAgICAgbm9kZVR5cGUgPSBsLm5vZGVUeXBlCisgICAgICAgIGlmIG5vZGVUeXBlICE9IHIubm9kZVR5cGU6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBpZiBub2RlVHlwZSA9PSBFTEVNRU5UOgorICAgICAgICAgICAgaWYgbC50YWdOYW1lICE9IHIudGFnTmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgIyBzaG91bGQgY2hlY2sgYXR0cmlidXRlcywgYnV0IHRoYXQncyBub3QgYSBwcm9ibGVtIGhlcmUKKyAgICAgICAgICAgIGlmIG5vdCBjb250ZW50c19tYXRjaChsLCByKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBlbGlmIG5vZGVUeXBlID09IFRFWFQ6CisgICAgICAgICAgICBpZiBsLmRhdGEgIT0gci5kYXRhOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIG5vdCBxdWl0ZSByaWdodCwgYnV0IGdvb2QgZW5vdWdoCisgICAgICAgICAgICByZXR1cm4gMAorICAgIHJldHVybiAxCisKKworZGVmIGNyZWF0ZV9tb2R1bGVfaW5mbyhkb2MsIHNlY3Rpb24pOgorICAgICMgSGVhdnkuCisgICAgbm9kZSA9IGV4dHJhY3RfZmlyc3RfZWxlbWVudChzZWN0aW9uLCAibW9kdWxlc3lub3BzaXMiKQorICAgIGlmIG5vZGUgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuCisgICAgc2V0X3RhZ05hbWUobm9kZSwgInN5bm9wc2lzIikKKyAgICBsYXN0Y2hpbGQgPSBub2RlLmNoaWxkTm9kZXNbLTFdCisgICAgaWYgbGFzdGNoaWxkLm5vZGVUeXBlID09IFRFWFQgXAorICAgICAgIGFuZCBsYXN0Y2hpbGQuZGF0YVstMTpdID09ICIuIjoKKyAgICAgICAgbGFzdGNoaWxkLmRhdGEgPSBsYXN0Y2hpbGQuZGF0YVs6LTFdCisgICAgbW9kYXV0aG9yID0gZXh0cmFjdF9maXJzdF9lbGVtZW50KHNlY3Rpb24sICJtb2R1bGVhdXRob3IiKQorICAgIGlmIG1vZGF1dGhvcjoKKyAgICAgICAgc2V0X3RhZ05hbWUobW9kYXV0aG9yLCAiYXV0aG9yIikKKyAgICAgICAgbW9kYXV0aG9yLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgKKyAgICAgICAgICAgIG1vZGF1dGhvci5nZXRBdHRyaWJ1dGUoIm5hbWUiKSkpCisgICAgICAgIG1vZGF1dGhvci5yZW1vdmVBdHRyaWJ1dGUoIm5hbWUiKQorICAgIHBsYXRmb3JtID0gZXh0cmFjdF9maXJzdF9lbGVtZW50KHNlY3Rpb24sICJwbGF0Zm9ybSIpCisgICAgaWYgc2VjdGlvbi50YWdOYW1lID09ICJzZWN0aW9uIjoKKyAgICAgICAgbW9kaW5mb19wb3MgPSAyCisgICAgICAgIG1vZGluZm8gPSBkb2MuY3JlYXRlRWxlbWVudCgibW9kdWxlaW5mbyIpCisgICAgICAgIG1vZGRlY2wgPSBleHRyYWN0X2ZpcnN0X2VsZW1lbnQoc2VjdGlvbiwgImRlY2xhcmVtb2R1bGUiKQorICAgICAgICBuYW1lID0gTm9uZQorICAgICAgICBpZiBtb2RkZWNsOgorICAgICAgICAgICAgbW9kaW5mby5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAgICIpKQorICAgICAgICAgICAgbmFtZSA9IG1vZGRlY2wuYXR0cmlidXRlc1sibmFtZSJdLnZhbHVlCisgICAgICAgICAgICBuYW1lbm9kZSA9IGRvYy5jcmVhdGVFbGVtZW50KCJuYW1lIikKKyAgICAgICAgICAgIG5hbWVub2RlLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZShuYW1lKSkKKyAgICAgICAgICAgIG1vZGluZm8uYXBwZW5kQ2hpbGQobmFtZW5vZGUpCisgICAgICAgICAgICB0eXBlID0gbW9kZGVjbC5hdHRyaWJ1dGVzLmdldCgidHlwZSIpCisgICAgICAgICAgICBpZiB0eXBlOgorICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlLnZhbHVlCisgICAgICAgICAgICAgICAgbW9kaW5mby5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAgICIpKQorICAgICAgICAgICAgICAgIHR5cGVub2RlID0gZG9jLmNyZWF0ZUVsZW1lbnQoInR5cGUiKQorICAgICAgICAgICAgICAgIHR5cGVub2RlLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSh0eXBlKSkKKyAgICAgICAgICAgICAgICBtb2RpbmZvLmFwcGVuZENoaWxkKHR5cGVub2RlKQorICAgICAgICB2ZXJzaW9uYWRkZWQgPSBleHRyYWN0X2ZpcnN0X2VsZW1lbnQoc2VjdGlvbiwgInZlcnNpb25hZGRlZCIpCisgICAgICAgIGlmIHZlcnNpb25hZGRlZDoKKyAgICAgICAgICAgIG1vZGluZm8uc2V0QXR0cmlidXRlKCJhZGRlZCIsIHZlcnNpb25hZGRlZC5nZXRBdHRyaWJ1dGUoInZlcnNpb24iKSkKKyAgICAgICAgdGl0bGUgPSBnZXRfZmlyc3RfZWxlbWVudChzZWN0aW9uLCAidGl0bGUiKQorICAgICAgICBpZiB0aXRsZToKKyAgICAgICAgICAgIGNoaWxkcmVuID0gdGl0bGUuY2hpbGROb2RlcworICAgICAgICAgICAgaWYgbGVuKGNoaWxkcmVuKSA+PSAyIFwKKyAgICAgICAgICAgICAgIGFuZCBjaGlsZHJlblswXS5ub2RlTmFtZSA9PSAibW9kdWxlIiBcCisgICAgICAgICAgICAgICBhbmQgY2hpbGRyZW5bMF0uY2hpbGROb2Rlc1swXS5kYXRhID09IG5hbWU6CisgICAgICAgICAgICAgICAgIyB0aGlzIGlzIGl0OyBtb3JwaCB0aGUgPHRpdGxlPiBpbnRvIDxzaG9ydC1zeW5vcHNpcz4KKyAgICAgICAgICAgICAgICBmaXJzdF9kYXRhID0gY2hpbGRyZW5bMV0KKyAgICAgICAgICAgICAgICBpZiBmaXJzdF9kYXRhLmRhdGFbOjRdID09ICIgLS0tIjoKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RfZGF0YS5kYXRhID0gc3RyaW5nLmxzdHJpcChmaXJzdF9kYXRhLmRhdGFbNDpdKQorICAgICAgICAgICAgICAgIHNldF90YWdOYW1lKHRpdGxlLCAic2hvcnQtc3lub3BzaXMiKQorICAgICAgICAgICAgICAgIGlmIGNoaWxkcmVuWy0xXS5ub2RlVHlwZSA9PSBURVhUIFwKKyAgICAgICAgICAgICAgICAgICBhbmQgY2hpbGRyZW5bLTFdLmRhdGFbLTE6XSA9PSAiLiI6CisgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuWy0xXS5kYXRhID0gY2hpbGRyZW5bLTFdLmRhdGFbOi0xXQorICAgICAgICAgICAgICAgIHNlY3Rpb24ucmVtb3ZlQ2hpbGQodGl0bGUpCisgICAgICAgICAgICAgICAgc2VjdGlvbi5yZW1vdmVDaGlsZChzZWN0aW9uLmNoaWxkTm9kZXNbMF0pCisgICAgICAgICAgICAgICAgdGl0bGUucmVtb3ZlQ2hpbGQoY2hpbGRyZW5bMF0pCisgICAgICAgICAgICAgICAgbW9kaW5mb19wb3MgPSAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGV3cml0ZSgibW9kdWxlIG5hbWUgaW4gdGl0bGUgZG9lc24ndCBtYXRjaCIKKyAgICAgICAgICAgICAgICAgICAgICAgIiA8ZGVjbGFyZW1vZHVsZS8+OyBubyA8c2hvcnQtc3lub3BzaXMvPlxuIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGV3cml0ZSgiVW5leHBlY3RlZCBjb25kaXRpb246IDxzZWN0aW9uLz4gd2l0aG91dCA8dGl0bGUvPlxuIikKKyAgICAgICAgbW9kaW5mby5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAgICIpKQorICAgICAgICBtb2RpbmZvLmFwcGVuZENoaWxkKG5vZGUpCisgICAgICAgIGlmIHRpdGxlIGFuZCBub3QgY29udGVudHNfbWF0Y2godGl0bGUsIG5vZGUpOgorICAgICAgICAgICAgIyBUaGUgc2hvcnQgc3lub3BzaXMgaXMgYWN0dWFsbHkgZGlmZmVyZW50LAorICAgICAgICAgICAgIyBhbmQgbmVlZHMgdG8gYmUgc3RvcmVkOgorICAgICAgICAgICAgbW9kaW5mby5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAgICIpKQorICAgICAgICAgICAgbW9kaW5mby5hcHBlbmRDaGlsZCh0aXRsZSkKKyAgICAgICAgaWYgbW9kYXV0aG9yOgorICAgICAgICAgICAgbW9kaW5mby5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAgICIpKQorICAgICAgICAgICAgbW9kaW5mby5hcHBlbmRDaGlsZChtb2RhdXRob3IpCisgICAgICAgIGlmIHBsYXRmb3JtOgorICAgICAgICAgICAgbW9kaW5mby5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAgICIpKQorICAgICAgICAgICAgbW9kaW5mby5hcHBlbmRDaGlsZChwbGF0Zm9ybSkKKyAgICAgICAgbW9kaW5mby5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAiKSkKKyAgICAgICAgc2VjdGlvbi5pbnNlcnRCZWZvcmUobW9kaW5mbywgc2VjdGlvbi5jaGlsZE5vZGVzW21vZGluZm9fcG9zXSkKKyAgICAgICAgc2VjdGlvbi5pbnNlcnRCZWZvcmUoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgIiksIG1vZGluZm8pCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgcmVzdCBvZiB0aGlzIHJlbW92ZXMgZXh0cmEgbmV3bGluZXMgZnJvbSB3aGVyZSB3ZSBjdXQgb3V0CisgICAgICAgICMgYSBsb3Qgb2YgZWxlbWVudHMuICBBIGxvdCBvZiBjb2RlIGZvciBtaW5pbWFsIHZhbHVlLCBidXQga2VlcHMKKyAgICAgICAgIyBrZWVwcyB0aGUgZ2VuZXJhdGVkICpNTCBmcm9tIGJlaW5nIHRvbyBmdW5ueSBsb29raW5nLgorICAgICAgICAjCisgICAgICAgIHNlY3Rpb24ubm9ybWFsaXplKCkKKyAgICAgICAgY2hpbGRyZW4gPSBzZWN0aW9uLmNoaWxkTm9kZXMKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGNoaWxkcmVuKSk6CisgICAgICAgICAgICBub2RlID0gY2hpbGRyZW5baV0KKyAgICAgICAgICAgIGlmIG5vZGUubm9kZU5hbWUgPT0gIm1vZHVsZWluZm8iOgorICAgICAgICAgICAgICAgIG5leHRub2RlID0gY2hpbGRyZW5baSsxXQorICAgICAgICAgICAgICAgIGlmIG5leHRub2RlLm5vZGVUeXBlID09IFRFWFQ6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZXh0bm9kZS5kYXRhCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihzdHJpbmcubHN0cmlwKGRhdGEpKSA8IChsZW4oZGF0YSkgLSA0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRub2RlLmRhdGEgPSAiXG5cblxuIiArIHN0cmluZy5sc3RyaXAoZGF0YSkKKworCitkZWYgY2xlYW51cF9zeW5vcHNlcyhkb2MsIGZyYWdtZW50KToKKyAgICBmb3Igbm9kZSBpbiBmaW5kX2FsbF9lbGVtZW50cyhmcmFnbWVudCwgInNlY3Rpb24iKToKKyAgICAgICAgY3JlYXRlX21vZHVsZV9pbmZvKGRvYywgbm9kZSkKKworCitkZWYgZml4dXBfdGFibGVfc3RydWN0dXJlcyhkb2MsIGZyYWdtZW50KToKKyAgICBmb3IgdGFibGUgaW4gZmluZF9hbGxfZWxlbWVudHMoZnJhZ21lbnQsICJ0YWJsZSIpOgorICAgICAgICBmaXh1cF90YWJsZShkb2MsIHRhYmxlKQorCisKK2RlZiBmaXh1cF90YWJsZShkb2MsIHRhYmxlKToKKyAgICAjIGNyZWF0ZSB0aGUgdGFibGUgaGVhZAorICAgIHRoZWFkID0gZG9jLmNyZWF0ZUVsZW1lbnQoInRoZWFkIikKKyAgICByb3cgPSBkb2MuY3JlYXRlRWxlbWVudCgicm93IikKKyAgICBtb3ZlX2VsZW1lbnRzX2J5X25hbWUoZG9jLCB0YWJsZSwgcm93LCAiZW50cnkiKQorICAgIHRoZWFkLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4gICAgIikpCisgICAgdGhlYWQuYXBwZW5kQ2hpbGQocm93KQorICAgIHRoZWFkLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4gICAgIikpCisgICAgIyBjcmVhdGUgdGhlIHRhYmxlIGJvZHkKKyAgICB0Ym9keSA9IGRvYy5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpCisgICAgcHJldl9yb3cgPSBOb25lCisgICAgbGFzdF93YXNfaGxpbmUgPSAwCisgICAgY2hpbGRyZW4gPSB0YWJsZS5jaGlsZE5vZGVzCisgICAgZm9yIGNoaWxkIGluIGNoaWxkcmVuOgorICAgICAgICBpZiBjaGlsZC5ub2RlVHlwZSA9PSBFTEVNRU5UOgorICAgICAgICAgICAgdGFnTmFtZSA9IGNoaWxkLnRhZ05hbWUKKyAgICAgICAgICAgIGlmIHRhZ05hbWUgPT0gImhsaW5lIiBhbmQgcHJldl9yb3cgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcHJldl9yb3cuc2V0QXR0cmlidXRlKCJyb3dzZXAiLCAiMSIpCisgICAgICAgICAgICBlbGlmIHRhZ05hbWUgPT0gInJvdyI6CisgICAgICAgICAgICAgICAgcHJldl9yb3cgPSBjaGlsZAorICAgICMgc2F2ZSB0aGUgcm93czoKKyAgICB0Ym9keS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAgICIpKQorICAgIG1vdmVfZWxlbWVudHNfYnlfbmFtZShkb2MsIHRhYmxlLCB0Ym9keSwgInJvdyIsIHNlcD0iXG4gICAgIikKKyAgICAjIGFuZCB0b3NzIHRoZSByZXN0OgorICAgIHdoaWxlIGNoaWxkcmVuOgorICAgICAgICBjaGlsZCA9IGNoaWxkcmVuWzBdCisgICAgICAgIG5vZGVUeXBlID0gY2hpbGQubm9kZVR5cGUKKyAgICAgICAgaWYgbm9kZVR5cGUgPT0gVEVYVDoKKyAgICAgICAgICAgIGlmIHN0cmluZy5zdHJpcChjaGlsZC5kYXRhKToKKyAgICAgICAgICAgICAgICByYWlzZSBDb252ZXJzaW9uRXJyb3IoInVuZXhwZWN0ZWQgZnJlZSBkYXRhIGluIDwlcz46ICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlICh0YWJsZS50YWdOYW1lLCBjaGlsZC5kYXRhKSkKKyAgICAgICAgICAgIHRhYmxlLnJlbW92ZUNoaWxkKGNoaWxkKQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgbm9kZVR5cGUgPT0gRUxFTUVOVDoKKyAgICAgICAgICAgIGlmIGNoaWxkLnRhZ05hbWUgIT0gImhsaW5lIjoKKyAgICAgICAgICAgICAgICByYWlzZSBDb252ZXJzaW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIDwlcz4gaW4gdGFibGUiICUgY2hpbGQudGFnTmFtZSkKKyAgICAgICAgICAgIHRhYmxlLnJlbW92ZUNoaWxkKGNoaWxkKQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcmFpc2UgQ29udmVyc2lvbkVycm9yKAorICAgICAgICAgICAgInVuZXhwZWN0ZWQgJXMgbm9kZSBpbiB0YWJsZSIgJSBjaGlsZC5fX2NsYXNzX18uX19uYW1lX18pCisgICAgIyBub3RoaW5nIGxlZnQgaW4gdGhlIDx0YWJsZT47IGFkZCB0aGUgPHRoZWFkPiBhbmQgPHRib2R5PgorICAgIHRncm91cCA9IGRvYy5jcmVhdGVFbGVtZW50KCJ0Z3JvdXAiKQorICAgIHRncm91cC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAiKSkKKyAgICB0Z3JvdXAuYXBwZW5kQ2hpbGQodGhlYWQpCisgICAgdGdyb3VwLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4gICIpKQorICAgIHRncm91cC5hcHBlbmRDaGlsZCh0Ym9keSkKKyAgICB0Z3JvdXAuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgIikpCisgICAgdGFibGUuYXBwZW5kQ2hpbGQodGdyb3VwKQorICAgICMgbm93IG1ha2UgdGhlIDxlbnRyeT5zIGxvb2sgbmljZToKKyAgICBmb3Igcm93IGluIHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJyb3ciKToKKyAgICAgICAgZml4dXBfcm93KGRvYywgcm93KQorCisKK2RlZiBmaXh1cF9yb3coZG9jLCByb3cpOgorICAgIGVudHJpZXMgPSBbXQorICAgIG1hcChlbnRyaWVzLmFwcGVuZCwgcm93LmNoaWxkTm9kZXNbMTpdKQorICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgorICAgICAgICByb3cuaW5zZXJ0QmVmb3JlKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4gICAgICAgICAiKSwgZW50cnkpCisjICAgIHJvdy5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAgICAgIikpCisKKworZGVmIG1vdmVfZWxlbWVudHNfYnlfbmFtZShkb2MsIHNvdXJjZSwgZGVzdCwgbmFtZSwgc2VwPU5vbmUpOgorICAgIG5vZGVzID0gW10KKyAgICBmb3IgY2hpbGQgaW4gc291cmNlLmNoaWxkTm9kZXM6CisgICAgICAgIGlmIGNoaWxkLm5vZGVOYW1lID09IG5hbWU6CisgICAgICAgICAgICBub2Rlcy5hcHBlbmQoY2hpbGQpCisgICAgZm9yIG5vZGUgaW4gbm9kZXM6CisgICAgICAgIHNvdXJjZS5yZW1vdmVDaGlsZChub2RlKQorICAgICAgICBkZXN0LmFwcGVuZENoaWxkKG5vZGUpCisgICAgICAgIGlmIHNlcDoKKyAgICAgICAgICAgIGRlc3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKHNlcCkpCisKKworUkVDVVJTRV9JTlRPX1BBUkFfQ09OVEFJTkVSUyA9ICgKKyAgICAiY2hhcHRlciIsICJhYnN0cmFjdCIsICJlbnVtZXJhdGUiLAorICAgICJzZWN0aW9uIiwgInN1YnNlY3Rpb24iLCAic3Vic3Vic2VjdGlvbiIsCisgICAgInBhcmFncmFwaCIsICJzdWJwYXJhZ3JhcGgiLCAiYmFjay1tYXR0ZXIiLAorICAgICJob3d0byIsICJtYW51YWwiLAorICAgICJpdGVtIiwgIml0ZW1pemUiLCAiZnVsbGxpbmVpdGVtcyIsICJlbnVtZXJhdGlvbiIsICJkZXNjcmlwdGlvbmxpc3QiLAorICAgICJkZWZpbml0aW9ubGlzdCIsICJkZWZpbml0aW9uIiwKKyAgICApCisKK1BBUkFfTEVWRUxfRUxFTUVOVFMgPSAoCisgICAgIm1vZHVsZWluZm8iLCAidGl0bGUiLCAidmVyYmF0aW0iLCAiZW51bWVyYXRlIiwgIml0ZW0iLAorICAgICJpbnRlcnByZXRlci1zZXNzaW9uIiwgImJhY2stbWF0dGVyIiwgImludGVyYWN0aXZlLXNlc3Npb24iLAorICAgICJvcGNvZGVkZXNjIiwgImNsYXNzZGVzYyIsICJkYXRhZGVzYyIsCisgICAgImZ1bmNkZXNjIiwgIm1ldGhvZGRlc2MiLCAiZXhjZGVzYyIsICJtZW1iZXJkZXNjIiwgIm1lbWJkZXJkZXNjbmkiLAorICAgICJmdW5jZGVzY25pIiwgIm1ldGhvZGRlc2NuaSIsICJleGNkZXNjbmkiLAorICAgICJ0YWJsZWlpIiwgInRhYmxlaWlpIiwgInRhYmxlaXYiLCAibG9jYWxtb2R1bGV0YWJsZSIsCisgICAgInNlY3Rpb25hdXRob3IiLCAic2VlYWxzbyIsICJpdGVtaXplIiwKKyAgICAjIGluY2x1ZGUgPHBhcmE+LCBzbyB3ZSBjYW4ganVzdCBkbyBpdCBhZ2FpbiB0byBnZXQgc3Vic2VxdWVudCBwYXJhczoKKyAgICBQQVJBX0VMRU1FTlQsCisgICAgKQorCitQQVJBX0xFVkVMX1BSRUNFRURFUlMgPSAoCisgICAgInNldGluZGV4c3ViaXRlbSIsICJhdXRob3IiLAorICAgICJzdGluZGV4IiwgIm9iaW5kZXgiLCAiQ09NTUVOVCIsICJsYWJlbCIsICJpbnB1dCIsICJ0aXRsZSIsCisgICAgInZlcnNpb25hZGRlZCIsICJ2ZXJzaW9uY2hhbmdlZCIsICJkZWNsYXJlbW9kdWxlIiwgIm1vZHVsZXN5bm9wc2lzIiwKKyAgICAibW9kdWxlYXV0aG9yIiwgImluZGV4dGVybSIsICJsZWFkZXIiLAorICAgICkKKworCitkZWYgZml4dXBfcGFyYXMoZG9jLCBmcmFnbWVudCk6CisgICAgZm9yIGNoaWxkIGluIGZyYWdtZW50LmNoaWxkTm9kZXM6CisgICAgICAgIGlmIGNoaWxkLm5vZGVOYW1lIGluIFJFQ1VSU0VfSU5UT19QQVJBX0NPTlRBSU5FUlM6CisgICAgICAgICAgICBmaXh1cF9wYXJhc19oZWxwZXIoZG9jLCBjaGlsZCkKKyAgICBkZXNjcmlwdGlvbnMgPSBmaW5kX2FsbF9lbGVtZW50cyhmcmFnbWVudCwgImRlc2NyaXB0aW9uIikKKyAgICBmb3IgZGVzY3JpcHRpb24gaW4gZGVzY3JpcHRpb25zOgorICAgICAgICBmaXh1cF9wYXJhc19oZWxwZXIoZG9jLCBkZXNjcmlwdGlvbikKKworCitkZWYgZml4dXBfcGFyYXNfaGVscGVyKGRvYywgY29udGFpbmVyLCBkZXB0aD0wKToKKyAgICAjIGRvY3VtZW50IGlzIGFscmVhZHkgbm9ybWFsaXplZAorICAgIGNoaWxkcmVuID0gY29udGFpbmVyLmNoaWxkTm9kZXMKKyAgICBzdGFydCA9IHNraXBfbGVhZGluZ19ub2RlcyhjaGlsZHJlbikKKyAgICB3aGlsZSBsZW4oY2hpbGRyZW4pID4gc3RhcnQ6CisgICAgICAgIGlmIGNoaWxkcmVuW3N0YXJ0XS5ub2RlTmFtZSBpbiBSRUNVUlNFX0lOVE9fUEFSQV9DT05UQUlORVJTOgorICAgICAgICAgICAgIyBTb21ldGhpbmcgdG8gcmVjdXJzZSBpbnRvOgorICAgICAgICAgICAgZml4dXBfcGFyYXNfaGVscGVyKGRvYywgY2hpbGRyZW5bc3RhcnRdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBQYXJhZ3JhcGggbWF0ZXJpYWw6CisgICAgICAgICAgICBidWlsZF9wYXJhKGRvYywgY29udGFpbmVyLCBzdGFydCwgbGVuKGNoaWxkcmVuKSkKKyAgICAgICAgICAgIGlmIERFQlVHX1BBUkFfRklYRVIgYW5kIGRlcHRoID09IDEwOgorICAgICAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgIHN0YXJ0ID0gc2tpcF9sZWFkaW5nX25vZGVzKGNoaWxkcmVuLCBzdGFydCArIDEpCisKKworZGVmIGJ1aWxkX3BhcmEoZG9jLCBwYXJlbnQsIHN0YXJ0LCBpKToKKyAgICBjaGlsZHJlbiA9IHBhcmVudC5jaGlsZE5vZGVzCisgICAgYWZ0ZXIgPSBzdGFydCArIDEKKyAgICBoYXZlX2xhc3QgPSAwCisgICAgQlJFQUtfRUxFTUVOVFMgPSBQQVJBX0xFVkVMX0VMRU1FTlRTICsgUkVDVVJTRV9JTlRPX1BBUkFfQ09OVEFJTkVSUworICAgICMgQ29sbGVjdCBhbGwgY2hpbGRyZW4gdW50aWwgXG5cbisgaXMgZm91bmQgaW4gYSB0ZXh0IG5vZGUgb3IgYQorICAgICMgbWVtYmVyIG9mIEJSRUFLX0VMRU1FTlRTIGlzIGZvdW5kLgorICAgIGZvciBqIGluIHJhbmdlKHN0YXJ0LCBpKToKKyAgICAgICAgYWZ0ZXIgPSBqICsgMQorICAgICAgICBjaGlsZCA9IGNoaWxkcmVuW2pdCisgICAgICAgIG5vZGVUeXBlID0gY2hpbGQubm9kZVR5cGUKKyAgICAgICAgaWYgbm9kZVR5cGUgPT0gRUxFTUVOVDoKKyAgICAgICAgICAgIGlmIGNoaWxkLnRhZ05hbWUgaW4gQlJFQUtfRUxFTUVOVFM6CisgICAgICAgICAgICAgICAgYWZ0ZXIgPSBqCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxpZiBub2RlVHlwZSA9PSBURVhUOgorICAgICAgICAgICAgcG9zID0gc3RyaW5nLmZpbmQoY2hpbGQuZGF0YSwgIlxuXG4iKQorICAgICAgICAgICAgaWYgcG9zID09IDA6CisgICAgICAgICAgICAgICAgYWZ0ZXIgPSBqCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIHBvcyA+PSAxOgorICAgICAgICAgICAgICAgIGNoaWxkLnNwbGl0VGV4dChwb3MpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICBoYXZlX2xhc3QgPSAxCisgICAgaWYgKHN0YXJ0ICsgMSkgPiBhZnRlcjoKKyAgICAgICAgcmFpc2UgQ29udmVyc2lvbkVycm9yKAorICAgICAgICAgICAgImJ1aWxkX3BhcmEoKSBjb3VsZCBub3QgaWRlbnRpZnkgY29udGVudCB0byB0dXJuIGludG8gYSBwYXJhZ3JhcGgiKQorICAgIGlmIGNoaWxkcmVuW2FmdGVyIC0gMV0ubm9kZVR5cGUgPT0gVEVYVDoKKyAgICAgICAgIyB3ZSBtYXkgbmVlZCB0byBzcGxpdCBvZmYgdHJhaWxpbmcgd2hpdGUgc3BhY2U6CisgICAgICAgIGNoaWxkID0gY2hpbGRyZW5bYWZ0ZXIgLSAxXQorICAgICAgICBkYXRhID0gY2hpbGQuZGF0YQorICAgICAgICBpZiBzdHJpbmcucnN0cmlwKGRhdGEpICE9IGRhdGE6CisgICAgICAgICAgICBoYXZlX2xhc3QgPSAwCisgICAgICAgICAgICBjaGlsZC5zcGxpdFRleHQobGVuKHN0cmluZy5yc3RyaXAoZGF0YSkpKQorICAgIHBhcmEgPSBkb2MuY3JlYXRlRWxlbWVudChQQVJBX0VMRU1FTlQpCisgICAgcHJldiA9IE5vbmUKKyAgICBpbmRleGVzID0gcmFuZ2Uoc3RhcnQsIGFmdGVyKQorICAgIGluZGV4ZXMucmV2ZXJzZSgpCisgICAgZm9yIGogaW4gaW5kZXhlczoKKyAgICAgICAgbm9kZSA9IHBhcmVudC5jaGlsZE5vZGVzW2pdCisgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChub2RlKQorICAgICAgICBwYXJhLmluc2VydEJlZm9yZShub2RlLCBwcmV2KQorICAgICAgICBwcmV2ID0gbm9kZQorICAgIGlmIGhhdmVfbGFzdDoKKyAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKHBhcmEpCisgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuXG4iKSkKKyAgICAgICAgcmV0dXJuIGxlbihwYXJlbnQuY2hpbGROb2RlcykKKyAgICBlbHNlOgorICAgICAgICBuZXh0bm9kZSA9IHBhcmVudC5jaGlsZE5vZGVzW3N0YXJ0XQorICAgICAgICBpZiBuZXh0bm9kZS5ub2RlVHlwZSA9PSBURVhUOgorICAgICAgICAgICAgaWYgbmV4dG5vZGUuZGF0YSBhbmQgbmV4dG5vZGUuZGF0YVswXSAhPSAiXG4iOgorICAgICAgICAgICAgICAgIG5leHRub2RlLmRhdGEgPSAiXG4iICsgbmV4dG5vZGUuZGF0YQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmV3bm9kZSA9IGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4iKQorICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShuZXdub2RlLCBuZXh0bm9kZSkKKyAgICAgICAgICAgIG5leHRub2RlID0gbmV3bm9kZQorICAgICAgICAgICAgc3RhcnQgPSBzdGFydCArIDEKKyAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShwYXJhLCBuZXh0bm9kZSkKKyAgICAgICAgcmV0dXJuIHN0YXJ0ICsgMQorCisKK2RlZiBza2lwX2xlYWRpbmdfbm9kZXMoY2hpbGRyZW4sIHN0YXJ0PTApOgorICAgICIiIlJldHVybiBpbmRleCBpbnRvIGNoaWxkcmVuIG9mIGEgbm9kZSBhdCB3aGljaCBwYXJhZ3JhcGggYnVpbGRpbmcgc2hvdWxkCisgICAgYmVnaW4gb3IgYSByZWN1cnNpdmUgY2FsbCB0byBmaXh1cF9wYXJhc19oZWxwZXIoKSBzaG91bGQgYmUgbWFkZSAoZm9yCisgICAgc3Vic2VjdGlvbnMsIGV0Yy4pLgorCisgICAgV2hlbiB0aGUgcmV0dXJuIHZhbHVlID49IGxlbihjaGlsZHJlbiksIHdlJ3ZlIGJ1aWx0IGFsbCB0aGUgcGFyYXMgd2UgY2FuCisgICAgZnJvbSB0aGlzIGxpc3Qgb2YgY2hpbGRyZW4uCisgICAgIiIiCisgICAgaSA9IGxlbihjaGlsZHJlbikKKyAgICB3aGlsZSBpID4gc3RhcnQ6CisgICAgICAgICMgc2tpcCBvdmVyIGxlYWRpbmcgY29tbWVudHMgYW5kIHdoaXRlc3BhY2U6CisgICAgICAgIGNoaWxkID0gY2hpbGRyZW5bc3RhcnRdCisgICAgICAgIG5vZGVUeXBlID0gY2hpbGQubm9kZVR5cGUKKyAgICAgICAgaWYgbm9kZVR5cGUgPT0gVEVYVDoKKyAgICAgICAgICAgIGRhdGEgPSBjaGlsZC5kYXRhCisgICAgICAgICAgICBzaG9ydGVuZWQgPSBzdHJpbmcubHN0cmlwKGRhdGEpCisgICAgICAgICAgICBpZiBzaG9ydGVuZWQ6CisgICAgICAgICAgICAgICAgaWYgZGF0YSAhPSBzaG9ydGVuZWQ6CisgICAgICAgICAgICAgICAgICAgICMgYnJlYWsgaW50byB0d28gbm9kZXM6IHdoaXRlc3BhY2UgYW5kIG5vbi13aGl0ZXNwYWNlCisgICAgICAgICAgICAgICAgICAgIGNoaWxkLnNwbGl0VGV4dChsZW4oZGF0YSkgLSBsZW4oc2hvcnRlbmVkKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0ICsgMQorICAgICAgICAgICAgICAgIHJldHVybiBzdGFydAorICAgICAgICAgICAgIyBhbGwgd2hpdGVzcGFjZSwganVzdCBza2lwCisgICAgICAgIGVsaWYgbm9kZVR5cGUgPT0gRUxFTUVOVDoKKyAgICAgICAgICAgIHRhZ05hbWUgPSBjaGlsZC50YWdOYW1lCisgICAgICAgICAgICBpZiB0YWdOYW1lIGluIFJFQ1VSU0VfSU5UT19QQVJBX0NPTlRBSU5FUlM6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0CisgICAgICAgICAgICBpZiB0YWdOYW1lIG5vdCBpbiBQQVJBX0xFVkVMX0VMRU1FTlRTICsgUEFSQV9MRVZFTF9QUkVDRUVERVJTOgorICAgICAgICAgICAgICAgIHJldHVybiBzdGFydAorICAgICAgICBzdGFydCA9IHN0YXJ0ICsgMQorICAgIHJldHVybiBzdGFydAorCisKK2RlZiBmaXh1cF9yZmNfcmVmZXJlbmNlcyhkb2MsIGZyYWdtZW50KToKKyAgICBmb3IgcmZjbm9kZSBpbiBmaW5kX2FsbF9lbGVtZW50cyhmcmFnbWVudCwgInJmYyIpOgorICAgICAgICByZmNub2RlLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgKKyAgICAgICAgICAgICJSRkMgIiArIHJmY25vZGUuZ2V0QXR0cmlidXRlKCJudW0iKSkpCisKKworZGVmIGZpeHVwX3NpZ25hdHVyZXMoZG9jLCBmcmFnbWVudCk6CisgICAgZm9yIGNoaWxkIGluIGZyYWdtZW50LmNoaWxkTm9kZXM6CisgICAgICAgIGlmIGNoaWxkLm5vZGVUeXBlID09IEVMRU1FTlQ6CisgICAgICAgICAgICBhcmdzID0gY2hpbGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFyZ3MiKQorICAgICAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgorICAgICAgICAgICAgICAgIGZpeHVwX2FyZ3MoZG9jLCBhcmcpCisgICAgICAgICAgICAgICAgYXJnLm5vcm1hbGl6ZSgpCisgICAgICAgICAgICBhcmdzID0gY2hpbGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImNvbnN0cnVjdG9yLWFyZ3MiKQorICAgICAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgorICAgICAgICAgICAgICAgIGZpeHVwX2FyZ3MoZG9jLCBhcmcpCisgICAgICAgICAgICAgICAgYXJnLm5vcm1hbGl6ZSgpCisKKworZGVmIGZpeHVwX2FyZ3MoZG9jLCBhcmdsaXN0KToKKyAgICBmb3IgY2hpbGQgaW4gYXJnbGlzdC5jaGlsZE5vZGVzOgorICAgICAgICBpZiBjaGlsZC5ub2RlTmFtZSA9PSAib3B0aW9uYWwiOgorICAgICAgICAgICAgIyBmb3VuZCBpdDsgZml4IGFuZCByZXR1cm4KKyAgICAgICAgICAgIGFyZ2xpc3QuaW5zZXJ0QmVmb3JlKGRvYy5jcmVhdGVUZXh0Tm9kZSgiWyIpLCBjaGlsZCkKKyAgICAgICAgICAgIG9wdGtpZHMgPSBjaGlsZC5jaGlsZE5vZGVzCisgICAgICAgICAgICB3aGlsZSBvcHRraWRzOgorICAgICAgICAgICAgICAgIGsgPSBvcHRraWRzWzBdCisgICAgICAgICAgICAgICAgY2hpbGQucmVtb3ZlQ2hpbGQoaykKKyAgICAgICAgICAgICAgICBhcmdsaXN0Lmluc2VydEJlZm9yZShrLCBjaGlsZCkKKyAgICAgICAgICAgIGFyZ2xpc3QuaW5zZXJ0QmVmb3JlKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXSIpLCBjaGlsZCkKKyAgICAgICAgICAgIGFyZ2xpc3QucmVtb3ZlQ2hpbGQoY2hpbGQpCisgICAgICAgICAgICByZXR1cm4gZml4dXBfYXJncyhkb2MsIGFyZ2xpc3QpCisKKworZGVmIGZpeHVwX3NlY3Rpb25hdXRob3JzKGRvYywgZnJhZ21lbnQpOgorICAgIGZvciBzZWN0YXV0aCBpbiBmaW5kX2FsbF9lbGVtZW50cyhmcmFnbWVudCwgInNlY3Rpb25hdXRob3IiKToKKyAgICAgICAgc2VjdGlvbiA9IHNlY3RhdXRoLnBhcmVudE5vZGUKKyAgICAgICAgc2VjdGlvbi5yZW1vdmVDaGlsZChzZWN0YXV0aCkKKyAgICAgICAgc2V0X3RhZ05hbWUoc2VjdGF1dGgsICJhdXRob3IiKQorICAgICAgICBzZWN0YXV0aC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoCisgICAgICAgICAgICBzZWN0YXV0aC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSkpCisgICAgICAgIHNlY3RhdXRoLnJlbW92ZUF0dHJpYnV0ZSgibmFtZSIpCisgICAgICAgIGFmdGVyID0gc2VjdGlvbi5jaGlsZE5vZGVzWzJdCisgICAgICAgIHRpdGxlID0gc2VjdGlvbi5jaGlsZE5vZGVzWzFdCisgICAgICAgIGlmIHRpdGxlLm5vZGVOYW1lICE9ICJ0aXRsZSI6CisgICAgICAgICAgICBhZnRlciA9IHNlY3Rpb24uY2hpbGROb2Rlc1swXQorICAgICAgICBzZWN0aW9uLmluc2VydEJlZm9yZShkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAiKSwgYWZ0ZXIpCisgICAgICAgIHNlY3Rpb24uaW5zZXJ0QmVmb3JlKHNlY3RhdXRoLCBhZnRlcikKKworCitkZWYgZml4dXBfdmVyYmF0aW1zKGRvYyk6CisgICAgZm9yIHZlcmJhdGltIGluIGZpbmRfYWxsX2VsZW1lbnRzKGRvYywgInZlcmJhdGltIik6CisgICAgICAgIGNoaWxkID0gdmVyYmF0aW0uY2hpbGROb2Rlc1swXQorICAgICAgICBpZiBjaGlsZC5ub2RlVHlwZSA9PSBURVhUIFwKKyAgICAgICAgICAgYW5kIHN0cmluZy5sc3RyaXAoY2hpbGQuZGF0YSlbOjNdID09ICI+Pj4iOgorICAgICAgICAgICAgc2V0X3RhZ05hbWUodmVyYmF0aW0sICJpbnRlcmFjdGl2ZS1zZXNzaW9uIikKKworCitkZWYgYWRkX25vZGVfaWRzKGZyYWdtZW50LCBjb3VudGVyPTApOgorICAgIGZyYWdtZW50Lm5vZGVfaWQgPSBjb3VudGVyCisgICAgZm9yIG5vZGUgaW4gZnJhZ21lbnQuY2hpbGROb2RlczoKKyAgICAgICAgY291bnRlciA9IGNvdW50ZXIgKyAxCisgICAgICAgIGlmIG5vZGUubm9kZVR5cGUgPT0gRUxFTUVOVDoKKyAgICAgICAgICAgIGNvdW50ZXIgPSBhZGRfbm9kZV9pZHMobm9kZSwgY291bnRlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5vZGUubm9kZV9pZCA9IGNvdW50ZXIKKyAgICByZXR1cm4gY291bnRlciArIDEKKworCitSRUZNT0RJTkRFWF9FTEVNRU5UUyA9ICgncmVmbW9kaW5kZXgnLCAncmVmYmltb2RpbmRleCcsCisgICAgICAgICAgICAgICAgICAgICAgICAncmVmZXhtb2RpbmRleCcsICdyZWZzdG1vZGluZGV4JykKKworZGVmIGZpeHVwX3JlZm1vZGluZGV4ZXMoZnJhZ21lbnQpOgorICAgICMgTG9jYXRlIDxyZWYqbW9kaW5kZXg+Li4uPC8+IGNvLWxvY2F0ZWQgd2l0aCA8bW9kdWxlPi4uLjwvPiwgYW5kCisgICAgIyByZW1vdmUgdGhlIDxyZWYqbW9kaW5kZXg+LCByZXBsYWNpbmcgaXQgd2l0aCBpbmRleD1pbmRleCBvbiB0aGUKKyAgICAjIDxtb2R1bGU+IGVsZW1lbnQuCisgICAgbm9kZXMgPSBmaW5kX2FsbF9lbGVtZW50c19mcm9tX3NldChmcmFnbWVudCwgUkVGTU9ESU5ERVhfRUxFTUVOVFMpCisgICAgZCA9IHt9CisgICAgZm9yIG5vZGUgaW4gbm9kZXM6CisgICAgICAgIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZQorICAgICAgICBkW3BhcmVudC5ub2RlX2lkXSA9IHBhcmVudAorICAgIGRlbCBub2RlcworICAgIG1hcChmaXh1cF9yZWZtb2RpbmRleGVzX2NodW5rLCBkLnZhbHVlcygpKQorCisKK2RlZiBmaXh1cF9yZWZtb2RpbmRleGVzX2NodW5rKGNvbnRhaW5lcik6CisgICAgIyBub2RlIGlzIHByb2JhYmx5IGEgPHBhcmE+OyBsZXQncyBzZWUgaG93IG9mdGVuIGl0IGlzbid0OgorICAgIGlmIGNvbnRhaW5lci50YWdOYW1lICE9IFBBUkFfRUxFTUVOVDoKKyAgICAgICAgYndyaXRlKCItLS0gZml4dXBfcmVmbW9kaW5kZXhlc19jaHVuayglcylcbiIgJSBjb250YWluZXIpCisgICAgbW9kdWxlX2VudHJpZXMgPSBmaW5kX2FsbF9lbGVtZW50cyhjb250YWluZXIsICJtb2R1bGUiKQorICAgIGlmIG5vdCBtb2R1bGVfZW50cmllczoKKyAgICAgICAgcmV0dXJuCisgICAgaW5kZXhfZW50cmllcyA9IGZpbmRfYWxsX2VsZW1lbnRzX2Zyb21fc2V0KGNvbnRhaW5lciwgUkVGTU9ESU5ERVhfRUxFTUVOVFMpCisgICAgcmVtb3ZlcyA9IFtdCisgICAgZm9yIGVudHJ5IGluIGluZGV4X2VudHJpZXM6CisgICAgICAgIGNoaWxkcmVuID0gZW50cnkuY2hpbGROb2RlcworICAgICAgICBpZiBsZW4oY2hpbGRyZW4pICE9IDA6CisgICAgICAgICAgICBid3JpdGUoIi0tLSB1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBmb3IgJXMgbm9kZTpcbiIKKyAgICAgICAgICAgICAgICAgICAlIGVudHJ5LnRhZ05hbWUpCisgICAgICAgICAgICBld3JpdGUoZW50cnkudG94bWwoKSArICJcbiIpCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBmb3VuZCA9IDAKKyAgICAgICAgbW9kdWxlX25hbWUgPSBlbnRyeS5nZXRBdHRyaWJ1dGUoIm1vZHVsZSIpCisgICAgICAgIGZvciBub2RlIGluIG1vZHVsZV9lbnRyaWVzOgorICAgICAgICAgICAgaWYgbGVuKG5vZGUuY2hpbGROb2RlcykgIT0gMToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgdGhpc19uYW1lID0gbm9kZS5jaGlsZE5vZGVzWzBdLmRhdGEKKyAgICAgICAgICAgIGlmIHRoaXNfbmFtZSA9PSBtb2R1bGVfbmFtZToKKyAgICAgICAgICAgICAgICBmb3VuZCA9IDEKKyAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgiaW5kZXgiLCAieWVzIikKKyAgICAgICAgaWYgZm91bmQ6CisgICAgICAgICAgICByZW1vdmVzLmFwcGVuZChlbnRyeSkKKyAgICBmb3Igbm9kZSBpbiByZW1vdmVzOgorICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQobm9kZSkKKworCitkZWYgZml4dXBfYmlmdW5jaW5kZXhlcyhmcmFnbWVudCk6CisgICAgbm9kZXMgPSBmaW5kX2FsbF9lbGVtZW50cyhmcmFnbWVudCwgJ2JpZnVuY2luZGV4JykKKyAgICBkID0ge30KKyAgICAjIG1ha2Ugc3VyZSB0aGF0IGVhY2ggcGFyZW50IGlzIG9ubHkgcHJvY2Vzc2VkIG9uY2U6CisgICAgZm9yIG5vZGUgaW4gbm9kZXM6CisgICAgICAgIHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZQorICAgICAgICBkW3BhcmVudC5ub2RlX2lkXSA9IHBhcmVudAorICAgIGRlbCBub2RlcworICAgIG1hcChmaXh1cF9iaWZ1bmNpbmRleGVzX2NodW5rLCBkLnZhbHVlcygpKQorCisKK2RlZiBmaXh1cF9iaWZ1bmNpbmRleGVzX2NodW5rKGNvbnRhaW5lcik6CisgICAgcmVtb3ZlcyA9IFtdCisgICAgZW50cmllcyA9IGZpbmRfYWxsX2NoaWxkX2VsZW1lbnRzKGNvbnRhaW5lciwgImJpZnVuY2luZGV4IikKKyAgICBmdW5jdGlvbl9lbnRyaWVzID0gZmluZF9hbGxfY2hpbGRfZWxlbWVudHMoY29udGFpbmVyLCAiZnVuY3Rpb24iKQorICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgorICAgICAgICBmdW5jdGlvbl9uYW1lID0gZW50cnkuZ2V0QXR0cmlidXRlKCJuYW1lIikKKyAgICAgICAgZm91bmQgPSAwCisgICAgICAgIGZvciBmdW5jX2VudHJ5IGluIGZ1bmN0aW9uX2VudHJpZXM6CisgICAgICAgICAgICB0MiA9IGZ1bmNfZW50cnkuY2hpbGROb2Rlc1swXS5kYXRhCisgICAgICAgICAgICBpZiB0MlstMjpdICE9ICIoKSI6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHQyID0gdDJbOi0yXQorICAgICAgICAgICAgaWYgdDIgPT0gZnVuY3Rpb25fbmFtZToKKyAgICAgICAgICAgICAgICBmdW5jX2VudHJ5LnNldEF0dHJpYnV0ZSgiaW5kZXgiLCAieWVzIikKKyAgICAgICAgICAgICAgICBmdW5jX2VudHJ5LnNldEF0dHJpYnV0ZSgibW9kdWxlIiwgIl9fYnVpbHRpbl9fIikKKyAgICAgICAgICAgICAgICBpZiBub3QgZm91bmQ6CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMQorICAgICAgICAgICAgICAgICAgICByZW1vdmVzLmFwcGVuZChlbnRyeSkKKyAgICBmb3IgZW50cnkgaW4gcmVtb3ZlczoKKyAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGVudHJ5KQorCisKK2RlZiBqb2luX2FkamFjZW50X2VsZW1lbnRzKGNvbnRhaW5lciwgZ2kpOgorICAgIHF1ZXVlID0gW2NvbnRhaW5lcl0KKyAgICB3aGlsZSBxdWV1ZToKKyAgICAgICAgcGFyZW50ID0gcXVldWUucG9wKCkKKyAgICAgICAgaSA9IDAKKyAgICAgICAgY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGROb2RlcworICAgICAgICBuY2hpbGRyZW4gPSBsZW4oY2hpbGRyZW4pCisgICAgICAgIHdoaWxlIGkgPCAobmNoaWxkcmVuIC0gMSk6CisgICAgICAgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldCisgICAgICAgICAgICBpZiBjaGlsZC5ub2RlTmFtZSA9PSBnaToKKyAgICAgICAgICAgICAgICBpZiBjaGlsZHJlbltpKzFdLm5vZGVOYW1lID09IGdpOgorICAgICAgICAgICAgICAgICAgICBld3JpdGUoIi0tLSBtZXJnaW5nIHR3byA8JXMvPiBlbGVtZW50c1xuIiAlIGdpKQorICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldCisgICAgICAgICAgICAgICAgICAgIG5leHRjaGlsZCA9IGNoaWxkcmVuW2krMV0KKyAgICAgICAgICAgICAgICAgICAgbmV4dGNoaWxkcmVuID0gbmV4dGNoaWxkLmNoaWxkTm9kZXMKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgbGVuKG5leHRjaGlsZHJlbik6CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV4dGNoaWxkcmVuWzBdCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Y2hpbGQucmVtb3ZlQ2hpbGQobm9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmFwcGVuZENoaWxkKG5vZGUpCisgICAgICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChuZXh0Y2hpbGQpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBjaGlsZC5ub2RlVHlwZSA9PSBFTEVNRU5UOgorICAgICAgICAgICAgICAgIHF1ZXVlLmFwcGVuZChjaGlsZCkKKyAgICAgICAgICAgIGkgPSBpICsgMQorCisKK190b2tlbl9yeCA9IHJlLmNvbXBpbGUociJbYS16QS1aXVthLXpBLVowLTkuLV0qJCIpCisKK2RlZiB3cml0ZV9lc2lzKGRvYywgb2ZwLCBrbm93bmVtcHR5KToKKyAgICBmb3Igbm9kZSBpbiBkb2MuY2hpbGROb2RlczoKKyAgICAgICAgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlCisgICAgICAgIGlmIG5vZGVUeXBlID09IEVMRU1FTlQ6CisgICAgICAgICAgICBnaSA9IG5vZGUudGFnTmFtZQorICAgICAgICAgICAgaWYga25vd25lbXB0eShnaSk6CisgICAgICAgICAgICAgICAgaWYgbm9kZS5oYXNDaGlsZE5vZGVzKCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImRlY2xhcmVkLWVtcHR5IG5vZGUgPCVzPiBoYXMgY2hpbGRyZW4iICUgZ2kKKyAgICAgICAgICAgICAgICBvZnAud3JpdGUoImVcbiIpCisgICAgICAgICAgICBmb3IgaywgdmFsdWUgaW4gbm9kZS5hdHRyaWJ1dGVzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgX3Rva2VuX3J4Lm1hdGNoKHZhbHVlKToKKyAgICAgICAgICAgICAgICAgICAgZHR5cGUgPSAiVE9LRU4iCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZHR5cGUgPSAiQ0RBVEEiCisgICAgICAgICAgICAgICAgb2ZwLndyaXRlKCJBJXMgJXMgJXNcbiIgJSAoaywgZHR5cGUsIGVzaXN0b29scy5lbmNvZGUodmFsdWUpKSkKKyAgICAgICAgICAgIG9mcC53cml0ZSgiKCVzXG4iICUgZ2kpCisgICAgICAgICAgICB3cml0ZV9lc2lzKG5vZGUsIG9mcCwga25vd25lbXB0eSkKKyAgICAgICAgICAgIG9mcC53cml0ZSgiKSVzXG4iICUgZ2kpCisgICAgICAgIGVsaWYgbm9kZVR5cGUgPT0gVEVYVDoKKyAgICAgICAgICAgIG9mcC53cml0ZSgiLSVzXG4iICUgZXNpc3Rvb2xzLmVuY29kZShub2RlLmRhdGEpKQorICAgICAgICBlbGlmIG5vZGVUeXBlID09IEVOVElUWV9SRUZFUkVOQ0U6CisgICAgICAgICAgICBvZnAud3JpdGUoIiYlc1xuIiAlIG5vZGUubm9kZU5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJ1bnN1cHBvcnRlZCBub2RlIHR5cGU6ICVzIiAlIG5vZGVUeXBlCisKKworZGVmIGNvbnZlcnQoaWZwLCBvZnApOgorICAgIGV2ZW50cyA9IGVzaXN0b29scy5wYXJzZShpZnApCisgICAgdG9rdHlwZSwgZG9jID0gZXZlbnRzLmdldEV2ZW50KCkKKyAgICBmcmFnbWVudCA9IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkKKyAgICBldmVudHMuZXhwYW5kTm9kZShmcmFnbWVudCkKKworICAgIG5vcm1hbGl6ZShmcmFnbWVudCkKKyAgICBzaW1wbGlmeShkb2MsIGZyYWdtZW50KQorICAgIGhhbmRsZV9sYWJlbHMoZG9jLCBmcmFnbWVudCkKKyAgICBoYW5kbGVfYXBwZW5kaXgoZG9jLCBmcmFnbWVudCkKKyAgICBmaXh1cF90cmFpbGluZ193aGl0ZXNwYWNlKGRvYywgeworICAgICAgICAiYWJzdHJhY3QiOiAiXG4iLAorICAgICAgICAidGl0bGUiOiAiIiwKKyAgICAgICAgImNoYXB0ZXIiOiAiXG5cbiIsCisgICAgICAgICJzZWN0aW9uIjogIlxuXG4iLAorICAgICAgICAic3Vic2VjdGlvbiI6ICJcblxuIiwKKyAgICAgICAgInN1YnN1YnNlY3Rpb24iOiAiXG5cbiIsCisgICAgICAgICJwYXJhZ3JhcGgiOiAiXG5cbiIsCisgICAgICAgICJzdWJwYXJhZ3JhcGgiOiAiXG5cbiIsCisgICAgICAgIH0pCisgICAgY2xlYW51cF9yb290X3RleHQoZG9jKQorICAgIGNsZWFudXBfdHJhaWxpbmdfcGFyZW5zKGZyYWdtZW50LCBbImZ1bmN0aW9uIiwgIm1ldGhvZCIsICJjZnVuY3Rpb24iXSkKKyAgICBjbGVhbnVwX3N5bm9wc2VzKGRvYywgZnJhZ21lbnQpCisgICAgZml4dXBfZGVzY3JpcHRvcnMoZG9jLCBmcmFnbWVudCkKKyAgICBmaXh1cF92ZXJiYXRpbXMoZnJhZ21lbnQpCisgICAgbm9ybWFsaXplKGZyYWdtZW50KQorICAgIGZpeHVwX3BhcmFzKGRvYywgZnJhZ21lbnQpCisgICAgZml4dXBfc2VjdGlvbmF1dGhvcnMoZG9jLCBmcmFnbWVudCkKKyAgICBmaXh1cF90YWJsZV9zdHJ1Y3R1cmVzKGRvYywgZnJhZ21lbnQpCisgICAgZml4dXBfcmZjX3JlZmVyZW5jZXMoZG9jLCBmcmFnbWVudCkKKyAgICBmaXh1cF9zaWduYXR1cmVzKGRvYywgZnJhZ21lbnQpCisgICAgYWRkX25vZGVfaWRzKGZyYWdtZW50KQorICAgIGZpeHVwX3JlZm1vZGluZGV4ZXMoZnJhZ21lbnQpCisgICAgZml4dXBfYmlmdW5jaW5kZXhlcyhmcmFnbWVudCkKKyAgICAjIFRha2UgY2FyZSBvZiB1Z2x5IGhhY2tzIGluIHRoZSBMYVRlWCBtYXJrdXAgdG8gYXZvaWQgTGFUZVggYW5kCisgICAgIyBMYVRlWDJIVE1MIHNjcmV3aW5nIHdpdGggR05VLXN0eWxlIGxvbmcgb3B0aW9ucyAodGhlICctLScgcHJvYmxlbSkuCisgICAgam9pbl9hZGphY2VudF9lbGVtZW50cyhmcmFnbWVudCwgIm9wdGlvbiIpCisgICAgIworICAgIGQgPSB7fQorICAgIGZvciBnaSBpbiBldmVudHMucGFyc2VyLmdldF9lbXB0aWVzKCk6CisgICAgICAgIGRbZ2ldID0gZ2kKKyAgICBpZiBkLmhhc19rZXkoImF1dGhvciIpOgorICAgICAgICBkZWwgZFsiYXV0aG9yIl0KKyAgICBpZiBkLmhhc19rZXkoInJmYyIpOgorICAgICAgICBkZWwgZFsicmZjIl0KKyAgICBrbm93bmVtcHR5ID0gZC5oYXNfa2V5CisgICAgIworICAgIHRyeToKKyAgICAgICAgd3JpdGVfZXNpcyhmcmFnbWVudCwgb2ZwLCBrbm93bmVtcHR5KQorICAgIGV4Y2VwdCBJT0Vycm9yLCAoZXJyLCBtc2cpOgorICAgICAgICAjIElnbm9yZSBFUElQRTsgaXQganVzdCBtZWFucyB0aGF0IHdob2V2ZXIgd2UncmUgd3JpdGluZyB0byBzdG9wcGVkCisgICAgICAgICMgcmVhZGluZy4gIFRoZSByZXN0IG9mIHRoZSBvdXRwdXQgd291bGQgYmUgaWdub3JlZC4gIEFsbCBvdGhlciBlcnJvcnMKKyAgICAgICAgIyBzaG91bGQgc3RpbGwgYmUgcmVwb3J0ZWQsCisgICAgICAgIGlmIGVyciAhPSBlcnJuby5FUElQRToKKyAgICAgICAgICAgIHJhaXNlCisKKworZGVmIG1haW4oKToKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID09IDE6CisgICAgICAgIGlmcCA9IHN5cy5zdGRpbgorICAgICAgICBvZnAgPSBzeXMuc3Rkb3V0CisgICAgZWxpZiBsZW4oc3lzLmFyZ3YpID09IDI6CisgICAgICAgIGlmcCA9IG9wZW4oc3lzLmFyZ3ZbMV0pCisgICAgICAgIG9mcCA9IHN5cy5zdGRvdXQKKyAgICBlbGlmIGxlbihzeXMuYXJndikgPT0gMzoKKyAgICAgICAgaWZwID0gb3BlbihzeXMuYXJndlsxXSkKKyAgICAgICAgaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIG9mcCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICBlbHNlOgorICAgICAgICB1c2FnZSgpCisgICAgICAgIHN5cy5leGl0KDIpCisgICAgY29udmVydChpZnAsIG9mcCkKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID09IDM6CisgICAgICAgIGZwID0gb3BlbihzeXMuYXJndlsyXSwgInciKQorICAgICAgICBmcC53cml0ZShvZnAuZ2V0dmFsdWUoKSkKKyAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBvZnAuY2xvc2UoKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvc2dtbGNvbnYvZXNpczJzZ21sLnB5IGIvZG9jL3Rvb2xzL3NnbWxjb252L2VzaXMyc2dtbC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YmRhOTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL3NnbWxjb252L2VzaXMyc2dtbC5weQpAQCAtMCwwICsxLDI2MyBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorCisiIiJDb252ZXJ0IEVTSVMgZXZlbnRzIHRvIFNHTUwgb3IgWE1MIG1hcmt1cC4KKworVGhpcyBpcyBsaW1pdGVkLCBidXQgc2VlbXMgc3VmZmljaWVudCBmb3IgdGhlIEVTSVMgZ2VuZXJhdGVkIGJ5IHRoZQorbGF0ZXgyZXNpcy5weSBzY3JpcHQgd2hlbiBydW4gb3ZlciB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24uCisiIiIKKworIyBUaGlzIHNob3VsZCBoYXZlIGFuIGV4cGxpY2l0IG9wdGlvbiB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSAqSU5QVVQqIHdhcworIyBnZW5lcmF0ZWQgZnJvbSBhbiBTR01MIG9yIGFuIFhNTCBhcHBsaWNhdGlvbi4KKworaW1wb3J0IGVycm5vCitpbXBvcnQgZXNpc3Rvb2xzCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN0cmluZworCitmcm9tIHhtbC5zYXguc2F4dXRpbHMgaW1wb3J0IGVzY2FwZQorCisKK0FVVE9DTE9TRSA9ICgpCisKK0VNUFRJRVNfRklMRU5BTUUgPSAiLi4vc2dtbC9lbXB0aWVzLmRhdCIKK0xJU1RfRU1QVElFUyA9IDAKKworCitfZWxlbV9tYXAgPSB7fQorX2F0dHJfbWFwID0ge30KK190b2tlbl9tYXAgPSB7fQorCitfbm9ybWFsaXplX2Nhc2UgPSBzdHIKKworZGVmIG1hcF9naShzZ21sZ2ksIG1hcCk6CisgICAgdW5jYXNlZCA9IF9ub3JtYWxpemVfY2FzZShzZ21sZ2kpCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gbWFwW3VuY2FzZWRdCisgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgIG1hcFt1bmNhc2VkXSA9IHNnbWxnaQorICAgICAgICByZXR1cm4gc2dtbGdpCisKK2RlZiBudWxsX21hcF9naShzZ21sZ2ksIG1hcCk6CisgICAgcmV0dXJuIHNnbWxnaQorCisKK2RlZiBmb3JtYXRfYXR0cnMoYXR0cnMsIHhtbD0wKToKKyAgICBhdHRycyA9IGF0dHJzLml0ZW1zKCkKKyAgICBhdHRycy5zb3J0KCkKKyAgICBwYXJ0cyA9IFtdCisgICAgYXBwZW5kID0gcGFydHMuYXBwZW5kCisgICAgZm9yIG5hbWUsIHZhbHVlIGluIGF0dHJzOgorICAgICAgICBpZiB4bWw6CisgICAgICAgICAgICBhcHBlbmQoJyVzPSIlcyInICUgKG5hbWUsIGVzY2FwZSh2YWx1ZSkpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyB0aGlzIGlzIGEgbGl0dGxlIGJvZ3VzLCBidXQgc2hvdWxkIGRvIGZvciBub3cKKyAgICAgICAgICAgIGlmIG5hbWUgPT0gdmFsdWUgYW5kIGlzbm10b2tlbih2YWx1ZSk6CisgICAgICAgICAgICAgICAgYXBwZW5kKHZhbHVlKQorICAgICAgICAgICAgZWxpZiBpc3Rva2VuKHZhbHVlKToKKyAgICAgICAgICAgICAgICBpZiB2YWx1ZSA9PSAibm8iICsgbmFtZToKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kKHZhbHVlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgiJXM9JXMiICUgKG5hbWUsIHZhbHVlKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXBwZW5kKCclcz0iJXMiJyAlIChuYW1lLCBlc2NhcGUodmFsdWUpKSkKKyAgICBpZiBwYXJ0czoKKyAgICAgICAgcGFydHMuaW5zZXJ0KDAsICcnKQorICAgIHJldHVybiBzdHJpbmcuam9pbihwYXJ0cykKKworCitfbm10b2tlbl9yeCA9IHJlLmNvbXBpbGUoIlthLXpdWy0uX2EtejAtOV0qJCIsIHJlLklHTk9SRUNBU0UpCitkZWYgaXNubXRva2VuKHMpOgorICAgIHJldHVybiBfbm10b2tlbl9yeC5tYXRjaChzKSBpcyBub3QgTm9uZQorCitfdG9rZW5fcnggPSByZS5jb21waWxlKCJbYS16MC05XVstLl9hLXowLTldKiQiLCByZS5JR05PUkVDQVNFKQorZGVmIGlzdG9rZW4ocyk6CisgICAgcmV0dXJuIF90b2tlbl9yeC5tYXRjaChzKSBpcyBub3QgTm9uZQorCisKK2RlZiBjb252ZXJ0KGlmcCwgb2ZwLCB4bWw9MCwgYXV0b2Nsb3NlPSgpLCB2ZXJiYXRpbXM9KCkpOgorICAgIGlmIHhtbDoKKyAgICAgICAgYXV0b2Nsb3NlID0gKCkKKyAgICBhdHRycyA9IHt9CisgICAgbGFzdG9wZW5lZCA9IE5vbmUKKyAgICBrbm93bmVtcHRpZXMgPSBbXQorICAgIGtub3duZW1wdHkgPSAwCisgICAgbGFzdGVtcHR5ID0gMAorICAgIGludmVyYmF0aW0gPSAwCisgICAgd2hpbGUgMToKKyAgICAgICAgbGluZSA9IGlmcC5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgYnJlYWsKKworICAgICAgICB0eXBlID0gbGluZVswXQorICAgICAgICBkYXRhID0gbGluZVsxOl0KKyAgICAgICAgaWYgZGF0YSBhbmQgZGF0YVstMV0gPT0gIlxuIjoKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhWzotMV0KKyAgICAgICAgaWYgdHlwZSA9PSAiLSI6CisgICAgICAgICAgICBkYXRhID0gZXNpc3Rvb2xzLmRlY29kZShkYXRhKQorICAgICAgICAgICAgZGF0YSA9IGVzY2FwZShkYXRhKQorICAgICAgICAgICAgaWYgbm90IGludmVyYmF0aW06CisgICAgICAgICAgICAgICAgZGF0YSA9IHN0cmluZy5yZXBsYWNlKGRhdGEsICItLS0iLCAiJm1kYXNoOyIpCisgICAgICAgICAgICBvZnAud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIGlmICJcbiIgaW4gZGF0YToKKyAgICAgICAgICAgICAgICBsYXN0b3BlbmVkID0gTm9uZQorICAgICAgICAgICAga25vd25lbXB0eSA9IDAKKyAgICAgICAgICAgIGxhc3RlbXB0eSA9IDAKKyAgICAgICAgZWxpZiB0eXBlID09ICIoIjoKKyAgICAgICAgICAgIGlmIGRhdGEgPT0gIkNPTU1FTlQiOgorICAgICAgICAgICAgICAgIG9mcC53cml0ZSgiPCEtLSIpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGRhdGEgPSBtYXBfZ2koZGF0YSwgX2VsZW1fbWFwKQorICAgICAgICAgICAgaWYga25vd25lbXB0eSBhbmQgeG1sOgorICAgICAgICAgICAgICAgIG9mcC53cml0ZSgiPCVzJXMvPiIgJSAoZGF0YSwgZm9ybWF0X2F0dHJzKGF0dHJzLCB4bWwpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb2ZwLndyaXRlKCI8JXMlcz4iICUgKGRhdGEsIGZvcm1hdF9hdHRycyhhdHRycywgeG1sKSkpCisgICAgICAgICAgICBpZiBrbm93bmVtcHR5IGFuZCBkYXRhIG5vdCBpbiBrbm93bmVtcHRpZXM6CisgICAgICAgICAgICAgICAgIyBhY2N1bXVsYXRlIGtub3dsZWRnZSEKKyAgICAgICAgICAgICAgICBrbm93bmVtcHRpZXMuYXBwZW5kKGRhdGEpCisgICAgICAgICAgICBhdHRycyA9IHt9CisgICAgICAgICAgICBsYXN0b3BlbmVkID0gZGF0YQorICAgICAgICAgICAgbGFzdGVtcHR5ID0ga25vd25lbXB0eQorICAgICAgICAgICAga25vd25lbXB0eSA9IDAKKyAgICAgICAgICAgIGludmVyYmF0aW0gPSBkYXRhIGluIHZlcmJhdGltcworICAgICAgICBlbGlmIHR5cGUgPT0gIikiOgorICAgICAgICAgICAgaWYgZGF0YSA9PSAiQ09NTUVOVCI6CisgICAgICAgICAgICAgICAgb2ZwLndyaXRlKCItLT4iKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBkYXRhID0gbWFwX2dpKGRhdGEsIF9lbGVtX21hcCkKKyAgICAgICAgICAgIGlmIHhtbDoKKyAgICAgICAgICAgICAgICBpZiBub3QgbGFzdGVtcHR5OgorICAgICAgICAgICAgICAgICAgICBvZnAud3JpdGUoIjwvJXM+IiAlIGRhdGEpCisgICAgICAgICAgICBlbGlmIGRhdGEgbm90IGluIGtub3duZW1wdGllczoKKyAgICAgICAgICAgICAgICBpZiBkYXRhIGluIGF1dG9jbG9zZToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsaWYgbGFzdG9wZW5lZCA9PSBkYXRhOgorICAgICAgICAgICAgICAgICAgICBvZnAud3JpdGUoIjwvPiIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgb2ZwLndyaXRlKCI8LyVzPiIgJSBkYXRhKQorICAgICAgICAgICAgbGFzdG9wZW5lZCA9IE5vbmUKKyAgICAgICAgICAgIGxhc3RlbXB0eSA9IDAKKyAgICAgICAgICAgIGludmVyYmF0aW0gPSAwCisgICAgICAgIGVsaWYgdHlwZSA9PSAiQSI6CisgICAgICAgICAgICBuYW1lLCB0eXBlLCB2YWx1ZSA9IHN0cmluZy5zcGxpdChkYXRhLCAiICIsIDIpCisgICAgICAgICAgICBuYW1lID0gbWFwX2dpKG5hbWUsIF9hdHRyX21hcCkKKyAgICAgICAgICAgIGF0dHJzW25hbWVdID0gZXNpc3Rvb2xzLmRlY29kZSh2YWx1ZSkKKyAgICAgICAgZWxpZiB0eXBlID09ICJlIjoKKyAgICAgICAgICAgIGtub3duZW1wdHkgPSAxCisgICAgICAgIGVsaWYgdHlwZSA9PSAiJiI6CisgICAgICAgICAgICBvZnAud3JpdGUoIiYlczsiICUgZGF0YSkKKyAgICAgICAgICAgIGtub3duZW1wdHkgPSAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJ1bnJlY29nbml6ZWQgRVNJUyBldmVudCB0eXBlOiAnJXMnIiAlIHR5cGUKKworICAgIGlmIExJU1RfRU1QVElFUzoKKyAgICAgICAgZHVtcF9lbXB0eV9lbGVtZW50X25hbWVzKGtub3duZW1wdGllcykKKworCitkZWYgZHVtcF9lbXB0eV9lbGVtZW50X25hbWVzKGtub3duZW1wdGllcyk6CisgICAgZCA9IHt9CisgICAgZm9yIGdpIGluIGtub3duZW1wdGllczoKKyAgICAgICAgZFtnaV0gPSBnaQorICAgIGtub3duZW1wdGllcy5hcHBlbmQoIiIpCisgICAgaWYgb3MucGF0aC5pc2ZpbGUoRU1QVElFU19GSUxFTkFNRSk6CisgICAgICAgIGZwID0gb3BlbihFTVBUSUVTX0ZJTEVOQU1FKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBnaSA9IHN0cmluZy5zdHJpcChsaW5lKQorICAgICAgICAgICAgaWYgZ2k6CisgICAgICAgICAgICAgICAgZFtnaV0gPSBnaQorICAgIGZwID0gb3BlbihFTVBUSUVTX0ZJTEVOQU1FLCAidyIpCisgICAgZ2lsaXN0ID0gZC5rZXlzKCkKKyAgICBnaWxpc3Quc29ydCgpCisgICAgZnAud3JpdGUoc3RyaW5nLmpvaW4oZ2lsaXN0LCAiXG4iKSkKKyAgICBmcC53cml0ZSgiXG4iKQorICAgIGZwLmNsb3NlKCkKKworCitkZWYgdXBkYXRlX2dpX21hcChtYXAsIG5hbWVzLCBmcm9tc2dtbD0xKToKKyAgICBmb3IgbmFtZSBpbiBzdHJpbmcuc3BsaXQobmFtZXMsICIsIik6CisgICAgICAgIGlmIGZyb21zZ21sOgorICAgICAgICAgICAgdW5jYXNlZCA9IHN0cmluZy5sb3dlcihuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdW5jYXNlZCA9IG5hbWUKKyAgICAgICAgbWFwW3VuY2FzZWRdID0gbmFtZQorCisKK2RlZiBtYWluKCk6CisgICAgaW1wb3J0IGdldG9wdAorICAgIGltcG9ydCBzeXMKKyAgICAjCisgICAgYXV0b2Nsb3NlID0gQVVUT0NMT1NFCisgICAgeG1sID0gMQorICAgIHhtbGRlY2wgPSAwCisgICAgZWxlbV9uYW1lcyA9ICcnCisgICAgYXR0cl9uYW1lcyA9ICcnCisgICAgdmFsdWVfbmFtZXMgPSAnJworICAgIHZlcmJhdGltcyA9ICgndmVyYmF0aW0nLCAnaW50ZXJhY3RpdmUtc2Vzc2lvbicpCisgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAiYWRlc3giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiYXV0b2Nsb3NlPSIsICJkZWNsYXJlIiwgInNnbWwiLCAieG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVsZW1lbnRzLW1hcD0iLCAiYXR0cmlidXRlcy1tYXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWVzLW1hcD0iXSkKKyAgICBmb3Igb3B0LCBhcmcgaW4gb3B0czoKKyAgICAgICAgaWYgb3B0IGluICgiLWQiLCAiLS1kZWNsYXJlIik6CisgICAgICAgICAgICB4bWxkZWNsID0gMQorICAgICAgICBlbGlmIG9wdCA9PSAiLWUiOgorICAgICAgICAgICAgZ2xvYmFsIExJU1RfRU1QVElFUworICAgICAgICAgICAgTElTVF9FTVBUSUVTID0gMQorICAgICAgICBlbGlmIG9wdCBpbiAoIi1zIiwgIi0tc2dtbCIpOgorICAgICAgICAgICAgeG1sID0gMAorICAgICAgICBlbGlmIG9wdCBpbiAoIi14IiwgIi0teG1sIik6CisgICAgICAgICAgICB4bWwgPSAxCisgICAgICAgIGVsaWYgb3B0IGluICgiLWEiLCAiLS1hdXRvY2xvc2UiKToKKyAgICAgICAgICAgIGF1dG9jbG9zZSA9IHN0cmluZy5zcGxpdChhcmcsICIsIikKKyAgICAgICAgZWxpZiBvcHQgPT0gIi0tZWxlbWVudHMtbWFwIjoKKyAgICAgICAgICAgIGVsZW1fbmFtZXMgPSAoIiVzLCVzIiAlIChlbGVtX25hbWVzLCBhcmcpKVsxOl0KKyAgICAgICAgZWxpZiBvcHQgPT0gIi0tYXR0cmlidXRlcy1tYXAiOgorICAgICAgICAgICAgYXR0cl9uYW1lcyA9ICgiJXMsJXMiICUgKGF0dHJfbmFtZXMsIGFyZykpWzE6XQorICAgICAgICBlbGlmIG9wdCA9PSAiLS12YWx1ZXMtbWFwIjoKKyAgICAgICAgICAgIHZhbHVlX25hbWVzID0gKCIlcywlcyIgJSAodmFsdWVfbmFtZXMsIGFyZykpWzE6XQorICAgICMKKyAgICAjIG9wZW4gaW5wdXQgc3RyZWFtczoKKyAgICAjCisgICAgaWYgbGVuKGFyZ3MpID09IDA6CisgICAgICAgIGlmcCA9IHN5cy5zdGRpbgorICAgICAgICBvZnAgPSBzeXMuc3Rkb3V0CisgICAgZWxpZiBsZW4oYXJncykgPT0gMToKKyAgICAgICAgaWZwID0gb3BlbihhcmdzWzBdKQorICAgICAgICBvZnAgPSBzeXMuc3Rkb3V0CisgICAgZWxpZiBsZW4oYXJncykgPT0gMjoKKyAgICAgICAgaWZwID0gb3BlbihhcmdzWzBdKQorICAgICAgICBvZnAgPSBvcGVuKGFyZ3NbMV0sICJ3IikKKyAgICBlbHNlOgorICAgICAgICB1c2FnZSgpCisgICAgICAgIHN5cy5leGl0KDIpCisgICAgIworICAgICMgc2V0dXAgdGhlIG5hbWUgbWFwczoKKyAgICAjCisgICAgaWYgZWxlbV9uYW1lcyBvciBhdHRyX25hbWVzIG9yIHZhbHVlX25hbWVzOgorICAgICAgICAjIGFzc3VtZSB0aGUgb3JpZ2luIHdhcyBTR01MOyBpZ25vcmUgY2FzZSBvZiB0aGUgbmFtZXMgZnJvbSB0aGUgRVNJUworICAgICAgICAjIHN0cmVhbSBidXQgc2V0IHVwIGNvbnZlcnNpb24gdGFibGVzIHRvIGdldCB0aGUgY2FzZSByaWdodCBvbiBvdXRwdXQKKyAgICAgICAgZ2xvYmFsIF9ub3JtYWxpemVfY2FzZQorICAgICAgICBfbm9ybWFsaXplX2Nhc2UgPSBzdHJpbmcubG93ZXIKKyAgICAgICAgdXBkYXRlX2dpX21hcChfZWxlbV9tYXAsIHN0cmluZy5zcGxpdChlbGVtX25hbWVzLCAiLCIpKQorICAgICAgICB1cGRhdGVfZ2lfbWFwKF9hdHRyX21hcCwgc3RyaW5nLnNwbGl0KGF0dHJfbmFtZXMsICIsIikpCisgICAgICAgIHVwZGF0ZV9naV9tYXAoX3ZhbHVlc19tYXAsIHN0cmluZy5zcGxpdCh2YWx1ZV9uYW1lcywgIiwiKSkKKyAgICBlbHNlOgorICAgICAgICBnbG9iYWwgbWFwX2dpCisgICAgICAgIG1hcF9naSA9IG51bGxfbWFwX2dpCisgICAgIworICAgICMgcnVuIHRoZSBjb252ZXJzaW9uOgorICAgICMKKyAgICB0cnk6CisgICAgICAgIGlmIHhtbCBhbmQgeG1sZGVjbDoKKyAgICAgICAgICAgIG9wZi53cml0ZSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvODg1OS0xIj8+XG4nKQorICAgICAgICBjb252ZXJ0KGlmcCwgb2ZwLCB4bWw9eG1sLCBhdXRvY2xvc2U9YXV0b2Nsb3NlLCB2ZXJiYXRpbXM9dmVyYmF0aW1zKQorICAgIGV4Y2VwdCBJT0Vycm9yLCAoZXJyLCBtc2cpOgorICAgICAgICBpZiBlcnIgIT0gZXJybm8uRVBJUEU6CisgICAgICAgICAgICByYWlzZQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvc2dtbGNvbnYvZXNpc3Rvb2xzLnB5IGIvZG9jL3Rvb2xzL3NnbWxjb252L2VzaXN0b29scy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTNhZjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL3NnbWxjb252L2VzaXN0b29scy5weQpAQCAtMCwwICsxLDMwOSBAQAorIiIiTWlzY2VsbGFuZW91cyB1dGlsaXR5IGZ1bmN0aW9ucyB1c2VmdWwgZm9yIGRlYWxpbmcgd2l0aCBFU0lTIHN0cmVhbXMuIiIiCisKK2ltcG9ydCByZQoraW1wb3J0IHN0cmluZworCitpbXBvcnQgeG1sLmRvbS5wdWxsZG9tCisKK2ltcG9ydCB4bWwuc2F4CitpbXBvcnQgeG1sLnNheC5oYW5kbGVyCitpbXBvcnQgeG1sLnNheC54bWxyZWFkZXIKKworCitfZGF0YV9tYXRjaCA9IHJlLmNvbXBpbGUociJbXlxcXVteXFxdKiIpLm1hdGNoCisKK2RlZiBkZWNvZGUocyk6CisgICAgciA9ICcnCisgICAgd2hpbGUgczoKKyAgICAgICAgbSA9IF9kYXRhX21hdGNoKHMpCisgICAgICAgIGlmIG06CisgICAgICAgICAgICByID0gciArIG0uZ3JvdXAoKQorICAgICAgICAgICAgcyA9IHNbbS5lbmQoKTpdCisgICAgICAgIGVsaWYgc1sxXSA9PSAiXFwiOgorICAgICAgICAgICAgciA9IHIgKyAiXFwiCisgICAgICAgICAgICBzID0gc1syOl0KKyAgICAgICAgZWxpZiBzWzFdID09ICJuIjoKKyAgICAgICAgICAgIHIgPSByICsgIlxuIgorICAgICAgICAgICAgcyA9IHNbMjpdCisgICAgICAgIGVsaWYgc1sxXSA9PSAiJSI6CisgICAgICAgICAgICBzID0gc1syOl0KKyAgICAgICAgICAgIG4sIHMgPSBzLnNwbGl0KCI7IiwgMSkKKyAgICAgICAgICAgIHIgPSByICsgdW5pY2hyKGludChuKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJjYW4ndCBoYW5kbGUgIiArIGBzYAorICAgIHJldHVybiByCisKKworX2NoYXJtYXAgPSB7fQorZm9yIGMgaW4gbWFwKGNociwgcmFuZ2UoMjU2KSk6CisgICAgX2NoYXJtYXBbY10gPSBjCitfY2hhcm1hcFsiXG4iXSA9IHIiXG4iCitfY2hhcm1hcFsiXFwiXSA9IHIiXFwiCitkZWwgYworCitfbnVsbF9qb2luID0gJycuam9pbgorZGVmIGVuY29kZShzKToKKyAgICByZXR1cm4gX251bGxfam9pbihtYXAoX2NoYXJtYXAuZ2V0LCBzKSkKKworCitjbGFzcyBFU0lTUmVhZGVyKHhtbC5zYXgueG1scmVhZGVyLlhNTFJlYWRlcik6CisgICAgIiIiU0FYIFJlYWRlciB3aGljaCByZWFkcyBmcm9tIGFuIEVTSVMgc3RyZWFtLgorCisgICAgTm8gdmVyaWZpY2F0aW9uIG9mIHRoZSBkb2N1bWVudCBzdHJ1Y3R1cmUgaXMgcGVyZm9ybWVkIGJ5IHRoZQorICAgIHJlYWRlcjsgYSBnZW5lcmFsIHZlcmlmaWVyIGNvdWxkIGJlIHVzZWQgYXMgdGhlIHRhcmdldAorICAgIENvbnRlbnRIYW5kbGVyIGluc3RhbmNlLgorCisgICAgIiIiCisgICAgX2RlY2xfaGFuZGxlciA9IE5vbmUKKyAgICBfbGV4aWNhbF9oYW5kbGVyID0gTm9uZQorCisgICAgX3B1YmxpY19pZCA9IE5vbmUKKyAgICBfc3lzdGVtX2lkID0gTm9uZQorCisgICAgX2J1ZmZlciA9ICIiCisgICAgX2lzX2VtcHR5ID0gMAorICAgIF9saW5lbm8gPSAwCisgICAgX3N0YXJ0ZWQgPSAwCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29udGVudEhhbmRsZXI9Tm9uZSwgZXJyb3JIYW5kbGVyPU5vbmUpOgorICAgICAgICB4bWwuc2F4LnhtbHJlYWRlci5YTUxSZWFkZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5fYXR0cnMgPSB7fQorICAgICAgICBzZWxmLl9hdHRyaWJ1dGVzID0gQXR0cmlidXRlcyhzZWxmLl9hdHRycykKKyAgICAgICAgc2VsZi5fbG9jYXRvciA9IExvY2F0b3IoKQorICAgICAgICBzZWxmLl9lbXB0aWVzID0ge30KKyAgICAgICAgaWYgY29udGVudEhhbmRsZXI6CisgICAgICAgICAgICBzZWxmLnNldENvbnRlbnRIYW5kbGVyKGNvbnRlbnRIYW5kbGVyKQorICAgICAgICBpZiBlcnJvckhhbmRsZXI6CisgICAgICAgICAgICBzZWxmLnNldEVycm9ySGFuZGxlcihlcnJvckhhbmRsZXIpCisKKyAgICBkZWYgZ2V0X2VtcHRpZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9lbXB0aWVzLmtleXMoKQorCisgICAgIworICAgICMgIFhNTFJlYWRlciBpbnRlcmZhY2UKKyAgICAjCisKKyAgICBkZWYgcGFyc2Uoc2VsZiwgc291cmNlKToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisgICAgICAgIHNlbGYuX2xvY2F0b3IuX3B1YmxpY19pZCA9IHNvdXJjZS5nZXRQdWJsaWNJZCgpCisgICAgICAgIHNlbGYuX2xvY2F0b3IuX3N5c3RlbV9pZCA9IHNvdXJjZS5nZXRTeXN0ZW1JZCgpCisgICAgICAgIGZwID0gc291cmNlLmdldEJ5dGVTdHJlYW0oKQorICAgICAgICBoYW5kbGVyID0gc2VsZi5nZXRDb250ZW50SGFuZGxlcigpCisgICAgICAgIGlmIGhhbmRsZXI6CisgICAgICAgICAgICBoYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICBsaW5lbm8gPSAwCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB0b2tlbiwgZGF0YSA9IHNlbGYuX2dldF90b2tlbihmcCkKKyAgICAgICAgICAgIGlmIHRva2VuIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGxpbmVubyA9IGxpbmVubyArIDEKKyAgICAgICAgICAgIHNlbGYuX2xvY2F0b3IuX2xpbmVubyA9IGxpbmVubworICAgICAgICAgICAgc2VsZi5faGFuZGxlX3Rva2VuKHRva2VuLCBkYXRhKQorICAgICAgICBoYW5kbGVyID0gc2VsZi5nZXRDb250ZW50SGFuZGxlcigpCisgICAgICAgIGlmIGhhbmRsZXI6CisgICAgICAgICAgICBoYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKQorCisgICAgZGVmIGZlZWQoc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9zdGFydGVkOgorICAgICAgICAgICAgaGFuZGxlciA9IHNlbGYuZ2V0Q29udGVudEhhbmRsZXIoKQorICAgICAgICAgICAgaWYgaGFuZGxlcjoKKyAgICAgICAgICAgICAgICBoYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICAgICAgc2VsZi5fc3RhcnRlZCA9IDEKKyAgICAgICAgZGF0YSA9IHNlbGYuX2J1ZmZlciArIGRhdGEKKyAgICAgICAgc2VsZi5fYnVmZmVyID0gTm9uZQorICAgICAgICBsaW5lcyA9IGRhdGEuc3BsaXQoIlxuIikKKyAgICAgICAgaWYgbGluZXM6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lc1s6LTFdOgorICAgICAgICAgICAgICAgIHNlbGYuX2xpbmVubyA9IHNlbGYuX2xpbmVubyArIDEKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2NhdG9yLl9saW5lbm8gPSBzZWxmLl9saW5lbm8KKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICAgICAgZSA9IHhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRVNJUyBpbnB1dCBsaW5lIGNvbnRhaW5zIG5vIHRva2VuIHR5cGUgbWFyayIsCisgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCBzZWxmLl9sb2NhdG9yKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmdldEVycm9ySGFuZGxlcigpLmVycm9yKGUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlX3Rva2VuKGxpbmVbMF0sIGxpbmVbMTpdKQorICAgICAgICAgICAgc2VsZi5fYnVmZmVyID0gbGluZXNbLTFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9idWZmZXIgPSAiIgorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBoYW5kbGVyID0gc2VsZi5nZXRDb250ZW50SGFuZGxlcigpCisgICAgICAgIGlmIGhhbmRsZXI6CisgICAgICAgICAgICBoYW5kbGVyLmVuZERvY3VtZW50KCkKKyAgICAgICAgc2VsZi5fYnVmZmVyID0gIiIKKworICAgIGRlZiBfZ2V0X3Rva2VuKHNlbGYsIGZwKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIGU6CisgICAgICAgICAgICBlID0gU0FYRXhjZXB0aW9uKCJJL08gZXJyb3IgcmVhZGluZyBpbnB1dCBzdHJlYW0iLCBlKQorICAgICAgICAgICAgc2VsZi5nZXRFcnJvckhhbmRsZXIoKS5mYXRhbEVycm9yKGUpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQorICAgICAgICBpZiBsaW5lWy0xXSA9PSAiXG4iOgorICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0xXQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIGUgPSB4bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJFU0lTIGlucHV0IGxpbmUgY29udGFpbnMgbm8gdG9rZW4gdHlwZSBtYXJrIiwKKyAgICAgICAgICAgICAgICBOb25lLCBzZWxmLl9sb2NhdG9yKQorICAgICAgICAgICAgc2VsZi5nZXRFcnJvckhhbmRsZXIoKS5lcnJvcihlKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHJldHVybiBsaW5lWzBdLCBsaW5lWzE6XQorCisgICAgZGVmIF9oYW5kbGVfdG9rZW4oc2VsZiwgdG9rZW4sIGRhdGEpOgorICAgICAgICBoYW5kbGVyID0gc2VsZi5nZXRDb250ZW50SGFuZGxlcigpCisgICAgICAgIGlmIHRva2VuID09ICctJzoKKyAgICAgICAgICAgIGlmIGRhdGEgYW5kIGhhbmRsZXI6CisgICAgICAgICAgICAgICAgaGFuZGxlci5jaGFyYWN0ZXJzKGRlY29kZShkYXRhKSkKKyAgICAgICAgZWxpZiB0b2tlbiA9PSAnKSc6CisgICAgICAgICAgICBpZiBoYW5kbGVyOgorICAgICAgICAgICAgICAgIGhhbmRsZXIuZW5kRWxlbWVudChkZWNvZGUoZGF0YSkpCisgICAgICAgIGVsaWYgdG9rZW4gPT0gJygnOgorICAgICAgICAgICAgaWYgc2VsZi5faXNfZW1wdHk6CisgICAgICAgICAgICAgICAgc2VsZi5fZW1wdGllc1tkYXRhXSA9IDEKKyAgICAgICAgICAgIGlmIGhhbmRsZXI6CisgICAgICAgICAgICAgICAgaGFuZGxlci5zdGFydEVsZW1lbnQoZGF0YSwgc2VsZi5fYXR0cmlidXRlcykKKyAgICAgICAgICAgIHNlbGYuX2F0dHJzLmNsZWFyKCkKKyAgICAgICAgICAgIHNlbGYuX2lzX2VtcHR5ID0gMAorICAgICAgICBlbGlmIHRva2VuID09ICdBJzoKKyAgICAgICAgICAgIG5hbWUsIHZhbHVlID0gZGF0YS5zcGxpdCgnICcsIDEpCisgICAgICAgICAgICBpZiB2YWx1ZSAhPSAiSU1QTElFRCI6CisgICAgICAgICAgICAgICAgdHlwZSwgdmFsdWUgPSB2YWx1ZS5zcGxpdCgnICcsIDEpCisgICAgICAgICAgICAgICAgc2VsZi5fYXR0cnNbbmFtZV0gPSAoZGVjb2RlKHZhbHVlKSwgdHlwZSkKKyAgICAgICAgZWxpZiB0b2tlbiA9PSAnJic6CisgICAgICAgICAgICAjIGVudGl0eSByZWZlcmVuY2UgaW4gU0FYPworICAgICAgICAgICAgcGFzcworICAgICAgICBlbGlmIHRva2VuID09ICc/JzoKKyAgICAgICAgICAgIGlmIGhhbmRsZXI6CisgICAgICAgICAgICAgICAgaWYgJyAnIGluIGRhdGE6CisgICAgICAgICAgICAgICAgICAgIHRhcmdldCwgZGF0YSA9IHN0cmluZy5zcGxpdChkYXRhLCBOb25lLCAxKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHRhcmdldCwgZGF0YSA9IGRhdGEsICIiCisgICAgICAgICAgICAgICAgaGFuZGxlci5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0LCBkZWNvZGUoZGF0YSkpCisgICAgICAgIGVsaWYgdG9rZW4gPT0gJ04nOgorICAgICAgICAgICAgaGFuZGxlciA9IHNlbGYuZ2V0RFRESGFuZGxlcigpCisgICAgICAgICAgICBpZiBoYW5kbGVyOgorICAgICAgICAgICAgICAgIGhhbmRsZXIubm90YXRpb25EZWNsKGRhdGEsIHNlbGYuX3B1YmxpY19pZCwgc2VsZi5fc3lzdGVtX2lkKQorICAgICAgICAgICAgc2VsZi5fcHVibGljX2lkID0gTm9uZQorICAgICAgICAgICAgc2VsZi5fc3lzdGVtX2lkID0gTm9uZQorICAgICAgICBlbGlmIHRva2VuID09ICdwJzoKKyAgICAgICAgICAgIHNlbGYuX3B1YmxpY19pZCA9IGRlY29kZShkYXRhKQorICAgICAgICBlbGlmIHRva2VuID09ICdzJzoKKyAgICAgICAgICAgIHNlbGYuX3N5c3RlbV9pZCA9IGRlY29kZShkYXRhKQorICAgICAgICBlbGlmIHRva2VuID09ICdlJzoKKyAgICAgICAgICAgIHNlbGYuX2lzX2VtcHR5ID0gMQorICAgICAgICBlbGlmIHRva2VuID09ICdDJzoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGUgPSBTQVhQYXJzZUV4Y2VwdGlvbigidW5rbm93biBFU0lTIHRva2VuIGluIGV2ZW50IHN0cmVhbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgc2VsZi5fbG9jYXRvcikKKyAgICAgICAgICAgIHNlbGYuZ2V0RXJyb3JIYW5kbGVyKCkuZXJyb3IoZSkKKworICAgIGRlZiBzZXRDb250ZW50SGFuZGxlcihzZWxmLCBoYW5kbGVyKToKKyAgICAgICAgb2xkID0gc2VsZi5nZXRDb250ZW50SGFuZGxlcigpCisgICAgICAgIGlmIG9sZDoKKyAgICAgICAgICAgIG9sZC5zZXREb2N1bWVudExvY2F0b3IoTm9uZSkKKyAgICAgICAgaWYgaGFuZGxlcjoKKyAgICAgICAgICAgIGhhbmRsZXIuc2V0RG9jdW1lbnRMb2NhdG9yKHNlbGYuX2xvY2F0b3IpCisgICAgICAgIHhtbC5zYXgueG1scmVhZGVyLlhNTFJlYWRlci5zZXRDb250ZW50SGFuZGxlcihzZWxmLCBoYW5kbGVyKQorCisgICAgZGVmIGdldFByb3BlcnR5KHNlbGYsIHByb3BlcnR5KToKKyAgICAgICAgaWYgcHJvcGVydHkgPT0geG1sLnNheC5oYW5kbGVyLnByb3BlcnR5X2xleGljYWxfaGFuZGxlcjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9sZXhpY2FsX2hhbmRsZXIKKworICAgICAgICBlbGlmIHByb3BlcnR5ID09IHhtbC5zYXguaGFuZGxlci5wcm9wZXJ0eV9kZWNsYXJhdGlvbl9oYW5kbGVyOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RlY2xfaGFuZGxlcgorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSB4bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24oInVua25vd24gcHJvcGVydHkgJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBgcHJvcGVydHlgKQorCisgICAgZGVmIHNldFByb3BlcnR5KHNlbGYsIHByb3BlcnR5LCB2YWx1ZSk6CisgICAgICAgIGlmIHByb3BlcnR5ID09IHhtbC5zYXguaGFuZGxlci5wcm9wZXJ0eV9sZXhpY2FsX2hhbmRsZXI6CisgICAgICAgICAgICBpZiBzZWxmLl9sZXhpY2FsX2hhbmRsZXI6CisgICAgICAgICAgICAgICAgc2VsZi5fbGV4aWNhbF9oYW5kbGVyLnNldERvY3VtZW50TG9jYXRvcihOb25lKQorICAgICAgICAgICAgaWYgdmFsdWU6CisgICAgICAgICAgICAgICAgdmFsdWUuc2V0RG9jdW1lbnRMb2NhdG9yKHNlbGYuX2xvY2F0b3IpCisgICAgICAgICAgICBzZWxmLl9sZXhpY2FsX2hhbmRsZXIgPSB2YWx1ZQorCisgICAgICAgIGVsaWYgcHJvcGVydHkgPT0geG1sLnNheC5oYW5kbGVyLnByb3BlcnR5X2RlY2xhcmF0aW9uX2hhbmRsZXI6CisgICAgICAgICAgICBpZiBzZWxmLl9kZWNsX2hhbmRsZXI6CisgICAgICAgICAgICAgICAgc2VsZi5fZGVjbF9oYW5kbGVyLnNldERvY3VtZW50TG9jYXRvcihOb25lKQorICAgICAgICAgICAgaWYgdmFsdWU6CisgICAgICAgICAgICAgICAgdmFsdWUuc2V0RG9jdW1lbnRMb2NhdG9yKHNlbGYuX2xvY2F0b3IpCisgICAgICAgICAgICBzZWxmLl9kZWNsX2hhbmRsZXIgPSB2YWx1ZQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSB4bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24oKQorCisgICAgZGVmIGdldEZlYXR1cmUoc2VsZiwgZmVhdHVyZSk6CisgICAgICAgIGlmIGZlYXR1cmUgPT0geG1sLnNheC5oYW5kbGVyLmZlYXR1cmVfbmFtZXNwYWNlczoKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4geG1sLnNheC54bWxyZWFkZXIuWE1MUmVhZGVyLmdldEZlYXR1cmUoc2VsZiwgZmVhdHVyZSkKKworICAgIGRlZiBzZXRGZWF0dXJlKHNlbGYsIGZlYXR1cmUsIGVuYWJsZWQpOgorICAgICAgICBpZiBmZWF0dXJlID09IHhtbC5zYXguaGFuZGxlci5mZWF0dXJlX25hbWVzcGFjZXM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB4bWwuc2F4LnhtbHJlYWRlci5YTUxSZWFkZXIuc2V0RmVhdHVyZShzZWxmLCBmZWF0dXJlLCBlbmFibGVkKQorCisKK2NsYXNzIEF0dHJpYnV0ZXMoeG1sLnNheC54bWxyZWFkZXIuQXR0cmlidXRlc0ltcGwpOgorICAgICMgc2VsZi5fYXR0cnMgaGFzIHRoZSBmb3JtIHtuYW1lOiAodmFsdWUsIHR5cGUpfQorCisgICAgZGVmIGdldFR5cGUoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9hdHRyc1tuYW1lXVsxXQorCisgICAgZGVmIGdldFZhbHVlKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnNbbmFtZV1bMF0KKworICAgIGRlZiBnZXRWYWx1ZUJ5UU5hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9hdHRyc1tuYW1lXVswXQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnNbbmFtZV1bMF0KKworICAgIGRlZiBnZXQoc2VsZiwgbmFtZSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5fYXR0cnMuaGFzX2tleShuYW1lKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9hdHRyc1tuYW1lXVswXQorICAgICAgICByZXR1cm4gZGVmYXVsdAorCisgICAgZGVmIGl0ZW1zKHNlbGYpOgorICAgICAgICBMID0gW10KKyAgICAgICAgZm9yIG5hbWUsICh2YWx1ZSwgdHlwZSkgaW4gc2VsZi5fYXR0cnMuaXRlbXMoKToKKyAgICAgICAgICAgIEwuYXBwZW5kKChuYW1lLCB2YWx1ZSkpCisgICAgICAgIHJldHVybiBMCisKKyAgICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICAgICBMID0gW10KKyAgICAgICAgZm9yIHZhbHVlLCB0eXBlIGluIHNlbGYuX2F0dHJzLnZhbHVlcygpOgorICAgICAgICAgICAgTC5hcHBlbmQodmFsdWUpCisgICAgICAgIHJldHVybiBMCisKKworY2xhc3MgTG9jYXRvcih4bWwuc2F4LnhtbHJlYWRlci5Mb2NhdG9yKToKKyAgICBfbGluZW5vID0gLTEKKyAgICBfcHVibGljX2lkID0gTm9uZQorICAgIF9zeXN0ZW1faWQgPSBOb25lCisKKyAgICBkZWYgZ2V0TGluZU51bWJlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xpbmVubworCisgICAgZGVmIGdldFB1YmxpY0lkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHVibGljX2lkCisKKyAgICBkZWYgZ2V0U3lzdGVtSWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9zeXN0ZW1faWQKKworCitkZWYgcGFyc2Uoc3RyZWFtX29yX3N0cmluZywgcGFyc2VyPU5vbmUpOgorICAgIGlmIHR5cGUoc3RyZWFtX29yX3N0cmluZykgaW4gW3R5cGUoIiIpLCB0eXBlKHUiIildOgorICAgICAgICBzdHJlYW0gPSBvcGVuKHN0cmVhbV9vcl9zdHJpbmcpCisgICAgZWxzZToKKyAgICAgICAgc3RyZWFtID0gc3RyZWFtX29yX3N0cmluZworICAgIGlmIG5vdCBwYXJzZXI6CisgICAgICAgIHBhcnNlciA9IEVTSVNSZWFkZXIoKQorICAgIHJldHVybiB4bWwuZG9tLnB1bGxkb20uRE9NRXZlbnRTdHJlYW0oc3RyZWFtLCBwYXJzZXIsICgyICoqIDE0KSAtIDIwKQpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL3NnbWxjb252L2xhdGV4MmVzaXMucHkgYi9kb2MvdG9vbHMvc2dtbGNvbnYvbGF0ZXgyZXNpcy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NGUxZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL3NnbWxjb252L2xhdGV4MmVzaXMucHkKQEAgLTAsMCArMSw1NTUgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworIiIiR2VuZXJhdGUgRVNJUyBldmVudHMgYmFzZWQgb24gYSBMYVRlWCBzb3VyY2UgZG9jdW1lbnQgYW5kCitjb25maWd1cmF0aW9uIGRhdGEuCisKK1RoZSBjb252ZXJzaW9uIGlzIG5vdCBzdHJvbmcgZW5vdWdoIHRvIHdvcmsgd2l0aCBhcmJpdHJhcnkgTGFUZVgKK2RvY3VtZW50czsgaXQgaGFzIG9ubHkgYmVlbiBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIGhpZ2hseSBzdHlsaXplZAorbWFya3VwIHVzZWQgaW4gdGhlIHN0YW5kYXJkIFB5dGhvbiBkb2N1bWVudGF0aW9uLiAgQSBsb3Qgb2YKK2luZm9ybWF0aW9uIGFib3V0IHNwZWNpZmljIG1hcmt1cCBpcyBlbmNvZGVkIGluIHRoZSBjb250cm9sIHRhYmxlCitwYXNzZWQgdG8gdGhlIGNvbnZlcnQoKSBmdW5jdGlvbjsgY2hhbmdpbmcgdGhpcyB0YWJsZSBjYW4gYWxsb3cgdGhpcwordG9vbCB0byBzdXBwb3J0IGFkZGl0aW9uYWwgTGFUZVggbWFya3Vwcy4KKworVGhlIGZvcm1hdCBvZiB0aGUgdGFibGUgaXMgbGFyZ2VseSB1bmRvY3VtZW50ZWQ7IHNlZSB0aGUgY29tbWVudGVkCitoZWFkZXJzIHdoZXJlIHRoZSB0YWJsZSBpcyBzcGVjaWZpZWQgaW4gbWFpbigpLiAgVGhlcmUgaXMgbm8gcHJvdmlzaW9uIAordG8gbG9hZCBhbiBhbHRlcm5hdGUgdGFibGUgZnJvbSBhbiBleHRlcm5hbCBmaWxlLgorIiIiCisKK2ltcG9ydCBlcnJubworaW1wb3J0IGdldG9wdAoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCBzeXMKK2ltcG9ydCBVc2VyTGlzdAoraW1wb3J0IHhtbC5zYXguc2F4dXRpbHMKKworZnJvbSB0eXBlcyBpbXBvcnQgTGlzdFR5cGUsIFN0cmluZ1R5cGUsIFR1cGxlVHlwZQorCit0cnk6CisgICAgZnJvbSB4bWwucGFyc2Vycy54bWxsaWIgaW1wb3J0IFhNTFBhcnNlcgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20geG1sbGliIGltcG9ydCBYTUxQYXJzZXIKKworCitmcm9tIGVzaXN0b29scyBpbXBvcnQgZW5jb2RlCisKKworREVCVUcgPSAwCisKKworY2xhc3MgTGFUZVhGb3JtYXRFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitjbGFzcyBMYVRlWFN0YWNrRXJyb3IoTGFUZVhGb3JtYXRFcnJvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvdW5kLCBzdGFjayk6CisgICAgICAgIG1zZyA9ICJlbnZpcm9ubWVudCBjbG9zZSBmb3IgJXMgZG9lc24ndCBtYXRjaDtcbiAgc3RhY2sgPSAlcyIgXAorICAgICAgICAgICAgICAlIChmb3VuZCwgc3RhY2spCisgICAgICAgIHNlbGYuZm91bmQgPSBmb3VuZAorICAgICAgICBzZWxmLnN0YWNrID0gc3RhY2tbOl0KKyAgICAgICAgTGFUZVhGb3JtYXRFcnJvci5fX2luaXRfXyhzZWxmLCBtc2cpCisKKwwKK19iZWdpbl9lbnZfcnggPSByZS5jb21waWxlKHIiW1xcXWJlZ2lueyhbXn1dKil9IikKK19lbmRfZW52X3J4ID0gcmUuY29tcGlsZShyIltcXF1lbmR7KFtefV0qKX0iKQorX2JlZ2luX21hY3JvX3J4ID0gcmUuY29tcGlsZShyIltcXF0oW2EtekEtWl0rWypdPykgPyh7fFxzKlxuPykiKQorX2NvbW1lbnRfcnggPSByZS5jb21waWxlKCIlKyA/KC4qKVxuWyBcdF0qIikKK190ZXh0X3J4ID0gcmUuY29tcGlsZShyIlteXX4lXFx7fV0rIikKK19vcHRpb25hbF9yeCA9IHJlLmNvbXBpbGUociJccypbW10oW15dXSopW11dIikKKyMgX3BhcmFtZXRlcl9yeCBpcyB0aGlzIGNvbXBsaWNhdGVkIHRvIGFsbG93IHsuLi59IGluc2lkZSBhIHBhcmFtZXRlcjsKKyMgdGhpcyBpcyB1c2VmdWwgdG8gbWF0Y2ggdGFidWxhciBsYXlvdXQgc3BlY2lmaWNhdGlvbnMgbGlrZSB7Y3xwezI0cHR9fQorX3BhcmFtZXRlcl9yeCA9IHJlLmNvbXBpbGUoIlsgXG5dKnsoKFtee319XXx7W159XSp9KSopfSIpCitfdG9rZW5fcnggPSByZS5jb21waWxlKHIiW2EtekEtWl1bYS16QS1aMC05Li1dKiQiKQorX3N0YXJ0X2dyb3VwX3J4ID0gcmUuY29tcGlsZSgiWyBcbl0qeyIpCitfc3RhcnRfb3B0aW9uYWxfcnggPSByZS5jb21waWxlKCJbIFxuXSpbW10iKQorCisKK0VTQ0FQRURfQ0hBUlMgPSAiJCUjXiB7fSZ+IgorCisKK2RlZiBkYmdtc2cobXNnKToKKyAgICBpZiBERUJVRzoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZShtc2cgKyAiXG4iKQorCitkZWYgcHVzaGluZyhuYW1lLCBwb2ludCwgZGVwdGgpOgorICAgIGRiZ21zZygicHVzaGluZyA8JXM+IGF0ICVzIiAlIChuYW1lLCBwb2ludCkpCisKK2RlZiBwb3BwaW5nKG5hbWUsIHBvaW50LCBkZXB0aCk6CisgICAgZGJnbXNnKCJwb3BwaW5nIDwvJXM+IGF0ICVzIiAlIChuYW1lLCBwb2ludCkpCisKKworY2xhc3MgX1N0YWNrKFVzZXJMaXN0LlVzZXJMaXN0KToKKyAgICBkZWYgYXBwZW5kKHNlbGYsIGVudHJ5KToKKyAgICAgICAgaWYgdHlwZShlbnRyeSkgaXMgbm90IFN0cmluZ1R5cGU6CisgICAgICAgICAgICByYWlzZSBMYVRlWEZvcm1hdEVycm9yKCJjYW5ub3QgcHVzaCBub24tc3RyaW5nIG9uIHN0YWNrOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYGVudHJ5YCkKKyAgICAgICAgI2RiZ21zZygiJXM8JXM+IiAlICgiICIqbGVuKHNlbGYuZGF0YSksIGVudHJ5KSkKKyAgICAgICAgc2VsZi5kYXRhLmFwcGVuZChlbnRyeSkKKworICAgIGRlZiBwb3Aoc2VsZiwgaW5kZXg9LTEpOgorICAgICAgICBlbnRyeSA9IHNlbGYuZGF0YVtpbmRleF0KKyAgICAgICAgZGVsIHNlbGYuZGF0YVtpbmRleF0KKyAgICAgICAgI2RiZ21zZygiJXM8LyVzPiIgJSAoIiAiKmxlbihzZWxmLmRhdGEpLCBlbnRyeSkpCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICBlbnRyeSA9IHNlbGYuZGF0YVtpbmRleF0KKyAgICAgICAgZGVsIHNlbGYuZGF0YVtpbmRleF0KKyAgICAgICAgI2RiZ21zZygiJXM8LyVzPiIgJSAoIiAiKmxlbihzZWxmLmRhdGEpLCBlbnRyeSkpCisKKworZGVmIG5ld19zdGFjaygpOgorICAgIGlmIERFQlVHOgorICAgICAgICByZXR1cm4gX1N0YWNrKCkKKyAgICByZXR1cm4gW10KKworDAorY2xhc3MgQ29udmVyc2lvbjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaWZwLCBvZnAsIHRhYmxlKToKKyAgICAgICAgc2VsZi53cml0ZSA9IG9mcC53cml0ZQorICAgICAgICBzZWxmLm9mcCA9IG9mcAorICAgICAgICBzZWxmLnRhYmxlID0gdGFibGUKKyAgICAgICAgc2VsZi5saW5lID0gc3RyaW5nLmpvaW4obWFwKHN0cmluZy5yc3RyaXAsIGlmcC5yZWFkbGluZXMoKSksICJcbiIpCisgICAgICAgIHNlbGYucHJlYW1ibGUgPSAxCisKKyAgICBkZWYgY29udmVydChzZWxmKToKKyAgICAgICAgc2VsZi5zdWJjb252ZXJ0KCkKKworICAgIGRlZiBzdWJjb252ZXJ0KHNlbGYsIGVuZGNoYXI9Tm9uZSwgZGVwdGg9MCk6CisgICAgICAgICMKKyAgICAgICAgIyBQYXJzZXMgY29udGVudCwgaW5jbHVkaW5nIHN1Yi1zdHJ1Y3R1cmVzLCB1bnRpbCB0aGUgY2hhcmFjdGVyCisgICAgICAgICMgJ2VuZGNoYXInIGlzIGZvdW5kICh3aXRoIG5vIG9wZW4gc3RydWN0dXJlcyksIG9yIHVudGlsIHRoZSBlbmQKKyAgICAgICAgIyBvZiB0aGUgaW5wdXQgZGF0YSBpcyBlbmRjaGFyIGlzIE5vbmUuCisgICAgICAgICMKKyAgICAgICAgc3RhY2sgPSBuZXdfc3RhY2soKQorICAgICAgICBsaW5lID0gc2VsZi5saW5lCisgICAgICAgIHdoaWxlIGxpbmU6CisgICAgICAgICAgICBpZiBsaW5lWzBdID09IGVuZGNoYXIgYW5kIG5vdCBzdGFjazoKKyAgICAgICAgICAgICAgICBzZWxmLmxpbmUgPSBsaW5lCisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUKKyAgICAgICAgICAgIG0gPSBfY29tbWVudF9yeC5tYXRjaChsaW5lKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICB0ZXh0ID0gbS5ncm91cCgxKQorICAgICAgICAgICAgICAgIGlmIHRleHQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIihDT01NRU5UXG4tICVzIFxuKUNPTU1FTlRcbi1cXG5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIGVuY29kZSh0ZXh0KSkKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZVttLmVuZCgpOl0KKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbSA9IF9iZWdpbl9lbnZfcngubWF0Y2gobGluZSkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgbmFtZSA9IG0uZ3JvdXAoMSkKKyAgICAgICAgICAgICAgICBlbnRyeSA9IHNlbGYuZ2V0X2Vudl9lbnRyeShuYW1lKQorICAgICAgICAgICAgICAgICMgcmUtd3JpdGUgdG8gdXNlIHRoZSBtYWNybyBoYW5kbGVyCisgICAgICAgICAgICAgICAgbGluZSA9IHIiXCVzICVzIiAlIChuYW1lLCBsaW5lW20uZW5kKCk6XSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbSA9IF9lbmRfZW52X3J4Lm1hdGNoKGxpbmUpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgICMgZW5kIG9mIGVudmlyb25tZW50CisgICAgICAgICAgICAgICAgZW52bmFtZSA9IG0uZ3JvdXAoMSkKKyAgICAgICAgICAgICAgICBlbnRyeSA9IHNlbGYuZ2V0X2VudHJ5KGVudm5hbWUpCisgICAgICAgICAgICAgICAgd2hpbGUgc3RhY2sgYW5kIGVudm5hbWUgIT0gc3RhY2tbLTFdIFwKKyAgICAgICAgICAgICAgICAgICAgICBhbmQgc3RhY2tbLTFdIGluIGVudHJ5LmVuZGNsb3NlczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiKSVzXG4iICUgc3RhY2sucG9wKCkpCisgICAgICAgICAgICAgICAgaWYgc3RhY2sgYW5kIGVudm5hbWUgPT0gc3RhY2tbLTFdOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIpJXNcbiIgJSBlbnRyeS5vdXRwdXRuYW1lKQorICAgICAgICAgICAgICAgICAgICBkZWwgc3RhY2tbLTFdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgTGFUZVhTdGFja0Vycm9yKGVudm5hbWUsIHN0YWNrKQorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lW20uZW5kKCk6XQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBtID0gX2JlZ2luX21hY3JvX3J4Lm1hdGNoKGxpbmUpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgICMgc3RhcnQgb2YgbWFjcm8KKyAgICAgICAgICAgICAgICBtYWNyb25hbWUgPSBtLmdyb3VwKDEpCisgICAgICAgICAgICAgICAgaWYgbWFjcm9uYW1lID09ICJjIjoKKyAgICAgICAgICAgICAgICAgICAgIyBVZ2ghICBUaGlzIGlzIGEgY29tYmluaW5nIGNoYXJhY3Rlci4uLgorICAgICAgICAgICAgICAgICAgICBlbmRwb3MgPSBtLmVuZCgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29tYmluaW5nX2NoYXIoImMiLCBsaW5lW2VuZHBvc10pCisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lW2VuZHBvcyArIDE6XQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVudHJ5ID0gc2VsZi5nZXRfZW50cnkobWFjcm9uYW1lKQorICAgICAgICAgICAgICAgIGlmIGVudHJ5LnZlcmJhdGltOgorICAgICAgICAgICAgICAgICAgICAjIG1hZ2ljIGNhc2UhCisgICAgICAgICAgICAgICAgICAgIHBvcyA9IHN0cmluZy5maW5kKGxpbmUsICJcXGVuZHslc30iICUgbWFjcm9uYW1lKQorICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gbGluZVttLmVuZCgxKTpwb3NdCisgICAgICAgICAgICAgICAgICAgIHN0YWNrLmFwcGVuZChlbnRyeS5uYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIoJXNcbiIgJSBlbnRyeS5vdXRwdXRuYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCItJXNcbiIgJSBlbmNvZGUodGV4dCkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIiklc1xuIiAlIGVudHJ5Lm91dHB1dG5hbWUpCisgICAgICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lW3BvcyArIGxlbigiXFxlbmR7JXN9IiAlIG1hY3JvbmFtZSk6XQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHdoaWxlIHN0YWNrIGFuZCBzdGFja1stMV0gaW4gZW50cnkuY2xvc2VzOgorICAgICAgICAgICAgICAgICAgICB0b3AgPSBzdGFjay5wb3AoKQorICAgICAgICAgICAgICAgICAgICB0b3BlbnRyeSA9IHNlbGYuZ2V0X2VudHJ5KHRvcCkKKyAgICAgICAgICAgICAgICAgICAgaWYgdG9wZW50cnkub3V0cHV0bmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIiklc1xuLVxcblxuIiAlIHRvcGVudHJ5Lm91dHB1dG5hbWUpCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgIGlmIGVudHJ5Lm91dHB1dG5hbWU6CisgICAgICAgICAgICAgICAgICAgIGlmIGVudHJ5LmVtcHR5OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiZVxuIikKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgcGFyYW1zLCBvcHRpb25hbCwgZW1wdHksIGVudmlyb24gPSBzZWxmLnN0YXJ0X21hY3JvKG1hY3JvbmFtZSkKKyAgICAgICAgICAgICAgICAjIHJpcCBvZmYgdGhlIG1hY3JvbmFtZQorICAgICAgICAgICAgICAgIGlmIHBhcmFtczoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbbS5lbmQoMSk6XQorICAgICAgICAgICAgICAgIGVsaWYgZW1wdHk6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lW20uZW5kKDEpOl0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVttLmVuZCgpOl0KKyAgICAgICAgICAgICAgICBvcGVuZWQgPSAwCisgICAgICAgICAgICAgICAgaW1wbGllZF9jb250ZW50ID0gMAorCisgICAgICAgICAgICAgICAgIyBoYW5kbGUgYXR0cmlidXRlIG1hcHBpbmdzIGhlcmU6CisgICAgICAgICAgICAgICAgZm9yIHBlbnRyeSBpbiBwYXJhbXM6CisgICAgICAgICAgICAgICAgICAgIGlmIHBlbnRyeS50eXBlID09ICJhdHRyaWJ1dGUiOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGVudHJ5Lm9wdGlvbmFsOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBfb3B0aW9uYWxfcngubWF0Y2gobGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBtIGFuZCBlbnRyeS5vdXRwdXRuYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVttLmVuZCgpOl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kdW1wX2F0dHIocGVudHJ5LCBtLmdyb3VwKDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBwZW50cnkudGV4dCBhbmQgZW50cnkub3V0cHV0bmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHZhbHVlIHN1cHBsaWVkIGJ5IGNvbnZlcnNpb24gc3BlYzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmR1bXBfYXR0cihwZW50cnksIHBlbnRyeS50ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gX3BhcmFtZXRlcl9yeC5tYXRjaChsaW5lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBMYVRlWEZvcm1hdEVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBleHRyYWN0IHBhcmFtZXRlciAlcyBmb3IgJXM6ICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAocGVudHJ5Lm5hbWUsIG1hY3JvbmFtZSwgYGxpbmVbOjEwMF1gKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBlbnRyeS5vdXRwdXRuYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmR1bXBfYXR0cihwZW50cnksIG0uZ3JvdXAoMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbbS5lbmQoKTpdCisgICAgICAgICAgICAgICAgICAgIGVsaWYgcGVudHJ5LnR5cGUgPT0gImNoaWxkIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBlbnRyeS5vcHRpb25hbDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gX29wdGlvbmFsX3J4Lm1hdGNoKGxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbbS5lbmQoKTpdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVudHJ5Lm91dHB1dG5hbWUgYW5kIG5vdCBvcGVuZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWQgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIoJXNcbiIgJSBlbnRyeS5vdXRwdXRuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2suYXBwZW5kKG1hY3JvbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2suYXBwZW5kKHBlbnRyeS5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIoJXNcbiIgJSBwZW50cnkubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiLSVzXG4iICUgZW5jb2RlKG0uZ3JvdXAoMSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIpJXNcbiIgJSBwZW50cnkubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZW50cnkub3V0cHV0bmFtZSBhbmQgbm90IG9wZW5lZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmVkID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIoJXNcbiIgJSBlbnRyeS5vdXRwdXRuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5hcHBlbmQoZW50cnkubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIoJXNcbiIgJSBwZW50cnkubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5hcHBlbmQocGVudHJ5Lm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lID0gc2tpcF93aGl0ZShsaW5lKVsxOl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5zdWJjb252ZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSIsIGxlbihzdGFjaykgKyBkZXB0aCArIDEpWzE6XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIiklc1xuIiAlIHN0YWNrLnBvcCgpKQorICAgICAgICAgICAgICAgICAgICBlbGlmIHBlbnRyeS50eXBlID09ICJjb250ZW50IjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBlbnRyeS5pbXBsaWVkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpZWRfY29udGVudCA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZW50cnkub3V0cHV0bmFtZSBhbmQgbm90IG9wZW5lZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmVkID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIoJXNcbiIgJSBlbnRyeS5vdXRwdXRuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5hcHBlbmQoZW50cnkubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gc2tpcF93aGl0ZShsaW5lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmVbMF0gIT0gInsiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBMYVRlWEZvcm1hdEVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pc3NpbmcgY29udGVudCBmb3IgIiArIG1hY3JvbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmUgPSBsaW5lWzE6XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBzZWxmLnN1YmNvbnZlcnQoIn0iLCBsZW4oc3RhY2spICsgZGVwdGggKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUgYW5kIGxpbmVbMF0gPT0gIn0iOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVsxOl0KKyAgICAgICAgICAgICAgICAgICAgZWxpZiBwZW50cnkudHlwZSA9PSAidGV4dCIgYW5kIHBlbnRyeS50ZXh0OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZW50cnkub3V0cHV0bmFtZSBhbmQgbm90IG9wZW5lZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWQgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2suYXBwZW5kKGVudHJ5Lm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiKCVzXG4iICUgZW50cnkub3V0cHV0bmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICNkYmdtc2coIi0tLSB0ZXh0OiAlcyIgJSBgcGVudHJ5LnRleHRgKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiLSVzXG4iICUgZW5jb2RlKHBlbnRyeS50ZXh0KSkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBwZW50cnkudHlwZSA9PSAiZW50aXR5cmVmIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIiYlc1xuIiAlIHBlbnRyeS5uYW1lKQorICAgICAgICAgICAgICAgIGlmIGVudHJ5Lm91dHB1dG5hbWU6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcGVuZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIoJXNcbiIgJSBlbnRyeS5vdXRwdXRuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2suYXBwZW5kKGVudHJ5Lm5hbWUpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpbXBsaWVkX2NvbnRlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIpJXNcbiIgJSBlbnRyeS5vdXRwdXRuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbGluZVswXSA9PSBlbmRjaGFyIGFuZCBub3Qgc3RhY2s6CisgICAgICAgICAgICAgICAgc2VsZi5saW5lID0gbGluZVsxOl0KKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5saW5lCisgICAgICAgICAgICBpZiBsaW5lWzBdID09ICJ9IjoKKyAgICAgICAgICAgICAgICAjIGVuZCBvZiBtYWNybyBvciBncm91cAorICAgICAgICAgICAgICAgIG1hY3JvbmFtZSA9IHN0YWNrWy0xXQorICAgICAgICAgICAgICAgIGlmIG1hY3JvbmFtZToKKyAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiA9IHNlbGYudGFibGVbbWFjcm9uYW1lXQorICAgICAgICAgICAgICAgICAgICBpZiBjb252ZXJzaW9uLm91dHB1dG5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSwgaXQgd2FzIGp1c3QgYSBiYXJlIGdyb3VwCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIpJXNcbiIgJSBjb252ZXJzaW9uLm91dHB1dG5hbWUpCisgICAgICAgICAgICAgICAgZGVsIHN0YWNrWy0xXQorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzE6XQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBsaW5lWzBdID09ICJ+IjoKKyAgICAgICAgICAgICAgICAjIGRvbid0IHdvcnJ5IGFib3V0IHRoZSAidGllIiBhc3BlY3Qgb2YgdGhpcyBjb21tYW5kCisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbMTpdCisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiLSBcbiIpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGxpbmVbMF0gPT0gInsiOgorICAgICAgICAgICAgICAgIHN0YWNrLmFwcGVuZCgiIikKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZVsxOl0KKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbGluZVswXSA9PSAiXFwiIGFuZCBsaW5lWzFdIGluIEVTQ0FQRURfQ0hBUlM6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiLSVzXG4iICUgZW5jb2RlKGxpbmVbMV0pKQorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzI6XQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBsaW5lWzoyXSA9PSByIlxcIjoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIoQlJFQUtcbilCUkVBS1xuIikKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZVsyOl0KKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbGluZVs6Ml0gPT0gciJcXyI6CisgICAgICAgICAgICAgICAgbGluZSA9ICJfIiArIGxpbmVbMjpdCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGxpbmVbOjJdIGluIChyIlwnIiwgcidcIicpOgorICAgICAgICAgICAgICAgICMgY29tYmluaW5nIGNoYXJhY3RlcnMuLi4KKyAgICAgICAgICAgICAgICBzZWxmLmNvbWJpbmluZ19jaGFyKGxpbmVbMV0sIGxpbmVbMl0pCisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbMzpdCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG0gPSBfdGV4dF9yeC5tYXRjaChsaW5lKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICB0ZXh0ID0gZW5jb2RlKG0uZ3JvdXAoKSkKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCItJXNcbiIgJSB0ZXh0KQorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lW20uZW5kKCk6XQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAjIHNwZWNpYWwgY2FzZSBiZWNhdXNlIG9mIFxpdGVtW10KKyAgICAgICAgICAgICMgWFhYIGNhbiB3ZSBheGUgdGhpcz8/PworICAgICAgICAgICAgaWYgbGluZVswXSA9PSAiXSI6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiLV1cbiIpCisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbMTpdCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICMgYXZvaWQgaW5maW5pdGUgbG9vcHMKKyAgICAgICAgICAgIGV4dHJhID0gIiIKKyAgICAgICAgICAgIGlmIGxlbihsaW5lKSA+IDEwMDoKKyAgICAgICAgICAgICAgICBleHRyYSA9ICIuLi4iCisgICAgICAgICAgICByYWlzZSBMYVRlWEZvcm1hdEVycm9yKCJjb3VsZCBub3QgaWRlbnRpZnkgbWFya3VwOiAlcyVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChgbGluZVs6MTAwXWAsIGV4dHJhKSkKKyAgICAgICAgd2hpbGUgc3RhY2s6CisgICAgICAgICAgICBlbnRyeSA9IHNlbGYuZ2V0X2VudHJ5KHN0YWNrWy0xXSkKKyAgICAgICAgICAgIGlmIGVudHJ5LmNsb3NlczoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIpJXNcbi0lc1xuIiAlIChlbnRyeS5vdXRwdXRuYW1lLCBlbmNvZGUoIlxuIikpKQorICAgICAgICAgICAgICAgIGRlbCBzdGFja1stMV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgc3RhY2s6CisgICAgICAgICAgICByYWlzZSBMYVRlWEZvcm1hdEVycm9yKCJlbGVtZW50cyByZW1haW4gb24gc3RhY2s6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmcuam9pbihzdGFjaywgIiwgIikpCisgICAgICAgICMgb3RoZXJ3aXNlIHdlIGp1c3QgcmFuIG91dCBvZiBpbnB1dCBoZXJlLi4uCisKKyAgICAjIFRoaXMgaXMgYSByZWFsbHkgbGltaXRlZCB0YWJsZSBvZiBjb21iaW5hdGlvbnMsIGJ1dCBpdCB3aWxsIGhhdmUKKyAgICAjIHRvIGRvIGZvciBub3cuCisgICAgX2NvbWJpbmF0aW9ucyA9IHsKKyAgICAgICAgKCJjIiwgImMiKTogMHgwMEU3LAorICAgICAgICAoIiciLCAiZSIpOiAweDAwRTksCisgICAgICAgICgnIicsICJvIik6IDB4MDBGNiwKKyAgICAgICAgfQorCisgICAgZGVmIGNvbWJpbmluZ19jaGFyKHNlbGYsIHByZWZpeCwgY2hhcik6CisgICAgICAgIG9yZGluYWwgPSBzZWxmLl9jb21iaW5hdGlvbnNbKHByZWZpeCwgY2hhcildCisgICAgICAgIHNlbGYud3JpdGUoIi1cXCUlJWQ7XG4iICUgb3JkaW5hbCkKKworICAgIGRlZiBzdGFydF9tYWNybyhzZWxmLCBuYW1lKToKKyAgICAgICAgY29udmVyc2lvbiA9IHNlbGYuZ2V0X2VudHJ5KG5hbWUpCisgICAgICAgIHBhcmFtZXRlcnMgPSBjb252ZXJzaW9uLnBhcmFtZXRlcnMKKyAgICAgICAgb3B0aW9uYWwgPSBwYXJhbWV0ZXJzIGFuZCBwYXJhbWV0ZXJzWzBdLm9wdGlvbmFsCisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzLCBvcHRpb25hbCwgY29udmVyc2lvbi5lbXB0eSwgY29udmVyc2lvbi5lbnZpcm9ubWVudAorCisgICAgZGVmIGdldF9lbnRyeShzZWxmLCBuYW1lKToKKyAgICAgICAgZW50cnkgPSBzZWxmLnRhYmxlLmdldChuYW1lKQorICAgICAgICBpZiBlbnRyeSBpcyBOb25lOgorICAgICAgICAgICAgZGJnbXNnKCJnZXRfZW50cnkoJXMpIGZhaWxpbmc7IGJ1aWxkaW5nIGRlZmF1bHQgZW50cnkhIiAlIGBuYW1lYCkKKyAgICAgICAgICAgICMgbm90IGRlZmluZWQ7IGJ1aWxkIGEgZGVmYXVsdCBlbnRyeToKKyAgICAgICAgICAgIGVudHJ5ID0gVGFibGVFbnRyeShuYW1lKQorICAgICAgICAgICAgZW50cnkuaGFzX2NvbnRlbnQgPSAxCisgICAgICAgICAgICBlbnRyeS5wYXJhbWV0ZXJzLmFwcGVuZChQYXJhbWV0ZXIoImNvbnRlbnQiKSkKKyAgICAgICAgICAgIHNlbGYudGFibGVbbmFtZV0gPSBlbnRyeQorICAgICAgICByZXR1cm4gZW50cnkKKworICAgIGRlZiBnZXRfZW52X2VudHJ5KHNlbGYsIG5hbWUpOgorICAgICAgICBlbnRyeSA9IHNlbGYudGFibGUuZ2V0KG5hbWUpCisgICAgICAgIGlmIGVudHJ5IGlzIE5vbmU6CisgICAgICAgICAgICAjIG5vdCBkZWZpbmVkOyBidWlsZCBhIGRlZmF1bHQgZW50cnk6CisgICAgICAgICAgICBlbnRyeSA9IFRhYmxlRW50cnkobmFtZSwgMSkKKyAgICAgICAgICAgIGVudHJ5Lmhhc19jb250ZW50ID0gMQorICAgICAgICAgICAgZW50cnkucGFyYW1ldGVycy5hcHBlbmQoUGFyYW1ldGVyKCJjb250ZW50IikpCisgICAgICAgICAgICBlbnRyeS5wYXJhbWV0ZXJzWy0xXS5pbXBsaWVkID0gMQorICAgICAgICAgICAgc2VsZi50YWJsZVtuYW1lXSA9IGVudHJ5CisgICAgICAgIGVsaWYgbm90IGVudHJ5LmVudmlyb25tZW50OgorICAgICAgICAgICAgcmFpc2UgTGFUZVhGb3JtYXRFcnJvcigKKyAgICAgICAgICAgICAgICBuYW1lICsgIiBpcyBkZWZpbmVkIGFzIGEgbWFjcm87IGV4cGVjdGVkIGVudmlyb25tZW50IikKKyAgICAgICAgcmV0dXJuIGVudHJ5CisKKyAgICBkZWYgZHVtcF9hdHRyKHNlbGYsIHBlbnRyeSwgdmFsdWUpOgorICAgICAgICBpZiBub3QgKHBlbnRyeS5uYW1lIGFuZCB2YWx1ZSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgX3Rva2VuX3J4Lm1hdGNoKHZhbHVlKToKKyAgICAgICAgICAgIGR0eXBlID0gIlRPS0VOIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZHR5cGUgPSAiQ0RBVEEiCisgICAgICAgIHNlbGYud3JpdGUoIkElcyAlcyAlc1xuIiAlIChwZW50cnkubmFtZSwgZHR5cGUsIGVuY29kZSh2YWx1ZSkpKQorCisKK2RlZiBjb252ZXJ0KGlmcCwgb2ZwLCB0YWJsZSk6CisgICAgYyA9IENvbnZlcnNpb24oaWZwLCBvZnAsIHRhYmxlKQorICAgIHRyeToKKyAgICAgICAgYy5jb252ZXJ0KCkKKyAgICBleGNlcHQgSU9FcnJvciwgKGVyciwgbXNnKToKKyAgICAgICAgaWYgZXJyICE9IGVycm5vLkVQSVBFOgorICAgICAgICAgICAgcmFpc2UKKworCitkZWYgc2tpcF93aGl0ZShsaW5lKToKKyAgICB3aGlsZSBsaW5lIGFuZCBsaW5lWzBdIGluICIgJVxuXHRcciI6CisgICAgICAgIGxpbmUgPSBzdHJpbmcubHN0cmlwKGxpbmVbMTpdKQorICAgIHJldHVybiBsaW5lCisKKworCitjbGFzcyBUYWJsZUVudHJ5OgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBlbnZpcm9ubWVudD0wKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLm91dHB1dG5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudAorICAgICAgICBzZWxmLmVtcHR5ID0gbm90IGVudmlyb25tZW50CisgICAgICAgIHNlbGYuaGFzX2NvbnRlbnQgPSAwCisgICAgICAgIHNlbGYudmVyYmF0aW0gPSAwCisgICAgICAgIHNlbGYuYXV0b19jbG9zZSA9IDAKKyAgICAgICAgc2VsZi5wYXJhbWV0ZXJzID0gW10KKyAgICAgICAgc2VsZi5jbG9zZXMgPSBbXQorICAgICAgICBzZWxmLmVuZGNsb3NlcyA9IFtdCisKK2NsYXNzIFBhcmFtZXRlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZSwgbmFtZT1Ob25lLCBvcHRpb25hbD0wKToKKyAgICAgICAgc2VsZi50eXBlID0gdHlwZQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYub3B0aW9uYWwgPSBvcHRpb25hbAorICAgICAgICBzZWxmLnRleHQgPSAnJworICAgICAgICBzZWxmLmltcGxpZWQgPSAwCisKKworY2xhc3MgVGFibGVQYXJzZXIoWE1MUGFyc2VyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGFibGU9Tm9uZSk6CisgICAgICAgIGlmIHRhYmxlIGlzIE5vbmU6CisgICAgICAgICAgICB0YWJsZSA9IHt9CisgICAgICAgIHNlbGYuX190YWJsZSA9IHRhYmxlCisgICAgICAgIHNlbGYuX19jdXJyZW50ID0gTm9uZQorICAgICAgICBzZWxmLl9fYnVmZmVyID0gJycKKyAgICAgICAgWE1MUGFyc2VyLl9faW5pdF9fKHNlbGYpCisKKyAgICBkZWYgZ2V0X3RhYmxlKHNlbGYpOgorICAgICAgICBmb3IgZW50cnkgaW4gc2VsZi5fX3RhYmxlLnZhbHVlcygpOgorICAgICAgICAgICAgaWYgZW50cnkuZW52aXJvbm1lbnQgYW5kIG5vdCBlbnRyeS5oYXNfY29udGVudDoKKyAgICAgICAgICAgICAgICBwID0gUGFyYW1ldGVyKCJjb250ZW50IikKKyAgICAgICAgICAgICAgICBwLmltcGxpZWQgPSAxCisgICAgICAgICAgICAgICAgZW50cnkucGFyYW1ldGVycy5hcHBlbmQocCkKKyAgICAgICAgICAgICAgICBlbnRyeS5oYXNfY29udGVudCA9IDEKKyAgICAgICAgcmV0dXJuIHNlbGYuX190YWJsZQorCisgICAgZGVmIHN0YXJ0X2Vudmlyb25tZW50KHNlbGYsIGF0dHJzKToKKyAgICAgICAgbmFtZSA9IGF0dHJzWyJuYW1lIl0KKyAgICAgICAgc2VsZi5fX2N1cnJlbnQgPSBUYWJsZUVudHJ5KG5hbWUsIGVudmlyb25tZW50PTEpCisgICAgICAgIHNlbGYuX19jdXJyZW50LnZlcmJhdGltID0gYXR0cnMuZ2V0KCJ2ZXJiYXRpbSIpID09ICJ5ZXMiCisgICAgICAgIGlmIGF0dHJzLmhhc19rZXkoIm91dHB1dG5hbWUiKToKKyAgICAgICAgICAgIHNlbGYuX19jdXJyZW50Lm91dHB1dG5hbWUgPSBhdHRycy5nZXQoIm91dHB1dG5hbWUiKQorICAgICAgICBzZWxmLl9fY3VycmVudC5lbmRjbG9zZXMgPSBzdHJpbmcuc3BsaXQoYXR0cnMuZ2V0KCJlbmRjbG9zZXMiLCAiIikpCisgICAgZGVmIGVuZF9lbnZpcm9ubWVudChzZWxmKToKKyAgICAgICAgc2VsZi5lbmRfbWFjcm8oKQorCisgICAgZGVmIHN0YXJ0X21hY3JvKHNlbGYsIGF0dHJzKToKKyAgICAgICAgbmFtZSA9IGF0dHJzWyJuYW1lIl0KKyAgICAgICAgc2VsZi5fX2N1cnJlbnQgPSBUYWJsZUVudHJ5KG5hbWUpCisgICAgICAgIHNlbGYuX19jdXJyZW50LmNsb3NlcyA9IHN0cmluZy5zcGxpdChhdHRycy5nZXQoImNsb3NlcyIsICIiKSkKKyAgICAgICAgaWYgYXR0cnMuaGFzX2tleSgib3V0cHV0bmFtZSIpOgorICAgICAgICAgICAgc2VsZi5fX2N1cnJlbnQub3V0cHV0bmFtZSA9IGF0dHJzLmdldCgib3V0cHV0bmFtZSIpCisgICAgZGVmIGVuZF9tYWNybyhzZWxmKToKKyAgICAgICAgc2VsZi5fX3RhYmxlW3NlbGYuX19jdXJyZW50Lm5hbWVdID0gc2VsZi5fX2N1cnJlbnQKKyAgICAgICAgc2VsZi5fX2N1cnJlbnQgPSBOb25lCisKKyAgICBkZWYgc3RhcnRfYXR0cmlidXRlKHNlbGYsIGF0dHJzKToKKyAgICAgICAgbmFtZSA9IGF0dHJzLmdldCgibmFtZSIpCisgICAgICAgIG9wdGlvbmFsID0gYXR0cnMuZ2V0KCJvcHRpb25hbCIpID09ICJ5ZXMiCisgICAgICAgIGlmIG5hbWU6CisgICAgICAgICAgICBwID0gUGFyYW1ldGVyKCJhdHRyaWJ1dGUiLCBuYW1lLCBvcHRpb25hbD1vcHRpb25hbCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHAgPSBQYXJhbWV0ZXIoImF0dHJpYnV0ZSIsIG9wdGlvbmFsPW9wdGlvbmFsKQorICAgICAgICBzZWxmLl9fY3VycmVudC5wYXJhbWV0ZXJzLmFwcGVuZChwKQorICAgICAgICBzZWxmLl9fYnVmZmVyID0gJycKKyAgICBkZWYgZW5kX2F0dHJpYnV0ZShzZWxmKToKKyAgICAgICAgc2VsZi5fX2N1cnJlbnQucGFyYW1ldGVyc1stMV0udGV4dCA9IHNlbGYuX19idWZmZXIKKworICAgIGRlZiBzdGFydF9lbnRpdHlyZWYoc2VsZiwgYXR0cnMpOgorICAgICAgICBuYW1lID0gYXR0cnNbIm5hbWUiXQorICAgICAgICBwID0gUGFyYW1ldGVyKCJlbnRpdHlyZWYiLCBuYW1lKQorICAgICAgICBzZWxmLl9fY3VycmVudC5wYXJhbWV0ZXJzLmFwcGVuZChwKQorCisgICAgZGVmIHN0YXJ0X2NoaWxkKHNlbGYsIGF0dHJzKToKKyAgICAgICAgbmFtZSA9IGF0dHJzWyJuYW1lIl0KKyAgICAgICAgcCA9IFBhcmFtZXRlcigiY2hpbGQiLCBuYW1lLCBhdHRycy5nZXQoIm9wdGlvbmFsIikgPT0gInllcyIpCisgICAgICAgIHNlbGYuX19jdXJyZW50LnBhcmFtZXRlcnMuYXBwZW5kKHApCisgICAgICAgIHNlbGYuX19jdXJyZW50LmVtcHR5ID0gMAorCisgICAgZGVmIHN0YXJ0X2NvbnRlbnQoc2VsZiwgYXR0cnMpOgorICAgICAgICBwID0gUGFyYW1ldGVyKCJjb250ZW50IikKKyAgICAgICAgcC5pbXBsaWVkID0gYXR0cnMuZ2V0KCJpbXBsaWVkIikgPT0gInllcyIKKyAgICAgICAgaWYgc2VsZi5fX2N1cnJlbnQuZW52aXJvbm1lbnQ6CisgICAgICAgICAgICBwLmltcGxpZWQgPSAxCisgICAgICAgIHNlbGYuX19jdXJyZW50LnBhcmFtZXRlcnMuYXBwZW5kKHApCisgICAgICAgIHNlbGYuX19jdXJyZW50Lmhhc19jb250ZW50ID0gMQorICAgICAgICBzZWxmLl9fY3VycmVudC5lbXB0eSA9IDAKKworICAgIGRlZiBzdGFydF90ZXh0KHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5fX2N1cnJlbnQuZW1wdHkgPSAwCisgICAgICAgIHNlbGYuX19idWZmZXIgPSAnJworICAgIGRlZiBlbmRfdGV4dChzZWxmKToKKyAgICAgICAgcCA9IFBhcmFtZXRlcigidGV4dCIpCisgICAgICAgIHAudGV4dCA9IHNlbGYuX19idWZmZXIKKyAgICAgICAgc2VsZi5fX2N1cnJlbnQucGFyYW1ldGVycy5hcHBlbmQocCkKKworICAgIGRlZiBoYW5kbGVfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5fX2J1ZmZlciA9IHNlbGYuX19idWZmZXIgKyBkYXRhCisKKworZGVmIGxvYWRfdGFibGUoZnAsIHRhYmxlPU5vbmUpOgorICAgIHBhcnNlciA9IFRhYmxlUGFyc2VyKHRhYmxlPXRhYmxlKQorICAgIHBhcnNlci5mZWVkKGZwLnJlYWQoKSkKKyAgICBwYXJzZXIuY2xvc2UoKQorICAgIHJldHVybiBwYXJzZXIuZ2V0X3RhYmxlKCkKKworCitkZWYgbWFpbigpOgorICAgIGdsb2JhbCBERUJVRworICAgICMKKyAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICJEIiwgWyJkZWJ1ZyJdKQorICAgIGZvciBvcHQsIGFyZyBpbiBvcHRzOgorICAgICAgICBpZiBvcHQgaW4gKCItRCIsICItLWRlYnVnIik6CisgICAgICAgICAgICBERUJVRyA9IERFQlVHICsgMQorICAgIGlmIGxlbihhcmdzKSA9PSAwOgorICAgICAgICBpZnAgPSBzeXMuc3RkaW4KKyAgICAgICAgb2ZwID0gc3lzLnN0ZG91dAorICAgIGVsaWYgbGVuKGFyZ3MpID09IDE6CisgICAgICAgIGlmcCA9IG9wZW4oYXJncykKKyAgICAgICAgb2ZwID0gc3lzLnN0ZG91dAorICAgIGVsaWYgbGVuKGFyZ3MpID09IDI6CisgICAgICAgIGlmcCA9IG9wZW4oYXJnc1swXSkKKyAgICAgICAgb2ZwID0gb3BlbihhcmdzWzFdLCAidyIpCisgICAgZWxzZToKKyAgICAgICAgdXNhZ2UoKQorICAgICAgICBzeXMuZXhpdCgyKQorCisgICAgdGFibGUgPSBsb2FkX3RhYmxlKG9wZW4ob3MucGF0aC5qb2luKHN5cy5wYXRoWzBdLCAnY29udmVyc2lvbi54bWwnKSkpCisgICAgY29udmVydChpZnAsIG9mcCwgdGFibGUpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2RvYy90b29scy9zZ21sY29udi9tYWtlLnJ1bGVzIGIvZG9jL3Rvb2xzL3NnbWxjb252L21ha2UucnVsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1NzljNQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy9zZ21sY29udi9tYWtlLnJ1bGVzCkBAIC0wLDAgKzEsNDggQEAKKyMgLSotIG1ha2VmaWxlIC0qLQorIworIyBFeHRyYSBtYWdpYyBuZWVkZWQgYnkgdGhlIExhVGVYLT5YTUwgY29udmVyc2lvbiBwcm9jZXNzLiAgVGhpcyByZXF1aXJlcworIyAkKFRPT0xTRElSKSB0byBiZSBwcm9wZXJseSBkZWZpbmVkLgorCitET0NGSVhFUj0JJChUT09MU0RJUikvc2dtbGNvbnYvZG9jZml4ZXIucHkKK0VTSVMyTUw9CSQoVE9PTFNESVIpL3NnbWxjb252L2VzaXMyc2dtbC5weQorTEFURVgyRVNJUz0JJChUT09MU0RJUikvc2dtbGNvbnYvbGF0ZXgyZXNpcy5weQorQ09OVkVSU0lPTj0JJChUT09MU0RJUikvc2dtbGNvbnYvY29udmVyc2lvbi54bWwKKworRVNJU1RBUkdFVFM9CSQocGF0c3Vic3QgJS50ZXgsJS5lc2lzLCQod2lsZGNhcmQgKi50ZXgpKQorRVNJUzFUQVJHRVRTPQkkKHBhdHN1YnN0ICUudGV4LCUuZXNpczEsJCh3aWxkY2FyZCAqLnRleCkpCitYTUxUQVJHRVRTPQkkKHBhdHN1YnN0ICUudGV4LCUueG1sLCQod2lsZGNhcmQgKi50ZXgpKQorCitMMkVGTEFHUz0KKworYWxsOgl4bWwKKworZXNpczoJJChFU0lTVEFSR0VUUykKK2VzaXMxOgkkKEVTSVMxVEFSR0VUUykKK3htbDoJJChYTUxUQVJHRVRTKQorCitFU0lTVE9PTFM9CSQoVE9PTFNESVIpL3NnbWxjb252L2VzaXN0b29scy5weQorCiskKEVTSVNUQVJHRVRTKTogJChMQVRFWDJFU0lTKSAkKERPQ0ZJWEVSKSAkKEVTSVNUT09MUykgJChDT05WRVJTSU9OKQorJChFU0lTMVRBUkdFVFMpOiAkKExBVEVYMkVTSVMpICQoQ09OVkVSU0lPTikKKyMgVGhpcyB2YXJpYW50IGlzIGVhc2llciB0byB3b3JrIHdpdGggd2hpbGUgZGVidWdnaW5nIHRoZSBjb252ZXJzaW9uIHNwZWM6CisjJChFU0lTVEFSR0VUUyk6ICQoTEFURVgyRVNJUykgJChET0NGSVhFUikgJChFU0lTVE9PTFMpCiskKFhNTFRBUkdFVFMpOiAkKEVTSVMyTUwpCisKKworLlNVRkZJWEVTOiAuZXNpcyAuZXNpczEgLnRleCAueG1sCisKKy50ZXguZXNpczE6CisJJChMQVRFWDJFU0lTKSAkKEwyRUZMQUdTKSAkPCAkQAorCisuZXNpczEuZXNpczoKKwkkKERPQ0ZJWEVSKSAkPCAkQAorCisuZXNpcy54bWw6CisJJChFU0lTMk1MKSAtLXhtbCAkPCAkQAorCisKK2NsZWFuOgorCXJtIC1mICouZXNpcyAqLmVzaXMxCisKK2Nsb2JiZXI6IGNsZWFuCisJcm0gLWYgKi54bWwKZGlmZiAtLWdpdCBhL2RvYy90b29scy9zdXBwb3J0LnB5IGIvZG9jL3Rvb2xzL3N1cHBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRmMDRhMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy9zdXBwb3J0LnB5CkBAIC0wLDAgKzEsMTQ5IEBACisiIiJNaXNjZWxsYW5lb3VzIHN1cHBvcnQgY29kZSBzaGFyZWQgYnkgc29tZSBvZiB0aGUgdG9vbCBzY3JpcHRzLgorCitUaGlzIGluY2x1ZGVzIG9wdGlvbiBwYXJzaW5nIGNvZGUsIEhUTUwgZm9ybWF0dGluZyBjb2RlLCBhbmQgYSBjb3VwbGUgb2YKK3VzZWZ1bCBoZWxwZXJzLgorCisiIiIKK19fdmVyc2lvbl9fID0gJyRSZXZpc2lvbjogMS4xLjEuMSAkJworCisKK2ltcG9ydCBnZXRvcHQKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCBzeXMKKworCitjbGFzcyBPcHRpb25zOgorICAgIF9fc2hvcnRfYXJncyA9ICJhOmM6aG86IgorICAgIF9fbG9uZ19hcmdzID0gWworICAgICAgICAjIHNjcmlwdCBjb250cm9scworICAgICAgICAiY29sdW1ucz0iLCAiaGVscCIsICJvdXRwdXQ9IiwKKworICAgICAgICAjIGNvbnRlbnQgY29tcG9uZW50cworICAgICAgICAiYWRkcmVzcz0iLCAiaWNvbnNlcnZlcj0iLAorICAgICAgICAidGl0bGU9IiwgInVwbGluaz0iLCAidXB0aXRsZT0iXQorCisgICAgb3V0cHV0ZmlsZSA9ICItIgorICAgIGNvbHVtbnMgPSAxCisgICAgbGV0dGVycyA9IDAKKyAgICB1cGxpbmsgPSAiLi8iCisgICAgdXB0aXRsZSA9ICJQeXRob24gRG9jdW1lbnRhdGlvbiBJbmRleCIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5hcmdzID0gW10KKyAgICAgICAgc2VsZi52YXJpYWJsZXMgPSB7ImFkZHJlc3MiOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImljb25zZXJ2ZXIiOiAiaWNvbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1ndHlwZSI6ICJnaWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiAiR2xvYmFsIE1vZHVsZSBJbmRleCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgIGRlZiBhZGRfYXJncyhzZWxmLCBzaG9ydD1Ob25lLCBsb25nPU5vbmUpOgorICAgICAgICBpZiBzaG9ydDoKKyAgICAgICAgICAgIHNlbGYuX19zaG9ydF9hcmdzID0gc2VsZi5fX3Nob3J0X2FyZ3MgKyBzaG9ydAorICAgICAgICBpZiBsb25nOgorICAgICAgICAgICAgc2VsZi5fX2xvbmdfYXJncyA9IHNlbGYuX19sb25nX2FyZ3MgKyBsb25nCisKKyAgICBkZWYgcGFyc2Uoc2VsZiwgYXJncyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KGFyZ3MsIHNlbGYuX19zaG9ydF9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2xvbmdfYXJncykKKyAgICAgICAgZXhjZXB0IGdldG9wdC5lcnJvcjoKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzeXMuc3RkZXJyCisgICAgICAgICAgICBzZWxmLnVzYWdlKCkKKyAgICAgICAgICAgIHN5cy5leGl0KDIpCisgICAgICAgIHNlbGYuYXJncyA9IHNlbGYuYXJncyArIGFyZ3MKKyAgICAgICAgZm9yIG9wdCwgdmFsIGluIG9wdHM6CisgICAgICAgICAgICBpZiBvcHQgaW4gKCItYSIsICItLWFkZHJlc3MiKToKKyAgICAgICAgICAgICAgICB2YWwgPSBzdHJpbmcuc3RyaXAodmFsKQorICAgICAgICAgICAgICAgIGlmIHZhbDoKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gIjxhZGRyZXNzPlxuJXNcbjwvYWRkcmVzcz5cbiIgJSB2YWwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi52YXJpYWJsZXNbImFkZHJlc3MiXSA9IHZhbAorICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCItaCIsICItLWhlbHAiKToKKyAgICAgICAgICAgICAgICBzZWxmLnVzYWdlKCkKKyAgICAgICAgICAgICAgICBzeXMuZXhpdCgpCisgICAgICAgICAgICBlbGlmIG9wdCBpbiAoIi1vIiwgIi0tb3V0cHV0Iik6CisgICAgICAgICAgICAgICAgc2VsZi5vdXRwdXRmaWxlID0gdmFsCisgICAgICAgICAgICBlbGlmIG9wdCBpbiAoIi1jIiwgIi0tY29sdW1ucyIpOgorICAgICAgICAgICAgICAgIHNlbGYuY29sdW1ucyA9IGludCh2YWwpCisgICAgICAgICAgICBlbGlmIG9wdCA9PSAiLS10aXRsZSI6CisgICAgICAgICAgICAgICAgc2VsZi52YXJpYWJsZXNbInRpdGxlIl0gPSB2YWwuc3RyaXAoKQorICAgICAgICAgICAgZWxpZiBvcHQgPT0gIi0tdXBsaW5rIjoKKyAgICAgICAgICAgICAgICBzZWxmLnVwbGluayA9IHZhbC5zdHJpcCgpCisgICAgICAgICAgICBlbGlmIG9wdCA9PSAiLS11cHRpdGxlIjoKKyAgICAgICAgICAgICAgICBzZWxmLnVwdGl0bGUgPSB2YWwuc3RyaXAoKQorICAgICAgICAgICAgZWxpZiBvcHQgPT0gIi0taWNvbnNlcnZlciI6CisgICAgICAgICAgICAgICAgc2VsZi52YXJpYWJsZXNbImljb25zZXJ2ZXIiXSA9IHZhbC5zdHJpcCgpIG9yICIuIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9vcHRpb24ob3B0LCB2YWwpCisgICAgICAgIGlmIHNlbGYudXBsaW5rIGFuZCBzZWxmLnVwdGl0bGU6CisgICAgICAgICAgICBzZWxmLnZhcmlhYmxlc1sidXBsaW5rYWx0Il0gPSAidXAiCisgICAgICAgICAgICBzZWxmLnZhcmlhYmxlc1sidXBsaW5raWNvbiJdID0gInVwIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi52YXJpYWJsZXNbInVwbGlua2FsdCJdID0gIiIKKyAgICAgICAgICAgIHNlbGYudmFyaWFibGVzWyJ1cGxpbmtpY29uIl0gPSAiYmxhbmsiCisgICAgICAgIHNlbGYudmFyaWFibGVzWyJ1cGxpbmsiXSA9IHNlbGYudXBsaW5rCisgICAgICAgIHNlbGYudmFyaWFibGVzWyJ1cHRpdGxlIl0gPSBzZWxmLnVwdGl0bGUKKworICAgIGRlZiBoYW5kbGVfb3B0aW9uKHNlbGYsIG9wdCwgdmFsKToKKyAgICAgICAgcmFpc2UgZ2V0b3B0LmVycm9yKCJvcHRpb24gJXMgbm90IHJlY29nbml6ZWQiICUgb3B0KQorCisgICAgZGVmIGdldF9oZWFkZXIoc2VsZik6CisgICAgICAgIHJldHVybiBIRUFEICUgc2VsZi52YXJpYWJsZXMKKworICAgIGRlZiBnZXRfZm9vdGVyKHNlbGYpOgorICAgICAgICByZXR1cm4gVEFJTCAlIHNlbGYudmFyaWFibGVzCisKKyAgICBkZWYgZ2V0X291dHB1dF9maWxlKHNlbGYsIGZpbGVuYW1lPU5vbmUpOgorICAgICAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLm91dHB1dGZpbGUKKyAgICAgICAgaWYgZmlsZW5hbWUgPT0gIi0iOgorICAgICAgICAgICAgcmV0dXJuIHN5cy5zdGRvdXQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBvcGVuKGZpbGVuYW1lLCAidyIpCisKKworTkFWSUdBVElPTiA9ICcnJ1wKKzxkaXYgY2xhc3M9Im5hdmlnYXRpb24iPgorPHRhYmxlIHdpZHRoPSIxMDAlJSIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIyIj4KKzx0cj4KKzx0ZD48aW1nIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIiBhbHQ9IiIKKyBzcmM9IiUoaWNvbnNlcnZlcilzL2JsYW5rLiUoaW1ndHlwZSlzIj48L3RkPgorPHRkPjxhIGhyZWY9IiUodXBsaW5rKXMiCisgdGl0bGU9IiUodXB0aXRsZSlzIj48aW1nIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIgorIGFsdD0iJSh1cGxpbmthbHQpcyIKKyBzcmM9IiUoaWNvbnNlcnZlcilzLyUodXBsaW5raWNvbilzLiUoaW1ndHlwZSlzIj48L2E+PC90ZD4KKzx0ZD48aW1nIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIiBhbHQ9IiIKKyBzcmM9IiUoaWNvbnNlcnZlcilzL2JsYW5rLiUoaW1ndHlwZSlzIj48L3RkPgorPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIxMDAlJSI+JSh0aXRsZSlzPC90ZD4KKzx0ZD48aW1nIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIiBhbHQ9IiIKKyBzcmM9IiUoaWNvbnNlcnZlcilzL2JsYW5rLiUoaW1ndHlwZSlzIj48L3RkPgorPHRkPjxpbWcgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBhbGlnbj0iYm90dG9tIiBib3JkZXI9IjAiIGFsdD0iIgorIHNyYz0iJShpY29uc2VydmVyKXMvYmxhbmsuJShpbWd0eXBlKXMiPjwvdGQ+Cis8dGQ+PGltZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCIgYWx0PSIiCisgc3JjPSIlKGljb25zZXJ2ZXIpcy9ibGFuay4lKGltZ3R5cGUpcyI+PC90ZD4KKzwvdHI+PC90YWJsZT4KKzxiIGNsYXNzPSJuYXZsYWJlbCI+VXA6PC9iPiA8c3BhbiBjbGFzcz0ic2VjdHJlZiI+PGEgaHJlZj0iJSh1cGxpbmspcyIKKyB0aXRsZT0iJSh1cHRpdGxlKXMiPiUodXB0aXRsZSlzPC9BPjwvc3Bhbj4KKzxicj48L2Rpdj4KKycnJworCitIRUFEID0gJycnXAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+CisgIDx0aXRsZT4lKHRpdGxlKXM8L3RpdGxlPgorICA8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iJSh0aXRsZSlzIj4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgIDxsaW5rIHJlbD0iU1RZTEVTSEVFVCIgaHJlZj0ibGliL2xpYi5jc3MiPgorPC9oZWFkPgorPGJvZHk+CisnJycgKyBOQVZJR0FUSU9OICsgJycnXAorPGhyPgorCis8aDI+JSh0aXRsZSlzPC9oMj4KKworJycnCisKK1RBSUwgPSAiPGhyPlxuIiArIE5BVklHQVRJT04gKyAnJydcCislKGFkZHJlc3MpczwvYm9keT4KKzwvaHRtbD4KKycnJwpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL3RlbXBsYXRlcy9ob3d0by50ZXggYi9kb2MvdG9vbHMvdGVtcGxhdGVzL2hvd3RvLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2IyMTNhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL3RlbXBsYXRlcy9ob3d0by50ZXgKQEAgLTAsMCArMSwxMDUgQEAKK1xkb2N1bWVudGNsYXNze2hvd3RvfQorCislICBUaGlzIGlzIGEgdGVtcGxhdGUgZm9yIHNob3J0IG9yIG1lZGl1bS1zaXplIFB5dGhvbi1yZWxhdGVkIGRvY3VtZW50cywgCislIG1vc3RseSBub3RhYmx5IHRoZSBzZXJpZXMgb2YgSE9XVE9zLCBidXQgaXQgY2FuIGJlIHVzZWQgZm9yIGFueQorJSBkb2N1bWVudCB5b3UgbGlrZS4gICAKKworJSBUaGUgdGl0bGUgc2hvdWxkIGJlIGRlc2NyaXB0aXZlIGVub3VnaCBmb3IgcGVvcGxlIHRvIGJlIGFibGUgdG8gZmluZAorJSB0aGUgcmVsZXZhbnQgZG9jdW1lbnQuIAorXHRpdGxle1NwYW1taWZ5aW5nIFNwcm9ja2V0cyBpbiBQeXRob259CisKKyUgSW5jcmVtZW50IHRoZSByZWxlYXNlIG51bWJlciB3aGVuZXZlciBzaWduaWZpY2FudCBjaGFuZ2VzIGFyZSBtYWRlLgorJSBUaGUgYXV0aG9yIGFuZC9vciBlZGl0b3IgY2FuIGRlZmluZSAnc2lnbmlmaWNhbnQnIGhvd2V2ZXIgdGhleSBsaWtlLgorXHJlbGVhc2V7MC4wMH0KKworJSBBdCBtaW5pbXVtLCBnaXZlIHlvdXIgbmFtZSBhbmQgYW4gZS1tYWlsIGFkZHJlc3MuICBZb3UgY2FuIGluY2x1ZGUgYQorJSBzbmFpbC1tYWlsIGFkZHJlc3MgaWYgeW91IGxpa2UuCitcYXV0aG9ye01lLCAnY2F1c2UgSSB3cm90ZSBpdH0KK1xhdXRob3JhZGRyZXNze01lLCAnY2F1c2UgSSdtIHNlbGYtZW1wbG95ZWQufQorCitcYmVnaW57ZG9jdW1lbnR9CitcbWFrZXRpdGxlCisKKyUgVGhpcyBtYWtlcyB0aGUgQWJzdHJhY3QgZ28gb24gYSBzZXBhcmF0ZSBwYWdlIGluIHRoZSBIVE1MIHZlcnNpb247CislIGlmIGEgY29weXJpZ2h0IG5vdGljZSBpcyB1c2VkLCBpdCBzaG91bGQgZ28gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcy4KKyUKK1xpZmh0bWwKK1xjaGFwdGVyKntGcm9udCBNYXR0ZXJcbGFiZWx7ZnJvbnR9fQorXGZpCisKKyUgQ29weXJpZ2h0IHN0YXRlbWVudCBzaG91bGQgZ28gaGVyZSwgaWYgbmVlZGVkLgorJSAuLi4KKworJSBUaGUgYWJzdHJhY3Qgc2hvdWxkIGJlIGEgcGFyYWdyYXBoIG9yIHR3byBsb25nLCBhbmQgZGVzY3JpYmUgdGhlCislIHNjb3BlIG9mIHRoZSBkb2N1bWVudC4KK1xiZWdpbnthYnN0cmFjdH0KK1xub2luZGVudAorVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgaG93IHRvIHNwYW1taWZ5IHNwcm9ja2V0cy4gIEl0IGlzIGEgdXNlZnVsCitleGFtcGxlIG9mIGEgUHl0aG9uIEhPV1RPIGRvY3VtZW50LiAgSXQgaXMgbm90IGRlcGVuZGVudCBvbiBhbnkKK3BhcnRpY3VsYXIgc3Byb2NrZXQgaW1wbGVtZW50YXRpb24sIGFuZCBpbmNsdWRlcyBhIFB5dGhvbi1iYXNlZAoraW1wbGVtZW50YXRpb24gaW4gdGhlIFxtb2R1bGV7c3BydW5raXR9IG1vZHVsZS4KK1xlbmR7YWJzdHJhY3R9CisKK1x0YWJsZW9mY29udGVudHMKKworU3BhbW1pZnlpbmcgc3Byb2NrZXRzIGZyb20gUHl0aG9uIGlzIGJvdGggZnVuIGFuZCBlbnRlcnRhaW5pbmcuCitBcHBseWluZyB0aGUgdGVjaG5pcXVlcyBkZXNjcmliZWQgaGVyZSwgeW91IGNhbiBhbHNvIGZpbGwgeW91ciBoYXJkCitkaXNrIHF1aXRlIGVmZmVjdGl2ZWx5LgorCitcc2VjdGlvbntXaGF0IGlzIFNwcm9ja2V0IFNwYW1taWZpY2F0aW9uP30KKworWW91IGhhdmUgdG8gYXNrPyAgSXQncyB0aGUgb25seSB0aGluZyB0byBkbyB0byB5b3VyIHNwcm9ja2V0cyEKKworCitcc2VjdGlvbntXaHkgVXNlIFB5dGhvbj99CisKK1B5dGhvbiBpcyBhbiBleGNlbGxlbnQgbGFuZ3VhZ2UgZnJvbSB3aGljaCB0byBzcGFtbWlmeSB5b3VyIHNwcm9ja2V0cworc2luY2UgeW91IGNhbiBkbyBpdCBvbiBhbnkgcGxhdGZvcm0uCisKKworXHNlY3Rpb257U29mdHdhcmUgUmVxdWlyZW1lbnRzfQorCitZb3UgbmVlZCB0byBoYXZlIHRoZSBmb2xsb3dpbmcgc29mdHdhcmUgaW5zdGFsbGVkOgorCislIFRoZSB7aXRlbWl6ZX0gZW52aXJvbm1lbnQgdXNlcyBhIGJ1bGxldCBmb3IgZWFjaCBcaXRlbS4gIElmIHlvdSB3YW50IHRoZSAKKyUgXGl0ZW0ncyBudW1iZXJlZCwgdXNlIHRoZSB7ZW51bWVyYXRlfSBlbnZpcm9ubWVudCBpbnN0ZWFkLgorXGJlZ2lue2l0ZW1pemV9CisgIFxpdGVtICBQeXRob24gMS45LgorICBcaXRlbSAgU29tZSBzcHJvY2tldCBkZWZpbml0aW9uIGZpbGVzLgorICBcaXRlbSAgQXQgbGVhc3Qgb25lIHNwcm9ja2V0IHN5c3RlbSBpbXBsZW1lbnRhdGlvbi4KK1xlbmR7aXRlbWl6ZX0KKworTm90ZSB0aGF0IHRoZSBcbW9kdWxle3NwcnVua2l0fSBpcyBwcm92aWRlZCB3aXRoIHRoaXMgcGFja2FnZSBhbmQKK2ltcGxlbWVudHMgQWN0aXZlU3Byb2NrZXRzIGluIFB5dGhvbi4KKworCislIFRoZSBwcmVjZWRpbmcgc2VjdGlvbnMgd2lsbCBoYXZlIGJlZW4gd3JpdHRlbiBpbiBhIGdlbnRsZXIsCislIGludHJvZHVjdG9yeSBzdHlsZS4gIFlvdSBtYXkgYWxzbyB3aXNoIHRvIGluY2x1ZGUgYSByZWZlcmVuY2UKKyUgc2VjdGlvbiwgZG9jdW1lbnRpbmcgYWxsIHRoZSBmdW5jdGlvbnMvZXhjZXB0aW9ucy9jb25zdGFudHMuCislIE9mdGVuLCB0aGVzZSB3aWxsIGJlIHBsYWNlZCBpbiBzZXBhcmF0ZSBmaWxlcyBhbmQgaW5wdXQgbGlrZSB0aGlzOgorCitcaW5wdXR7bW9kdWxlfQorCisKK1xhcHBlbmRpeAorCitcc2VjdGlvbntUaGlzIGlzIGFuIEFwcGVuZGl4fQorCitUbyBjcmVhdGUgYW4gYXBwZW5kaXggaW4gYSBQeXRob24gSE9XVE8gZG9jdW1lbnQsIHVzZSBtYXJrdXAgbGlrZQordGhpczoKKworXGJlZ2lue3ZlcmJhdGltfQorXGFwcGVuZGl4CisKK1xzZWN0aW9ue1RoaXMgaXMgYW4gQXBwZW5kaXh9CisKK1RvIGNyZWF0ZSBhbiBhcHBlbmRpeCBpbiBhIFB5dGhvbiBIT1dUTyBkb2N1bWVudCwgLi4uLgorCisKK1xzZWN0aW9ue1RoaXMgaXMgYW5vdGhlcn0KKworSnVzdCBhZGQgYW5vdGhlciBcc2VjdGlvbnt9LCBidXQgZG9uJ3Qgc2F5IFxhcHBlbmRpeCBhZ2Fpbi4KK1xlbmR7dmVyYmF0aW19CisKKworXGVuZHtkb2N1bWVudH0KZGlmZiAtLWdpdCBhL2RvYy90b29scy90ZW1wbGF0ZXMvbWFudWFsLnRleCBiL2RvYy90b29scy90ZW1wbGF0ZXMvbWFudWFsLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGM4ZWMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL3RlbXBsYXRlcy9tYW51YWwudGV4CkBAIC0wLDAgKzEsODIgQEAKK1xkb2N1bWVudGNsYXNze21hbnVhbH0KKworXHRpdGxle0JpZyBQeXRob24gTWFudWFsfQorCitcYXV0aG9ye1lvdXIgTmFtZSBIZXJlfQorCislIFBsZWFzZSBhdCBsZWFzdCBpbmNsdWRlIGEgbG9uZy1saXZlZCBlbWFpbCBhZGRyZXNzOworJSB0aGUgcmVzdCBpcyBhdCB5b3VyIGRpc2NyZXRpb24uCitcYXV0aG9yYWRkcmVzc3sKKwlPcmdhbml6YXRpb24gbmFtZSwgaWYgYXBwbGljYWJsZSBcXAorCVN0cmVldCBhZGRyZXNzLCBpZiB5b3Ugd2FudCB0byB1c2UgaXQgXFwKKwlFLW1haWw6IFxlbWFpbHt5b3VyLWVtYWlsQHlvdXIuZG9tYWlufQorfQorCitcZGF0ZXtBcHJpbCAzMCwgMTk5OX0JCSUgdXBkYXRlIGJlZm9yZSByZWxlYXNlIQorCQkJCSUgVXNlIGFuIGV4cGxpY2l0IGRhdGUgc28gdGhhdCByZWZvcm1hdHRpbmcKKwkJCQklIGRvZXNuJ3QgY2F1c2UgYSBuZXcgZGF0ZSB0byBiZSB1c2VkLiAgU2V0dGluZworCQkJCSUgdGhlIGRhdGUgdG8gXHRvZGF5IGNhbiBiZSB1c2VkIGR1cmluZyBkcmFmdAorCQkJCSUgc3RhZ2VzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGhhbmRsZSB2ZXJzaW9ucy4KKworXHJlbGVhc2V7eC55fQkJCSUgcmVsZWFzZSB2ZXJzaW9uOyB0aGlzIGlzIHVzZWQgdG8gZGVmaW5lIHRoZQorCQkJCSUgXHZlcnNpb24gbWFjcm8KKworXG1ha2VpbmRleAkJCSUgdGVsbCBcaW5kZXggdG8gYWN0dWFsbHkgd3JpdGUgdGhlIC5pZHggZmlsZQorXG1ha2Vtb2RpbmRleAkJCSUgSWYgdGhpcyBjb250YWlucyBhIGxvdCBvZiBtb2R1bGUgc2VjdGlvbnMuCisKKworXGJlZ2lue2RvY3VtZW50fQorCitcbWFrZXRpdGxlCisKKyUgVGhpcyBtYWtlcyB0aGUgY29udGVudHMgbW9yZSBhY2Nlc3NpYmxlIGZyb20gdGhlIGZyb250IHBhZ2Ugb2YgdGhlIEhUTUwuCitcaWZodG1sCitcY2hhcHRlcip7RnJvbnQgTWF0dGVyXGxhYmVse2Zyb250fX0KK1xmaQorCislXGlucHV0e2NvcHlyaWdodH0KKworXGJlZ2lue2Fic3RyYWN0fQorCitcbm9pbmRlbnQKK0JpZyBQeXRob24gaXMgYSBzcGVjaWFsIHZlcnNpb24gb2YgUHl0aG9uIGZvciB1c2VycyB3aG8gcmVxdWlyZSBsYXJnZXIgCitrZXlzIG9uIHRoZWlyIGtleWJvYXJkcy4gIEl0IGFjY29tb2RhdGVzIHRoZWlyIHNwZWNpYWwgbmVlZHMgYnkgLi4uCisKK1xlbmR7YWJzdHJhY3R9CisKK1x0YWJsZW9mY29udGVudHMKKworCitcY2hhcHRlcnsuLi59CisKK015IGNoYXB0ZXIuCisKKworXGFwcGVuZGl4CitcY2hhcHRlcnsuLi59CisKK015IGFwcGVuZGl4LgorCitUaGUgXGNvZGV7XGUgYXBwZW5kaXh9IG1hcmt1cCBuZWVkIG5vdCBiZSByZXBlYXRlZCBmb3IgYWRkaXRpb25hbAorYXBwZW5kaWNlcy4KKworCislCislICBUaGUgdWdseSAiJWJlZ2lue2xhdGV4b25seX0iIHBzZXVkby1lbnZpcm9ubWVudHMgYXJlIHJlYWxseSBqdXN0IHRvCislICBrZWVwIExhVGVYMkhUTUwgcXVpZXQgZHVyaW5nIHRoZSBccmVuZXdjb21tYW5ke30gbWFjcm9zOyB0aGV5J3JlCislICBub3QgcmVhbGx5IHZhbHVhYmxlLgorJQorJSAgSWYgeW91IGRvbid0IHdhbnQgdGhlIE1vZHVsZSBJbmRleCwgeW91IGNhbiByZW1vdmUgYWxsIG9mIHRoaXMgdXAKKyUgIHVudGlsIHRoZSBzZWNvbmQgXGlucHV0IGxpbmUuCislCislYmVnaW57bGF0ZXhvbmx5fQorXHJlbmV3Y29tbWFuZHtcaW5kZXhuYW1lfXtNb2R1bGUgSW5kZXh9CislZW5ke2xhdGV4b25seX0KK1xpbnB1dHttb2Rcam9ibmFtZS5pbmR9CQklIE1vZHVsZSBJbmRleAorCislYmVnaW57bGF0ZXhvbmx5fQorXHJlbmV3Y29tbWFuZHtcaW5kZXhuYW1lfXtJbmRleH0KKyVlbmR7bGF0ZXhvbmx5fQorXGlucHV0e1xqb2JuYW1lLmluZH0JCQklIEluZGV4CisKK1xlbmR7ZG9jdW1lbnR9CmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvdGVtcGxhdGVzL21vZHVsZS50ZXggYi9kb2MvdG9vbHMvdGVtcGxhdGVzL21vZHVsZS50ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkNzY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy90ZW1wbGF0ZXMvbW9kdWxlLnRleApAQCAtMCwwICsxLDE2MyBAQAorJSBUZW1wbGF0ZSBmb3IgYSBsaWJyYXJ5IG1hbnVhbCBzZWN0aW9uLgorJSBQTEVBU0UgUkVNT1ZFIFRIRSBDT01NRU5UUyBBRlRFUiBVU0lORyBUSEUgVEVNUExBVEUKKworJSA9PT09IDAuID09PT0KKyUgQ29weSB0aGlzIGZpbGUgdG8gPG15ZGlyPi9saWI8bXltb2R1bGU+LnRleCwgYW5kIGVkaXQgdGhhdCBmaWxlCislIGFjY29yZGluZyB0byB0aGUgaW5zdHJ1Y3Rpb25zIGJlbG93LgorCisKKyUgPT09PSAxLiA9PT09CislIFRoZSBzZWN0aW9uIHByb2xvZ3VlLiAgR2l2ZSB0aGUgc2VjdGlvbiBhIHRpdGxlIGFuZCBwcm92aWRlIHNvbWUKKyUgbWV0YS1pbmZvcm1hdGlvbi4gIFJlZmVyZW5jZXMgdG8gdGhlIG1vZHVsZSBzaG91bGQgdXNlCislIFxyZWZiaW1vZGluZGV4LCBccmVmc3Rtb2RpbmRleCwgXHJlZmV4bW9kaW5kZXggb3IgXHJlZm1vZGluZGV4LCBhcworJSBhcHByb3ByaWF0ZS4KKworXHNlY3Rpb257XG1vZHVsZXtzcGFtfSAtLS0KKyAgICAgICAgIFNob3J0IGRlc2NyaXRpb24sIGZvciBzZWN0aW9uIHRpdGxlfQorCislIENob29zZSBvbmUgb2YgdGhlc2UgdG8gc3BlY2lmeSB0aGUgbW9kdWxlIG1vZHVsZSBuYW1lLiAgSWYgdGhlcmUncworJSBhbiB1bmRlcnNjb3JlIGluIHRoZSBuYW1lLCB1c2UKKyUgXGRlY2xhcmVtb2R1bGVbbW9kbmFtZV17Li4ufXttb2RfbmFtZX0gaW5zdGVhZC4KKyUKK1xkZWNsYXJlbW9kdWxle2J1aWx0aW59e3NwYW19CQklIHN0YW5kYXJkIGxpYnJhcnksIGluIEMKK1xkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtzcGFtfQkJJSBzdGFuZGFyZCBsaWJyYXJ5LCBpbiBQeXRob24KK1xkZWNsYXJlbW9kdWxle2V4dGVuc2lvbn17c3BhbX0JCSUgbm90IHN0YW5kYXJkLCBpbiBDCitcZGVjbGFyZW1vZHVsZXt9e3NwYW19CQkJJSBub3Qgc3RhbmRhcmQsIGluIFB5dGhvbgorCislIFBvcnRhYmlsaXR5IHN0YXRlbWVudDogIFVuY29tbWVudCBhbmQgZmlsbCBpbiB0aGUgcGFyYW1ldGVyIHRvIHNwZWNpZnkgdGhlCislIGF2YWlsYWJpbGl0eSBvZiB0aGUgbW9kdWxlLiAgVGhlIHBhcmFtZXRlciBjYW4gYmUgVW5peCwgSVJJWCwgU3VuT1MsIE1hYywKKyUgV2luZG93cywgb3IgbG90cyBvZiBvdGhlciBzdHVmZi4gIFdoZW4gYGBNYWMnJyBpcyBzcGVjaWZpZWQsIHRoZSBhdmFpbGFiaWxpdHkKKyUgc3RhdGVtZW50IHdpbGwgc2F5IGBgTWFjaW50b3NoJycgYW5kIHRoZSBNb2R1bGUgSW5kZXggbWF5IHNheSBgYE1hYycnLgorJSBQbGVhc2UgdXNlIGEgbmFtZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gdXNlZCB3aGVuZXZlciBhcHBsaWNhYmxlLiAgSWYgdGhpcworJSBpcyBvbWl0dGVkLCBubyBhdmFpbGFiaWxpdHkgc3RhdGVtZW50IGlzIHByb2R1Y2VkIG9yIGltcGxpZWQuCislCislICAgXHBsYXRmb3Jte1VOSVh9CisKKyUgVGhlc2UgYXBwbHkgdG8gYWxsIG1vZHVsZXM6CisKK1xtb2R1bGVhdXRob3J7bmFtZX17ZW1haWx9CQklIEF1dGhvciBvZiB0aGUgbW9kdWxlIGNvZGU7CisJCQkJCSUgb21pdCBpZiBub3Qga25vd24uCitcc2VjdGlvbmF1dGhvcntuYW1lfXtlbWFpbH0JCSUgQXV0aG9yIG9mIHRoZSBkb2N1bWVudGF0aW9uLAorCQkJCQklIGV2ZW4gaWYgbm90IGEgbW9kdWxlIHNlY3Rpb24uCisKKworJSBMZWF2ZSBhdCBsZWFzdCBvbmUgYmxhbmsgbGluZSBhZnRlciB0aGlzLCB0byBzaW1wbGlmeSBhZC1ob2MgdG9vbHMKKyUgdGhhdCBhcmUgc29tZXRpbWVzIHVzZWQgdG8gbWFzc2FnZSB0aGVzZSBmaWxlcy4KK1xtb2R1bGVzeW5vcHNpc3tUaGlzIGlzIGEgb25lLWxpbmUgZGVzY3JpdGlvbiwgZm9yIHRoZSBjaGFwdGVyIGhlYWRlci59CisKKworJSA9PT09IDIuID09PT0KKyUgR2l2ZSBhIHNob3J0IG92ZXJ2aWV3IG9mIHdoYXQgdGhlIG1vZHVsZSBkb2VzLgorJSBJZiBpdCBpcyBwbGF0Zm9ybSBzcGVjaWZpYywgbWVudGlvbiB0aGlzLgorJSBNZW50aW9uIG90aGVyIGltcG9ydGFudCByZXN0cmljdGlvbnMgb3IgZ2VuZXJhbCBvcGVyYXRpbmcgcHJpbmNpcGxlcy4KKyUgRm9yIGV4YW1wbGU6CisKK1RoZSBcbW9kdWxle3NwYW19IG1vZHVsZSBkZWZpbmVzIG9wZXJhdGlvbnMgZm9yIGhhbmRsaW5nIGNhbnMgb2YgU3BhbS4KK0l0IGtub3dzIHRoZSBmb3VyIGdlbmVyYWxseSBhdmFpbGFibGUgU3BhbSB2YXJpZXRpZXMgYW5kIHVuZGVyc3RhbmRzCitib3RoIGNhbiBzaXplcy4KKworQmVjYXVzZSBzcGFtaWZpY2F0aW9uIHJlcXVpcmVzIFxVTklYe30gcHJvY2VzcyBtYW5hZ2VtZW50LCB0aGUgbW9kdWxlCitpcyBvbmx5IGF2YWlsYWJsZSBvbiBnZW51aW5lIFxVTklYe30gc3lzdGVtcy4KKworCislID09PT0gMy4gPT09PQorJSBMaXN0IHRoZSBwdWJsaWMgZnVuY3Rpb25zIGRlZmluZWQgYnkgdGhlIG1vZHVsZS4gIEJlZ2luIHdpdGggYQorJSBzdGFuZGFyZCBwaHJhc2UuICBZb3UgbWF5IGFsc28gbGlzdCB0aGUgZXhjZXB0aW9ucyBhbmQgb3RoZXIgZGF0YQorJSBpdGVtcyBkZWZpbmVkIGluIHRoZSBtb2R1bGUsIGluc29mYXIgYXMgdGhleSBhcmUgaW1wb3J0YW50IGZvciB0aGUKKyUgdXNlci4KKworVGhlIFxtb2R1bGV7c3BhbX0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CisKKyUgLS0tLSAzLjEuIC0tLS0KKyUgRm9yIGVhY2ggZnVuY3Rpb24sIHVzZSBhIGBgZnVuY2Rlc2MnJyBibG9jay4gIFRoaXMgaGFzIGV4YWN0bHkgdHdvCislIHBhcmFtZXRlcnMgKGVhY2ggcGFyYW1ldGVycyBpcyBjb250YWluZWQgaW4gYSBzZXQgb2YgY3VybHkgYnJhY2VzKToKKyUgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgZnVuY3Rpb24gbmFtZSAodGhpcyBhdXRvbWF0aWNhbGx5CislIGdlbmVyYXRlcyBhbiBpbmRleCBlbnRyeSk7IHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRoZSBmdW5jdGlvbidzCislIGFyZ3VtZW50IGxpc3QuICBJZiB0aGVyZSBhcmUgbm8gYXJndW1lbnRzLCB1c2UgYW4gZW1wdHkgcGFpciBvZgorJSBjdXJseSBicmFjZXMuICBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBzZXBhcmF0ZSB0aGUKKyUgYXJndW1lbnRzIHdpdGggYmFja3NsYXNoLWNvbW1hLiAgT3B0aW9uYWwgcGFydHMgb2YgdGhlIHBhcmFtZXRlcgorJSBsaXN0IGFyZSBjb250YWluZWQgaW4gXG9wdGlvbmFsey4uLn0gKHRoaXMgZ2VuZXJhdGVzIGEgc2V0IG9mIHNxdWFyZQorJSBicmFja2V0cyBhcm91bmQgaXRzIHBhcmFtZXRlcikuICBBcmd1bWVudHMgYXJlIGF1dG9tYXRpY2FsbHkgc2V0IGluCislIGl0YWxpY3MgaW4gdGhlIHBhcmFtZXRlciBsaXN0LiAgRWFjaCBhcmd1bWVudCBzaG91bGQgYmUgbWVudGlvbmVkIGF0CislIGxlYXN0IG9uY2UgaW4gdGhlIGRlc2NyaXB0aW9uOyBlYWNoIHVzYWdlIChldmVuIGluc2lkZSBcY29kZXsuLi59KQorJSBzaG91bGQgYmUgZW5jbG9zZWQgaW4gXHZhcnsuLi59LgorCitcYmVnaW57ZnVuY2Rlc2N9e29wZW59e2ZpbGVuYW1lXG9wdGlvbmFseywgbW9kZVxvcHRpb25hbHssIGJ1ZmZlcnNpemV9fX0KK09wZW4gdGhlIGZpbGUgXHZhcntmaWxlbmFtZX0gYXMgYSBjYW4gb2YgU3BhbS4gIFRoZSBvcHRpb25hbAorXHZhcnttb2RlfSBhbmQgXHZhcntidWZmZXJzaXplfSBhcmd1bWVudHMgc3BlY2lmeSB0aGUgcmVhZC93cml0ZSBtb2RlCisoXGNvZGV7J3InfSAoZGVmYXVsdCkgb3IgXGNvZGV7J3cnfSkgYW5kIHRoZSBidWZmZXIgc2l6ZSAoZGVmYXVsdDoKK3N5c3RlbSBkZXBlbmRlbnQpLgorXGVuZHtmdW5jZGVzY30KKworJSAtLS0tIDMuMi4gLS0tLQorJSBEYXRhIGl0ZW1zIGFyZSBkZXNjcmliZWQgdXNpbmcgYSBgYGRhdGFkZXNjJycgYmxvY2suICBUaGlzIGhhcyBvbmx5CislIG9uZSBwYXJhbWV0ZXI6IHRoZSBpdGVtJ3MgbmFtZS4KKworXGJlZ2lue2RhdGFkZXNjfXtjYW5zaXplfQorVGhlIGRlZmF1bHQgY2FuIHNpemUsIGluIG91bmNlcy4gIExlZ2FsIHZhbHVlcyBhcmUgNyBhbmQgMTIuICBUaGUKK2RlZmF1bHQgdmFyaWVzIHBlciBzdXBlcm1hcmtldC4gIFRoaXMgdmFyaWFibGUgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkCitvbmNlIHRoZSBcZnVuY3Rpb257b3BlbigpfSBmdW5jdGlvbiBoYXMgYmVlbiBjYWxsZWQuCitcZW5ke2RhdGFkZXNjfQorCislIC0tLSAzLjMuIC0tLQorJSBFeGNlcHRpb25zIGFyZSBkZXNjcmliZWQgdXNpbmcgYSBgYGV4Y2Rlc2MnJyBibG9jay4gIFRoaXMgaGFzIG9ubHkKKyUgb25lIHBhcmFtZXRlcjogdGhlIGV4Y2VwdGlvbiBuYW1lLiAgRXhjZXB0aW9ucyBkZWZpbmVkIGFzIGNsYXNzZXMgaW4KKyUgdGhlIHNvdXJjZSBjb2RlIHNob3VsZCBiZSBkb2N1bWVudGVkIHVzaW5nIHRoaXMgZW52aXJvbm1lbnQsIGJ1dAorJSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIG11c3QgYmUgb21taXR0ZWQuCisKK1xiZWdpbntleGNkZXNjfXtlcnJvcn0KK0V4Y2VwdGlvbiByYWlzZWQgd2hlbiBhbiBvcGVyYXRpb24gZmFpbHMgZm9yIGEgU3BhbSBzcGVjaWZpYyByZWFzb24uCitUaGUgZXhjZXB0aW9uIGFyZ3VtZW50IGlzIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHJlYXNvbiBvZiB0aGUKK2ZhaWx1cmUuCitcZW5ke2V4Y2Rlc2N9CisKKyUgLS0tLSAzLjQuIC0tLS0KKyUgT3RoZXIgc3RhbmRhcmQgZW52aXJvbm1lbnRzOgorJQorJSAgY2xhc3NkZXNjCS0gUHl0aG9uIGNsYXNzZXM7IHNhbWUgYXJndW1lbnRzIGFyZSBmdW5jZGVzYworJSAgbWV0aG9kZGVzYwktIG1ldGhvZHMsIGxpa2UgZnVuY2Rlc2MgYnV0IGhhcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgCislCQkgIHRvIGdpdmUgdGhlIHR5cGUgbmFtZTogXGJlZ2lue21ldGhvZGRlc2N9W215dHlwZV17bmFtZX17YXJnc30KKyUJCSAgQnkgZGVmYXVsdCwgdGhlIHR5cGUgbmFtZSB3aWxsIGJlIHRoZSBuYW1lIG9mIHRoZQorJQkJICBsYXN0IGNsYXNzIGRlZmluZWQgdXNpbmcgY2xhc3NkZXNjLiAgVGhlIHR5cGUgbmFtZQorJQkJICBpcyByZXF1aXJlZCBpZiB0aGUgdHlwZSBpcyBpbXBsZW1lbnRlZCBpbiBDIChiZWNhdXNlIAorJQkJICB0aGVyZSdzIG5vIGNsYXNzZGVzYykgb3IgaWYgdGhlIGNsYXNzIGlzbid0IGRpcmVjdGx5IAorJQkJICBkb2N1bWVudGVkIChpZiBpdCdzIHByaXZhdGUpLgorJSAgbWVtYmVyZGVzYwktIGRhdGEgbWVtYmVycywgbGlrZSBkYXRhZGVzYywgYnV0IHdpdGggYW4gb3B0aW9uYWwKKyUJCSAgdHlwZSBuYW1lIGxpa2UgbWV0aG9kZGVzYy4KKworCislID09PT0gNC4gPT09PQorJSBOb3cgaXMgcHJvYmFibHkgYSBnb29kIHRpbWUgZm9yIGEgY29tcGxldGUgZXhhbXBsZS4gIChBbHRlcm5hdGl2ZWx5LAorJSBhbiBleGFtcGxlIGdpdmluZyB0aGUgZmxhdm9yIG9mIHRoZSBtb2R1bGUgbWF5IGJlIGdpdmVuIGJlZm9yZSB0aGUKKyUgZGV0YWlsZWQgbGlzdCBvZiBmdW5jdGlvbnMuKQorCitcc3Vic2VjdGlvbntFeGFtcGxlIFxsYWJlbHtzcGFtLWV4YW1wbGV9fQorCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBvcGVuIGEgY2FuIG9mIHNwYW0gdXNpbmcgdGhlCitcbW9kdWxle3NwYW19IG1vZHVsZS4KKworXGJlZ2lue3ZlcmJhdGltfQorPj4+IGltcG9ydCBzcGFtCis+Pj4gY2FuID0gc3BhbS5vcGVuKCcvZXRjL3Bhc3N3ZCcpCis+Pj4gY2FuLmVtcHR5KCkKKz4+PiBjYW4uY2xvc2UoKQorXGVuZHt2ZXJiYXRpbX0KKyUgTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHRyYWlsaW5nICI+Pj4gIiBwcm9tcHQgc2hvd24uCisKKyUgPT09PSA1LiA9PT09CislIElmIHlvdXIgbW9kdWxlIGRlZmluZXMgbmV3IG9iamVjdCB0eXBlcyAoZm9yIGEgYnVpbHQtaW4gbW9kdWxlKSBvcgorJSBjbGFzc2VzIChmb3IgYSBtb2R1bGUgd3JpdHRlbiBpbiBQeXRob24pLCB5b3Ugc2hvdWxkIGxpc3QgdGhlCislIG1ldGhvZHMgYW5kIGluc3RhbmNlIHZhcmlhYmxlcyAoaWYgYW55KSBvZiBlYWNoIHR5cGUgb3IgY2xhc3MgaW4gYQorJSBzZXBhcmF0ZSBzdWJzZWN0aW9uLgorCitcc3Vic2VjdGlvbntTcGFtIE9iamVjdHN9CitcbGFiZWx7c3BhbS1vYmplY3RzfQorJSBUaGlzIGxhYmVsIGlzIGdlbmVyYWxseSB1c2VmdWwgZm9yIHJlZmVyZW5jaW5nIHRoaXMgc2VjdGlvbiwgYnV0IGlzCislIGFsc28gdXNlZCB0byBnaXZlIGEgZmlsZW5hbWUgd2hlbiBnZW5lcmF0aW5nIEhUTUwuCisKK1NwYW0gb2JqZWN0cywgYXMgcmV0dXJuZWQgYnkgXGZ1bmN0aW9ue29wZW4oKX0gYWJvdmUsIGhhdmUgdGhlCitmb2xsb3dpbmcgbWV0aG9kczoKKworXGJlZ2lue21ldGhvZGRlc2N9W3NwYW1de2VtcHR5fXt9CitFbXB0eSB0aGUgY2FuIGludG8gdGhlIHRyYXNoLgorXGVuZHttZXRob2RkZXNjfQpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL3RleGlucHV0cy9ib2lsZXJwbGF0ZS50ZXggYi9kb2MvdG9vbHMvdGV4aW5wdXRzL2JvaWxlcnBsYXRlLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjk2ZGJkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL3RleGlucHV0cy9ib2lsZXJwbGF0ZS50ZXgKQEAgLTAsMCArMSwxMCBAQAorXGF1dGhvcntHdWlkbyB2YW4gUm9zc3VtXFwKKwlGcmVkIEwuIERyYWtlLCBKci4sIGVkaXRvcn0KK1xhdXRob3JhZGRyZXNzeworCVxzdHJvbmd7UHl0aG9uTGFic31cXAorCUUtbWFpbDogXGVtYWlse3B5dGhvbi1kb2NzQHB5dGhvbi5vcmd9Cit9CisKK1xkYXRle0FwcmlsIDE1LCAyMDAxfQkJJSBYWFggdXBkYXRlIGJlZm9yZSByZWxlYXNlIQorXHJlbGVhc2V7Mi4xfQkJCSUgc29mdHdhcmUgcmVsZWFzZSwgbm90IGRvY3VtZW50YXRpb24KK1xzZXRzaG9ydHZlcnNpb257Mi4xfQkJJSBtYWpvci5taW5vciBvbmx5IGZvciBzb2Z0d2FyZQpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL3RleGlucHV0cy9jb3B5cmlnaHQudGV4IGIvZG9jL3Rvb2xzL3RleGlucHV0cy9jb3B5cmlnaHQudGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNDVkY2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvdGV4aW5wdXRzL2NvcHlyaWdodC50ZXgKQEAgLTAsMCArMSwxMDggQEAKK1xiZWdpbntzbWFsbH0KK0NvcHlyaWdodCBcY29weXJpZ2h0e30gMjAwMSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK0NvcHlyaWdodCBcY29weXJpZ2h0e30gMjAwMCBCZU9wZW4uY29tLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworQ29weXJpZ2h0IFxjb3B5cmlnaHR7fSAxOTk1LTIwMDAgQ29ycG9yYXRpb24gZm9yIE5hdGlvbmFsIFJlc2VhcmNoIEluaXRpYXRpdmVzLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworQ29weXJpZ2h0IFxjb3B5cmlnaHR7fSAxOTkxLTE5OTUgU3RpY2h0aW5nIE1hdGhlbWF0aXNjaCBDZW50cnVtLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworJSViZWdpbntsYXRleG9ubHl9CitcdnNraXAgNG1tCislJWVuZHtsYXRleG9ubHl9CisKK1xjZW50ZXJsaW5le1xzdHJvbmd7QkVPUEVOLkNPTSBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgUFlUSE9OIDIuMH19CisKK1xjZW50ZXJsaW5le1xzdHJvbmd7QkVPUEVOIFBZVEhPTiBPUEVOIFNPVVJDRSBMSUNFTlNFIEFHUkVFTUVOVCBWRVJTSU9OIDF9fQorCitcYmVnaW57ZW51bWVyYXRlfQorCitcaXRlbQorVGhpcyBMSUNFTlNFIEFHUkVFTUVOVCBpcyBiZXR3ZWVuIEJlT3Blbi5jb20gKGBgQmVPcGVuJycpLCBoYXZpbmcgYW4KK29mZmljZSBhdCAxNjAgU2FyYXRvZ2EgQXZlbnVlLCBTYW50YSBDbGFyYSwgQ0EgOTUwNTEsIGFuZCB0aGUKK0luZGl2aWR1YWwgb3IgT3JnYW5pemF0aW9uIChgYExpY2Vuc2VlJycpIGFjY2Vzc2luZyBhbmQgb3RoZXJ3aXNlCit1c2luZyB0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybSBhbmQgaXRzIGFzc29jaWF0ZWQKK2RvY3VtZW50YXRpb24gKGBgdGhlIFNvZnR3YXJlJycpLgorCitcaXRlbQorU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBCZU9wZW4gUHl0aG9uIExpY2Vuc2UKK0FncmVlbWVudCwgQmVPcGVuIGhlcmVieSBncmFudHMgTGljZW5zZWUgYSBub24tZXhjbHVzaXZlLAorcm95YWx0eS1mcmVlLCB3b3JsZC13aWRlIGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBhbmFseXplLCB0ZXN0LCBwZXJmb3JtCithbmQvb3IgZGlzcGxheSBwdWJsaWNseSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzLCBkaXN0cmlidXRlLCBhbmQKK290aGVyd2lzZSB1c2UgdGhlIFNvZnR3YXJlIGFsb25lIG9yIGluIGFueSBkZXJpdmF0aXZlIHZlcnNpb24sCitwcm92aWRlZCwgaG93ZXZlciwgdGhhdCB0aGUgQmVPcGVuIFB5dGhvbiBMaWNlbnNlIGlzIHJldGFpbmVkIGluIHRoZQorU29mdHdhcmUsIGFsb25lIG9yIGluIGFueSBkZXJpdmF0aXZlIHZlcnNpb24gcHJlcGFyZWQgYnkgTGljZW5zZWUuCisKK1xpdGVtCitCZU9wZW4gaXMgbWFraW5nIHRoZSBTb2Z0d2FyZSBhdmFpbGFibGUgdG8gTGljZW5zZWUgb24gYW4gYGBBUyBJUycnCitiYXNpcy4gIEJFT1BFTiBNQUtFUyBOTyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUgorSU1QTElFRC4gIEJZIFdBWSBPRiBFWEFNUExFLCBCVVQgTk9UIExJTUlUQVRJT04sIEJFT1BFTiBNQUtFUyBOTyBBTkQKK0RJU0NMQUlNUyBBTlkgUkVQUkVTRU5UQVRJT04gT1IgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MKK0ZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFIE9SIFRIQVQgVEhFIFVTRSBPRiBUSEUgU09GVFdBUkUgV0lMTCBOT1QKK0lORlJJTkdFIEFOWSBUSElSRCBQQVJUWSBSSUdIVFMuCisKK1xpdGVtCitCRU9QRU4gU0hBTEwgTk9UIEJFIExJQUJMRSBUTyBMSUNFTlNFRSBPUiBBTlkgT1RIRVIgVVNFUlMgT0YgVEhFCitTT0ZUV0FSRSBGT1IgQU5ZIElOQ0lERU5UQUwsIFNQRUNJQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBMT1NTCitBUyBBIFJFU1VMVCBPRiBVU0lORywgTU9ESUZZSU5HIE9SIERJU1RSSUJVVElORyBUSEUgU09GVFdBUkUsIE9SIEFOWQorREVSSVZBVElWRSBUSEVSRU9GLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIFRIRVJFT0YuCisKK1xpdGVtCitUaGlzIExpY2Vuc2UgQWdyZWVtZW50IHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgdXBvbiBhIG1hdGVyaWFsCiticmVhY2ggb2YgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zLgorCitcaXRlbQorVGhpcyBMaWNlbnNlIEFncmVlbWVudCBzaGFsbCBiZSBnb3Zlcm5lZCBieSBhbmQgaW50ZXJwcmV0ZWQgaW4gYWxsCityZXNwZWN0cyBieSB0aGUgbGF3IG9mIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhLCBleGNsdWRpbmcgY29uZmxpY3Qgb2YKK2xhdyBwcm92aXNpb25zLiAgTm90aGluZyBpbiB0aGlzIExpY2Vuc2UgQWdyZWVtZW50IHNoYWxsIGJlIGRlZW1lZCB0bworY3JlYXRlIGFueSByZWxhdGlvbnNoaXAgb2YgYWdlbmN5LCBwYXJ0bmVyc2hpcCwgb3Igam9pbnQgdmVudHVyZQorYmV0d2VlbiBCZU9wZW4gYW5kIExpY2Vuc2VlLiAgVGhpcyBMaWNlbnNlIEFncmVlbWVudCBkb2VzIG5vdCBncmFudAorcGVybWlzc2lvbiB0byB1c2UgQmVPcGVuIHRyYWRlbWFya3Mgb3IgdHJhZGUgbmFtZXMgaW4gYSB0cmFkZW1hcmsKK3NlbnNlIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBvciBzZXJ2aWNlcyBvZiBMaWNlbnNlZSwgb3IgYW55Cit0aGlyZCBwYXJ0eS4gIEFzIGFuIGV4Y2VwdGlvbiwgdGhlIGBgQmVPcGVuIFB5dGhvbicnIGxvZ29zIGF2YWlsYWJsZQorYXQgaHR0cDovL3d3dy5weXRob25sYWJzLmNvbS9sb2dvcy5odG1sIG1heSBiZSB1c2VkIGFjY29yZGluZyB0byB0aGUKK3Blcm1pc3Npb25zIGdyYW50ZWQgb24gdGhhdCB3ZWIgcGFnZS4KKworXGl0ZW0KK0J5IGNvcHlpbmcsIGluc3RhbGxpbmcgb3Igb3RoZXJ3aXNlIHVzaW5nIHRoZSBzb2Z0d2FyZSwgTGljZW5zZWUKK2FncmVlcyB0byBiZSBib3VuZCBieSB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlCitBZ3JlZW1lbnQuCitcZW5ke2VudW1lcmF0ZX0KKworCitcY2VudGVybGluZXtcc3Ryb25ne0NOUkkgT1BFTiBTT1VSQ0UgR1BMLUNPTVBBVElCTEUgTElDRU5TRSBBR1JFRU1FTlR9fQorCitQeXRob24gMS42LjEgaXMgbWFkZSBhdmFpbGFibGUgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgaW4KK0NOUkkncyBMaWNlbnNlIEFncmVlbWVudC4gIFRoaXMgQWdyZWVtZW50IHRvZ2V0aGVyIHdpdGggUHl0aG9uIDEuNi4xIG1heQorYmUgbG9jYXRlZCBvbiB0aGUgSW50ZXJuZXQgdXNpbmcgdGhlIGZvbGxvd2luZyB1bmlxdWUsIHBlcnNpc3RlbnQKK2lkZW50aWZpZXIgKGtub3duIGFzIGEgaGFuZGxlKTogMTg5NS4yMi8xMDEzLiAgVGhpcyBBZ3JlZW1lbnQgbWF5IGFsc28KK2JlIG9idGFpbmVkIGZyb20gYSBwcm94eSBzZXJ2ZXIgb24gdGhlIEludGVybmV0IHVzaW5nIHRoZSBmb2xsb3dpbmcKK1VSTDogXHVybHtodHRwOi8vaGRsLmhhbmRsZS5uZXQvMTg5NS4yMi8xMDEzfS4KKworCitcY2VudGVybGluZXtcc3Ryb25ne0NXSSBQRVJNSVNTSU9OUyBTVEFURU1FTlQgQU5EIERJU0NMQUlNRVJ9fQorCitDb3B5cmlnaHQgXGNvcHlyaWdodHt9IDE5OTEgLSAxOTk1LCBTdGljaHRpbmcgTWF0aGVtYXRpc2NoIENlbnRydW0KK0Ftc3RlcmRhbSwgVGhlIE5ldGhlcmxhbmRzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KK3N1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgU3RpY2h0aW5nIE1hdGhlbWF0aXNjaAorQ2VudHJ1bSBvciBDV0kgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8KK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvcgorcGVybWlzc2lvbi4KKworU1RJQ0hUSU5HIE1BVEhFTUFUSVNDSCBDRU5UUlVNIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTworVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgU1RJQ0hUSU5HIE1BVEhFTUFUSVNDSCBDRU5UUlVNIEJFIExJQUJMRQorRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKK1dIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQKK09GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCitcZW5ke3NtYWxsfQpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL3RleGlucHV0cy9kaXN0dXRpbHMuc3R5IGIvZG9jL3Rvb2xzL3RleGlucHV0cy9kaXN0dXRpbHMuc3R5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOTgwY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvdGV4aW5wdXRzL2Rpc3R1dGlscy5zdHkKQEAgLTAsMCArMSwzMyBAQAorJQorJSBMYVRlWCBjb21tYW5kcyBhbmQgbWFjcm9zIG5lZWRlZCBmb3IgdGhlIHR3byBEaXN0dXRpbHMgbWFudWFscywKKyUgaW5zdC50ZXggYW5kIGRpc3QudGV4LgorJQorJSAkSWQ6IGRpc3R1dGlscy5zdHksdiAxLjEuMS4xIDIwMDEvMDcvMTYgMTE6NTM6MDMgbXNqb2dyZW4gRXhwICQKKyUKKworJSBNeSBncmlwZSBsaXN0IGFib3V0IHRoZSBQeXRob24gc3R5bGUgZmlsZXM6CislICAqIEkgd2FudCBpdGFsaWNzIGluIHZlcmJhdGltIGVudmlyb25tZW50cyBmb3IgdmFyaWFibGUKKyUgICAgdGV4dCAodmVyYmF0aW0uc3R5PykKKyUgICogSSBoYXRlIGVzY2FwaW5nIHVuZGVyc2NvcmVzICh1cmwuc3R5IGZpeGVzIHRoaXMpCisKKyUgJ1xjb21tYW5kJyBpcyBmb3IgRGlzdHV0aWxzIGNvbW1hbmRzIHdoaWNoLCBkZXBlbmRpbmcgb24geW91cgorJSBwZXJzcGVjdGl2ZSwgYXJlIGp1c3QgYXJndW1lbnRzIHRvIHRoZSBzZXR1cCBzY3JpcHQsIG9yIHN1Yi0KKyUgY29tbWFuZHMgb2YgdGhlIHNldHVwIHNjcmlwdCwgb3IgdGhlIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQKKyUgZWFjaCAiY29tbWFuZCIuCitcbmV3Y29tbWFuZHtcY29tbWFuZH1bMV17XGNvZGV7IzF9fQorCislICdcb3B0aW9uJyBpcyBmb3IgRGlzdHV0aWxzIG9wdGlvbnMgKmluKiB0aGUgc2V0dXAgc2NyaXB0LiAgQ29tbWFuZC0KKyUgbGluZSBvcHRpb25zICp0byogdGhlIHNldHVwIHNjcmlwdCBhcmUgbWFya2VkIHVwIGluIHRoZSB1c3VhbAorJSB3YXksIGllLiB3aXRoICdccHJvZ3JhbW9wdCcgb3IgJ1xsb25ncHJvZ3JhbW9wdCcKK1xuZXdjb21tYW5ke1xvcHRpb259WzFde1x0ZXh0c2Z7XHNtYWxseyMxfX19CisKKyUgJ1xmaWxldmFyJyBpcyBmb3IgdmFyaWFibGUgY29tcG9uZW50cyBvZiBmaWxlL3BhdGggbmFtZXMgLS0gZWcuCislIHdoZW4geW91IHB1dCAncHJlZml4JyBpbiBhIHBhdGhuYW1lLCB5b3UgbWFyayBpdCB1cCB3aXRoCislICdcZmlsZXZhcicgc28gdGhhdCBpdCBzdGlsbCBsb29rcyBwYXRobmFtZS1pc2gsIGJ1dCBpcworJSBkaXN0aW5ndWlzaGVkIGZyb20gdGhlIGxpdGVyYWwgcGFydCBvZiB0aGUgcGF0aC4gIEZyZWQgc2F5cworJSB0aGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQganVzdCBmaW5lIHdpdGggJ1x2YXInLCBidXQgSSB2aW9sZW50bHkKKyUgZGlzYWdyZWUuICBQaXN0b2xzIGF0IGRhd24gd2lsbCBzb3J0IHRoaXMgb25lIG91dC4KK1xuZXdjb21tYW5ke1xmaWxldmFyfVsxXXt7XHRleHRzbHtcZmlsZW5xeyMxfX19fQorCislIEp1c3Qgd2hpbGUgdGhlIGNvZGUgYW5kIGRvY3MgYXJlIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50LgorXG5ld2NvbW1hbmR7XFhYWH1bMV17XHRleHRiZnsqKiMxKip9fQpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL3RleGlucHV0cy9mbmN5Y2hhcC5zdHkgYi9kb2MvdG9vbHMvdGV4aW5wdXRzL2ZuY3ljaGFwLnN0eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGQ3Yjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL3RleGlucHV0cy9mbmN5Y2hhcC5zdHkKQEAgLTAsMCArMSw0MzMgQEAKKyUlJSBEZXJpdmVkIGZyb20gdGhlIG9yaWdpbmFsIGZuY3ljaGFwLnN0eSwKKyUlJSBidXQgY2hhbmdlZCBgYFRXRUxWJycgdG8gYGBUV0VMVkUnJy4KKworJSUlIENvcHlyaWdodCAgIFVsZiBBLiBMaW5kZ3JlbgorJSUlICAgICAgICAgICAgIERlcGFydG1lbnQgb2YgQXBwbGllZCBFbGVjdHJvbmljcworJSUlICAgICAgICAgICAgIENoYWxtZXJzIFVuaXZlcnNpdHkgb2YgVGVjaG5vbG9neQorJSUlICAgICAgICAgICAgIFMtNDEyIDk2IEdvdGhlbmJ1cmcsIFN3ZWRlbgorJSUlICAgICAgICAgICAgIEUtbWFpbCBsaW5kZ3JlbkBhZS5jaGFsbWVycy5zZQorJSUlCislJSUgTm90ZSAgICAgICAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1vZGlmeSB0aGlzIGZpbGUgdW5kZXIKKyUlJSAgICAgICAgICAgICB0aGUgY29uZGl0aW9uIHRoYXQgaXQgaXMgc2F2ZWQgdXNpbmcgYW5vdGhlcgorJSUlICAgICAgICAgICAgIGZpbGUgYW5kIHBhY2thZ2UgbmFtZS4KKyUlJQorJSUlIFJldmlzaW9uICAgIDEuMQorJSUlCislJSUgICAgICAgICAgICAgSmFuLiA4dGggTW9kaWZpZWQgcGFja2FnZSBuYW1lIGJhc2UgZGF0ZSBvcHRpb24KKyUlJSAgICAgICAgICAgICBKYW4uIDIydGggTW9kaWZpZWQgRm1OIGFuZCBGbVRpIGZvciBlcnJvciBpbiBib29rLmNscworJSUlICAgICAgICAgICAgICAgICAgXE1ha2VVcHBlcmNhc2V7I30tPntcTWFrZVVwcGVyY2FzZSN9CislJSUgICAgICAgICAgICAgQXByLiA2dGggTW9kaWZpZWQgTGVubnkgb3B0aW9uIHRvIHByZXZlbnQgdW5kZXNpcmVkIAorJSUlICAgICAgICAgICAgICAgICAgc2tpcCBvZiBsaW5lLgorJSUlICAgICAgICAgICAgIE5vdi4gOHRoIEZpeGVkIFxAY2hhcGFwcCBmb3IgQU1TCislJSUgICAgICAgICAgICAgRmViLiAxMXRoIEZpeGVkIGFwcGVuZGl4IHByb2JsZW0gcmVsYXRlZCB0byBCamFybmUKKyUlJSBMYXN0IG1vZGlmaWVkICAgIEZlYi4gMTF0aCAxOTk4CisKK1xOZWVkc1RlWEZvcm1hdHtMYVRlWDJlfVsxOTk1LzEyLzAxXQorXFByb3ZpZGVzUGFja2FnZXtmbmN5Y2hhcH0KKyAgICAgICAgICAgICBbMTk5Ny8wNC8wNiB2MS4xMQorICAgICAgICAgICAgICAgICBMYVRlWCBwYWNrYWdlIChSZXZpc2VkIGNoYXB0ZXJzKV0KKworJSUlJSBERUZJTklUSU9OIE9GIENoYXBhcHAgdmFyaWFibGVzCitcbmV3Y29tbWFuZHtcQ05WfXtcaHVnZVxiZnNlcmllc30KK1xuZXdjb21tYW5ke1xDaE5hbWVWYXJ9WzFde1xyZW5ld2NvbW1hbmR7XENOVn17IzF9fQorCisKKyUlJSUgREVGSU5JVElPTiBPRiBUaGVDaGFwdGVyIHZhcmlhYmxlcworXG5ld2NvbW1hbmR7XENOb1Z9e1xodWdlXGJmc2VyaWVzfQorXG5ld2NvbW1hbmR7XENoTnVtVmFyfVsxXXtccmVuZXdjb21tYW5ke1xDTm9WfXsjMX19CisKK1xuZXdpZlxpZlVDTgorXFVDTmZhbHNlCitcbmV3aWZcaWZMQ04KK1xMQ05mYWxzZQorXGRlZlxDaE5hbWVMb3dlckNhc2V7XExDTnRydWVcVUNOZmFsc2V9CitcZGVmXENoTmFtZVVwcGVyQ2FzZXtcVUNOdHJ1ZVxMQ05mYWxzZX0KK1xkZWZcQ2hOYW1lQXNJc3tcVUNOZmFsc2VcTENOZmFsc2V9CisKKyUlJSUlIEZpeCBmb3IgQU1TQm9vayA5NzEwMDgKKworXEBpZnVuZGVmaW5lZHtAY2hhcGFwcH17XGxldFxAY2hhcGFwcFxjaGFwdGVybmFtZX17fQorCisKKyUlJSUlIEZpeCBmb3IgQmphcm5lIGFuZCBhcHBlbmRpeCA5ODAyMTEKKworXG5ld2lmXGlmaW5hcHAKK1xpbmFwcGZhbHNlCitccmVuZXdjb21tYW5kXGFwcGVuZGl4e1xwYXIKKyAgXHNldGNvdW50ZXJ7Y2hhcHRlcn17MH0lCisgIFxzZXRjb3VudGVye3NlY3Rpb259ezB9JQorICBcaW5hcHB0cnVlJQorICBccmVuZXdjb21tYW5kXEBjaGFwYXBwe1xhcHBlbmRpeG5hbWV9JQorICBccmVuZXdjb21tYW5kXHRoZWNoYXB0ZXJ7XEBBbHBoXGNAY2hhcHRlcn19CisKKyUlJSUlCisKK1xuZXdjb21tYW5ke1xGbU59WzFdeyUKK1xpZlVDTgorICAge1xNYWtlVXBwZXJjYXNlIzF9XExDTmZhbHNlCitcZWxzZQorICAgXGlmTENOCisgICAgICB7XE1ha2VMb3dlcmNhc2UjMX1cVUNOZmFsc2UKKyAgIFxlbHNlICMxCisgICBcZmkKK1xmaX0KKworCislJSUlIERFRklOSVRJT04gT0YgVGl0bGUgdmFyaWFibGVzCitcbmV3Y29tbWFuZHtcQ1RWfXtcSHVnZVxiZnNlcmllc30KK1xuZXdjb21tYW5ke1xDaFRpdGxlVmFyfVsxXXtccmVuZXdjb21tYW5ke1xDVFZ9eyMxfX0KKworJSUlJSBERUZJTklUSU9OIE9GIHRoZSBiYXNpYyBydWxlIHdpZHRoCitcbmV3bGVuZ3Roe1xSV30KK1xzZXRsZW5ndGh7XFJXfXsxcHR9CitcbmV3Y29tbWFuZHtcQ2hSdWxlV2lkdGh9WzFde1xzZXRsZW5ndGh7XFJXfXsjMX19CisKK1xuZXdpZlxpZlVDVAorXFVDVGZhbHNlCitcbmV3aWZcaWZMQ1QKK1xMQ1RmYWxzZQorXGRlZlxDaFRpdGxlTG93ZXJDYXNle1xMQ1R0cnVlXFVDVGZhbHNlfQorXGRlZlxDaFRpdGxlVXBwZXJDYXNle1xVQ1R0cnVlXExDVGZhbHNlfQorXGRlZlxDaFRpdGxlQXNJc3tcVUNUZmFsc2VcTENUZmFsc2V9CitcbmV3Y29tbWFuZHtcRm1UaX1bMV17JQorXGlmVUNUCisKKyAgIHtcTWFrZVVwcGVyY2FzZSMxfVxMQ1RmYWxzZQorXGVsc2UKKyAgIFxpZkxDVAorICAgICAge1xNYWtlTG93ZXJjYXNlIzF9XFVDVGZhbHNlCisgICBcZWxzZSAjMQorICAgXGZpCitcZml9CisKKworCitcbmV3bGVuZ3Roe1xteWxlbn0KK1xuZXdsZW5ndGh7XG15aGl9CitcbmV3bGVuZ3Roe1xweH0KK1xuZXdsZW5ndGh7XHB5fQorXG5ld2xlbmd0aHtccHl5fQorXG5ld2xlbmd0aHtccHh4fQorCisKK1xkZWZcbWdocnVsZWZpbGwjMXtcbGVhdmV2bW9kZVxsZWFkZXJzXGhydWxlXEBoZWlnaHQgIzFcaGZpbGxca2Vyblx6QH0KKworXG5ld2NvbW1hbmR7XERPQ0h9eyUKKyAgXENOVlxGbU57XEBjaGFwYXBwfVxzcGFjZSBcQ05vVlx0aGVjaGFwdGVyCisgIFxwYXJcbm9icmVhaworICBcdnNraXAgMjBccEAKKyAgfQorXG5ld2NvbW1hbmR7XERPVEl9WzFdeyUKKyAgICBcQ1RWXEZtVGl7IzF9XHBhclxub2JyZWFrCisgICAgXHZza2lwIDQwXHBACisgICAgfQorXG5ld2NvbW1hbmR7XERPVElTfVsxXXslCisgICAgXENUVlxGbVRpeyMxfVxwYXJcbm9icmVhaworICAgIFx2c2tpcCA0MFxwQAorICAgIH0KKworJSUlJSUlIFNPTk5ZIERFRgorCitcRGVjbGFyZU9wdGlvbntTb25ueX17JQorICBcQ2hOYW1lVmFye1xMYXJnZVxzZn0KKyAgXENoTnVtVmFye1xIdWdlfQorICBcQ2hUaXRsZVZhcntcTGFyZ2Vcc2Z9CisgIFxDaFJ1bGVXaWR0aHswLjVwdH0KKyAgXENoTmFtZVVwcGVyQ2FzZQorICBccmVuZXdjb21tYW5ke1xET0NIfXslCisgICAgXHJhZ2dlZGxlZnQKKyAgICBcQ05WXEZtTntcQGNoYXBhcHB9XHNwYWNlIFxDTm9WXHRoZWNoYXB0ZXIKKyAgICBccGFyXG5vYnJlYWsKKyAgICBcdnNraXAgNDBccEB9CisgIFxyZW5ld2NvbW1hbmR7XERPVEl9WzFdeyUKKyAgICBcQ1RWXHJhZ2dlZGxlZnRcbWdocnVsZWZpbGx7XFJXfVxwYXJcbm9icmVhaworICAgIFx2c2tpcCA1XHBACisgICAgXENUVlxGbVRpeyMxfVxwYXJcbm9icmVhaworICAgIFxtZ2hydWxlZmlsbHtcUld9XHBhclxub2JyZWFrCisgICAgXHZza2lwIDQwXHBAfQorICBccmVuZXdjb21tYW5ke1xET1RJU31bMV17JQorICAgIFxDVFZccmFnZ2VkbGVmdFxtZ2hydWxlZmlsbHtcUld9XHBhclxub2JyZWFrCisgICAgXHZza2lwIDVccEAKKyAgICBcQ1RWXEZtVGl7IzF9XHBhclxub2JyZWFrCisgICAgXG1naHJ1bGVmaWxse1xSV31ccGFyXG5vYnJlYWsKKyAgICBcdnNraXAgNDBccEB9Cit9CisKKyUlJSUlJSBMRU5OWSBERUYKKworXERlY2xhcmVPcHRpb257TGVubnl9eyUKKworICBcQ2hOYW1lVmFye1xmb250c2l6ZXsxNH17MTZ9XHVzZWZvbnR7T1QxfXtwaHZ9e219e259XHNlbGVjdGZvbnR9CisgIFxDaE51bVZhcntcZm9udHNpemV7NjB9ezYyfVx1c2Vmb250e09UMX17cHRtfXttfXtufVxzZWxlY3Rmb250fQorICBcQ2hUaXRsZVZhcntcSHVnZVxiZnNlcmllc1xybX0KKyAgXENoUnVsZVdpZHRoezFwdH0KKyAgXHJlbmV3Y29tbWFuZHtcRE9DSH17JQorICAgIFxzZXR0b3dpZHRoe1xweH17XENOVlxGbU57XEBjaGFwYXBwfX0KKyAgICBcYWRkdG9sZW5ndGh7XHB4fXsycHR9CisgICAgXHNldHRvaGVpZ2h0e1xweX17XENOVlxGbU57XEBjaGFwYXBwfX0KKyAgICBcYWRkdG9sZW5ndGh7XHB5fXsxcHR9CisKKyAgICBcc2V0dG93aWR0aHtcbXlsZW59e1xDTlZcRm1Oe1xAY2hhcGFwcH1cc3BhY2VcQ05vVlx0aGVjaGFwdGVyfQorICAgIFxhZGR0b2xlbmd0aHtcbXlsZW59ezFwdH0KKyAgICBcc2V0dG93aWR0aHtccHh4fXtcQ05vVlx0aGVjaGFwdGVyfQorICAgIFxhZGR0b2xlbmd0aHtccHh4fXstMXB0fQorCisgICAgXHNldHRvaGVpZ2h0e1xweXl9e1xDTm9WXHRoZWNoYXB0ZXJ9CisgICAgXGFkZHRvbGVuZ3Roe1xweXl9ey0ycHR9CisgICAgXHNldGxlbmd0aHtcbXloaX17XHB5eX0KKyAgICBcYWRkdG9sZW5ndGh7XG15aGl9ey0xXHB5fQorICAgIFxwYXIKKyAgICBccGFyYm94W2Jde1x0ZXh0d2lkdGh9eyUKKyAgICBccnVsZVtccHlde1xSV317XG15aGl9JQorICAgIFxoc2tpcCAtXFJXJQorICAgIFxydWxlW1xweXlde1xweH17XFJXfSUKKyAgICBcaHNraXAgLVxweCUKKyAgICBccmFnZ2VkcmlnaHQlCisgICAgXENOVlxGbU57XEBjaGFwYXBwfVxzcGFjZVxDTm9WXHRoZWNoYXB0ZXIlCisgICAgXGhza2lwMXB0JQorICAgIFxtZ2hydWxlZmlsbHtcUld9JQorICAgIFxydWxle1xSV317XHB5eX1ccGFyXG5vYnJlYWslCisgICAgXHZza2lwIC1cYmFzZWxpbmVza2lwJQorICAgIFx2c2tpcCAtXHB5eSUKKyAgICBcaHNraXAgXG15bGVuJQorICAgIFxtZ2hydWxlZmlsbHtcUld9XHBhclxub2JyZWFrJQorICAgIFx2c2tpcCBccHl5fSUKKyAgICBcdnNraXAgMjBccEB9CisgCisKKyAgXHJlbmV3Y29tbWFuZHtcRE9USX1bMV17JQorICAgIFxyYWdnZWRyaWdodAorICAgIFxDVFZcRm1UaXsjMX1ccGFyXG5vYnJlYWsKKyAgICBcdnNraXAgNDBccEB9CisKKyAgXHJlbmV3Y29tbWFuZHtcRE9USVN9WzFdeyUKKyAgICBccmFnZ2VkcmlnaHQKKyAgICBcQ1RWXEZtVGl7IzF9XHBhclxub2JyZWFrCisgICAgXHZza2lwIDQwXHBAfQorIH0KKworCislJSUlJSUlIEdMRU5OIERFRgorCisKK1xEZWNsYXJlT3B0aW9ue0dsZW5ufXslCisgIFxDaE5hbWVWYXJ7XGJmc2VyaWVzXExhcmdlXHNmfQorICBcQ2hOdW1WYXJ7XEh1Z2V9CisgIFxDaFRpdGxlVmFye1xiZnNlcmllc1xMYXJnZVxybX0KKyAgXENoUnVsZVdpZHRoezFwdH0KKyAgXENoTmFtZVVwcGVyQ2FzZQorICBcQ2hUaXRsZVVwcGVyQ2FzZQorICBccmVuZXdjb21tYW5ke1xET0NIfXslCisgICAgXHNldHRvaGVpZ2h0e1xteWhpfXtcQ1RWXEZtVGl7VGVzdH19CisgICAgXHNldGxlbmd0aHtccHl9e1xiYXNlbGluZXNraXB9CisgICAgXGFkZHRvbGVuZ3Roe1xweX17XFJXfQorICAgIFxhZGR0b2xlbmd0aHtccHl9e1xteWhpfQorICAgIFxzZXRsZW5ndGh7XHB5eX17XHB5fQorICAgIFxhZGR0b2xlbmd0aHtccHl5fXstMVxSV30KKyAgICAgCisgICAgXHJhZ2dlZHJpZ2h0CisgICAgXENOVlxGbU57XEBjaGFwYXBwfVxzcGFjZVxDTm9WXHRoZWNoYXB0ZXIKKyAgICBcaHNraXAgM3B0XG1naHJ1bGVmaWxse1xSV31ccnVsZVstMVxweXldezJcUld9e1xweX1ccGFyXG5vYnJlYWt9CisKKyAgXHJlbmV3Y29tbWFuZHtcRE9USX1bMV17JQorICAgIFxhZGR0b2xlbmd0aHtccHl5fXstNHB0fQorICAgIFxzZXR0b2hlaWdodHtcbXloaX17XENUVlxGbVRpeyMxfX0KKyAgICBcYWRkdG9sZW5ndGh7XG15aGl9e1xweX0KKyAgICBcYWRkdG9sZW5ndGh7XG15aGl9ey0xXFJXfQorICAgIFx2c2tpcCAtMVxweXkKKyAgICBccnVsZXsyXFJXfXtcbXloaX1cbWdocnVsZWZpbGx7XFJXfVxoc2tpcCAycHQKKyAgICBccmFnZ2VkbGVmdFxDVFZcRm1UaXsjMX1ccGFyXG5vYnJlYWsKKyAgICBcdnNraXAgODBccEB9CisKKyAgXHJlbmV3Y29tbWFuZHtcRE9USVN9WzFdeyUKKyAgICBcc2V0bGVuZ3Roe1xweX17MTBwdH0KKyAgICBcc2V0bGVuZ3Roe1xweXl9e1xweX0KKyAgICBcYWRkdG9sZW5ndGh7XHB5eX17XFJXfQorICAgIFxzZXRsZW5ndGh7XG15aGl9e1xiYXNlbGluZXNraXB9CisgICAgXGFkZHRvbGVuZ3Roe1xteWhpfXtccHl5fQorICAgIFxtZ2hydWxlZmlsbHtcUld9XHJ1bGVbLTFccHldezJcUld9e1xweXl9XHBhclxub2JyZWFrCislICAgIFxhZGR0b2xlbmd0aHt9e30KK1x2c2tpcCAtMVxiYXNlbGluZXNraXAKKyAgICBccnVsZXsyXFJXfXtcbXloaX1cbWdocnVsZWZpbGx7XFJXfVxoc2tpcCAycHQKKyAgICBccmFnZ2VkbGVmdFxDVFZcRm1UaXsjMX1ccGFyXG5vYnJlYWsKKyAgICBcdnNraXAgNjBccEB9CisgIH0KKworJSUlJSUlJSBDT05OWSBERUYKKworXERlY2xhcmVPcHRpb257Q29ubnl9eyUKKyAgXENoTmFtZVVwcGVyQ2FzZQorICBcQ2hUaXRsZVVwcGVyQ2FzZSAgCisgIFxDaE5hbWVWYXJ7XGNlbnRlcmluZ1xIdWdlXHJtXGJmc2VyaWVzfQorICBcQ2hOdW1WYXJ7XEh1Z2V9CisgIFxDaFRpdGxlVmFye1xjZW50ZXJpbmdcSHVnZVxybX0KKyAgXENoUnVsZVdpZHRoezJwdH0KKworICBccmVuZXdjb21tYW5ke1xET0NIfXslCisgICAgXG1naHJ1bGVmaWxsezNcUld9XHBhclxub2JyZWFrCisgICAgXHZza2lwIC0wLjVcYmFzZWxpbmVza2lwCisgICAgXG1naHJ1bGVmaWxse1xSV31ccGFyXG5vYnJlYWsKKyAgICBcQ05WXEZtTntcQGNoYXBhcHB9XHNwYWNlIFxDTm9WXHRoZWNoYXB0ZXIKKyAgICBccGFyXG5vYnJlYWsKKyAgICBcdnNraXAgLTAuNVxiYXNlbGluZXNraXAKKyAgIH0KKyAgXHJlbmV3Y29tbWFuZHtcRE9USX1bMV17JQorICAgIFxtZ2hydWxlZmlsbHtcUld9XHBhclxub2JyZWFrCisgICAgXENUVlxGbVRpeyMxfVxwYXJcbm9icmVhaworICAgIFx2c2tpcCA2MFxwQAorICAgIH0KKyAgXHJlbmV3Y29tbWFuZHtcRE9USVN9WzFdeyUKKyAgICBcbWdocnVsZWZpbGx7XFJXfVxwYXJcbm9icmVhaworICAgIFxDVFZcRm1UaXsjMX1ccGFyXG5vYnJlYWsKKyAgICBcdnNraXAgNjBccEAKKyAgICB9CisgIH0KKworJSUlJSUlJSBSRUpORSBERUYKKworXERlY2xhcmVPcHRpb257UmVqbmV9eyUKKworICBcQ2hOYW1lVXBwZXJDYXNlCisgIFxDaFRpdGxlVXBwZXJDYXNlICAKKyAgXENoTmFtZVZhcntcY2VudGVyaW5nXExhcmdlXHJtfQorICBcQ2hOdW1WYXJ7XEh1Z2V9CisgIFxDaFRpdGxlVmFye1xjZW50ZXJpbmdcSHVnZVxybX0KKyAgXENoUnVsZVdpZHRoezFwdH0KKyAgXHJlbmV3Y29tbWFuZHtcRE9DSH17JQorICAgIFxzZXR0b2hlaWdodHtccHl9e1xDTm9WXHRoZWNoYXB0ZXJ9CisgICAgXGFkZHRvbGVuZ3Roe1xweX17LTFwdH0KKyAgICBcQ05WXEZtTntcQGNoYXBhcHB9XHBhclxub2JyZWFrCisgICAgXHZza2lwIDIwXHBACisgICAgXHNldGxlbmd0aHtcbXloaX17MlxiYXNlbGluZXNraXB9CisgICAgXHNldGxlbmd0aHtccHh9e1xteWhpfQorICAgIFxhZGR0b2xlbmd0aHtccHh9ey0xXFJXfQorICAgIFxydWxlWy0xXHB4XXtcUld9e1xteWhpfVxtZ2hydWxlZmlsbHtcUld9XGhza2lwCisgICAgMTBwdFxyYWlzZWJveHstMC41XHB5fXtcQ05vVlx0aGVjaGFwdGVyfVxoc2tpcAorMTBwdFxtZ2hydWxlZmlsbHtcUld9XHJ1bGVbLTFccHhde1xSV317XG15aGl9XHBhclxub2JyZWFrCisgICAgIFx2c2tpcCAtMVxwQAorICAgIH0KKyAgXHJlbmV3Y29tbWFuZHtcRE9USX1bMV17JQorICAgIFxzZXRsZW5ndGh7XG15bGVufXtcdGV4dHdpZHRofQorICAgIFxhZGR0b2xlbmd0aHtcbXlsZW59ey0yXFJXfQorICAgIHtcdnJ1bGUgd2lkdGhcUld9XHBhcmJveHtcbXlsZW59e1xDVFZcRm1UaXsjMX19e1x2cnVsZQord2lkdGhcUld9XHBhclxub2JyZWFrCisgICAgXHZza2lwCistMXB0XHJ1bGV7XFJXfXsyXGJhc2VsaW5lc2tpcH1cbWdocnVsZWZpbGx7XFJXfVxydWxle1xSV317MlxiYXNlbGluZXNraXB9CisgICAgXHZza2lwIDYwXHBACisgICAgfQorICBccmVuZXdjb21tYW5ke1xET1RJU31bMV17JQorICAgIFxzZXRsZW5ndGh7XHB5fXtcZmJveHJ1bGV9CisgICAgXHNldGxlbmd0aHtcZmJveHJ1bGV9e1xSV30KKyAgICBcc2V0bGVuZ3Roe1xteWxlbn17XHRleHR3aWR0aH0KKyAgICBcYWRkdG9sZW5ndGh7XG15bGVufXstMlxSV30KKyAgICBcZmJveHtccGFyYm94e1xteWxlbn17XHZza2lwCisyXGJhc2VsaW5lc2tpcFxDVFZcRm1UaXsjMX1ccGFyXG5vYnJlYWtcdnNraXAgXGJhc2VsaW5lc2tpcH19IAorICAgIFxzZXRsZW5ndGh7XGZib3hydWxlfXtccHl9CisgICAgXHZza2lwIDYwXHBACisgICAgfQorICB9CisKKworJSUlJSUlJSBCSkFSTkUgREVGCisKK1xEZWNsYXJlT3B0aW9ue0JqYXJuZX17JQorICBcQ2hOYW1lVXBwZXJDYXNlCisgIFxDaFRpdGxlVXBwZXJDYXNlICAKKyAgXENoTmFtZVZhcntccmFnZ2VkbGVmdFxub3JtYWxzaXplXHJtfQorICBcQ2hOdW1WYXJ7XHJhZ2dlZGxlZnQgXGJmc2VyaWVzXExhcmdlfQorICBcQ2hUaXRsZVZhcntccmFnZ2VkbGVmdCBcTGFyZ2Vccm19CisgIFxDaFJ1bGVXaWR0aHsxcHR9CisKKworJSUgTm90ZSB0aGVjaGFwdGVyIC0+IGNAY2hhcHRlciBmaXggYXBwZW5kaXggYnVnCisKKyAgXG5ld2NvdW50ZXJ7QWxwaGFDbnR9CisgIFxuZXdjb3VudGVye0FscGhhRGVjQ250fQorICBcbmV3Y29tbWFuZHtcQWxwaGFOb317JQorICAgIFxpZmNhc2VcbnVtYmVyXHRoZUFscGhhQ250CisgICAgICBcaWZudW1cY0BjaGFwdGVyPTAKKyAgICAgICAgWkVST1xlbHNle31cZmkKKyAgICBcb3IgT05FXG9yIFRXT1xvciBUSFJFRVxvciBGT1VSXG9yIEZJVkUKKyAgICBcb3IgU0lYXG9yIFNFVkVOXG9yIEVJR0hUXG9yIE5JTkVcb3IgVEVOCisgICAgXG9yIEVMRVZFTlxvciBUV0VMVkVcb3IgVEhJUlRFRU5cb3IgRk9VUlRFRU5cb3IgRklGVEVFTgorICAgIFxvciBTSVhURUVOXG9yIFNFVkVOVEVFTlxvciBFSUdIVEVFTlxvciBOSU5FVEVFTlxmaQorfQorCisgIFxuZXdjb21tYW5ke1xBbHBoYURlY05vfXslCisgICAgXHNldGNvdW50ZXJ7QWxwaGFEZWNDbnR9ezB9CisgICAgXEB3aGlsZW51bVxudW1iZXJcdGhlQWxwaGFDbnQ+MFxkbworICAgICAge1xhZGR0b2NvdW50ZXJ7QWxwaGFDbnR9ey0xMH0KKyAgICAgICBcYWRkdG9jb3VudGVye0FscGhhRGVjQ250fXsxfX0KKyAgICAgXGlmbnVtXG51bWJlclx0aGVBbHBoYUNudD0wCisgICAgIFxlbHNlCisgICAgICAgXGFkZHRvY291bnRlcntBbHBoYURlY0NudH17LTF9CisgICAgICAgXGFkZHRvY291bnRlcntBbHBoYUNudH17MTB9CisgICAgIFxmaQorICAgICAKKyAgICAgCisgICAgXGlmY2FzZVxudW1iZXJcdGhlQWxwaGFEZWNDbnRcb3IgVEVOXG9yIFRXRU5UWVxvciBUSElSVFlcb3IKKyAgICBGT1JUWVxvciBGSUZUWVxvciBTSVhUWVxvciBTRVZFTlRZXG9yIEVJR0hUWVxvciBOSU5FVFlcZmkKKyAgICB9CisgIFxuZXdjb21tYW5ke1xUaGVBbHBoYUNoYXB0ZXJ9eyUKKyAgICAKKyAgICBcaWZpbmFwcCAKKyAgICAgIFx0aGVjaGFwdGVyCisgICAgXGVsc2UKKyAgICAgIFxzZXRjb3VudGVye0FscGhhQ250fXtcY0BjaGFwdGVyfQorICAgICAgXGlmbnVtXGNAY2hhcHRlcjwyMAorICAgICAgICBcQWxwaGFObworICAgICAgXGVsc2UKKyAgICAgICAgXEFscGhhRGVjTm9cQWxwaGFObworICAgICAgXGZpCisgICAgXGZpCisgICAgfSAgCisgIFxyZW5ld2NvbW1hbmR7XERPQ0h9eyUKKyAgICBcbWdocnVsZWZpbGx7XFJXfVxwYXJcbm9icmVhaworICAgIFxDTlZcRm1Oe1xAY2hhcGFwcH1ccGFyXG5vYnJlYWsgCisgICAgXENOb1ZcVGhlQWxwaGFDaGFwdGVyXHBhclxub2JyZWFrCisgICAgXHZza2lwIC0xXGJhc2VsaW5lc2tpcFx2c2tpcCA1cHRcbWdocnVsZWZpbGx7XFJXfVxwYXJcbm9icmVhaworICAgIFx2c2tpcCAyMFxwQAorICAgIH0KKyAgXHJlbmV3Y29tbWFuZHtcRE9USX1bMV17JQorICAgIFxDVFZcRm1UaXsjMX1ccGFyXG5vYnJlYWsKKyAgICBcdnNraXAgNDBccEAKKyAgICB9CisgIFxyZW5ld2NvbW1hbmR7XERPVElTfVsxXXslCisgICAgXENUVlxGbVRpeyMxfVxwYXJcbm9icmVhaworICAgIFx2c2tpcCA0MFxwQAorICAgIH0KK30KKworXERlY2xhcmVPcHRpb24qeyUKKyAgXFBhY2thZ2VXYXJuaW5ne2ZhbmN5Y2hhcHRlcn17dW5rbm93biBzdHlsZSBvcHRpb259CisgIH0KKworXFByb2Nlc3NPcHRpb25zKiBccmVsYXgKKworXGRlZlxAbWFrZWNoYXB0ZXJoZWFkIzF7JQorICBcdnNwYWNlKns1MFxwQH0lCisgIHtccGFyaW5kZW50IFx6QCBccmFnZ2VkcmlnaHQgXG5vcm1hbGZvbnQKKyAgICBcaWZudW0gXGNAc2VjbnVtZGVwdGggPlxtQG5lCisgICAgICBcRE9DSAorICAgIFxmaQorICAgIFxpbnRlcmxpbmVwZW5hbHR5XEBNCisgICAgXERPVEl7IzF9CisgIH19CitcZGVmXEBzY2hhcHRlciMxe1xpZkB0d29jb2x1bW4KKyAgICAgICAgICAgICAgICAgICBcQHRvcG5ld3BhZ2VbXEBtYWtlc2NoYXB0ZXJoZWFkeyMxfV0lCisgICAgICAgICAgICAgICAgIFxlbHNlCisgICAgICAgICAgICAgICAgICAgXEBtYWtlc2NoYXB0ZXJoZWFkeyMxfSUKKyAgICAgICAgICAgICAgICAgICBcQGFmdGVyaGVhZGluZworICAgICAgICAgICAgICAgICBcZml9CitcZGVmXEBtYWtlc2NoYXB0ZXJoZWFkIzF7JQorICBcdnNwYWNlKns1MFxwQH0lCisgIHtccGFyaW5kZW50IFx6QCBccmFnZ2VkcmlnaHQKKyAgICBcbm9ybWFsZm9udAorICAgIFxpbnRlcmxpbmVwZW5hbHR5XEBNCisgICAgXERPVElTeyMxfQorICAgIFx2c2tpcCA0MFxwQAorICB9fQorCitcZW5kaW5wdXQKKworCmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvdGV4aW5wdXRzL2hvd3RvLmNscyBiL2RvYy90b29scy90ZXhpbnB1dHMvaG93dG8uY2xzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OWI0YWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvdGV4aW5wdXRzL2hvd3RvLmNscwpAQCAtMCwwICsxLDEwNiBAQAorJQorJSBob3d0by5jbHMgZm9yIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbgorJQorCitcTmVlZHNUZVhGb3JtYXR7TGFUZVgyZX1bMTk5NS8xMi8wMV0KK1xQcm92aWRlc0NsYXNze2hvd3RvfQorICAgICAgICAgICAgIFsxOTk4LzAyLzI1IERvY3VtZW50IGNsYXNzIChQeXRob24gSE9XVE8pXQorCitcUmVxdWlyZVBhY2thZ2V7cHlwYXBlcn0KKworJSBDaGFuZ2UgdGhlIG9wdGlvbnMgaGVyZSB0byBnZXQgYSBkaWZmZXJlbnQgc2V0IG9mIGJhc2ljIG9wdGlvbnMsICBUaGlzCislIGlzIHdoZXJlIHRvIGFkZCB0aGluZ3MgbGlrZSAiYTRwYXBlciIgb3IgIjEwcHQiLgorJQorXExvYWRDbGFzc1t0d29zaWRlXXthcnRpY2xlfQorCitcc2V0Y291bnRlcntzZWNudW1kZXB0aH17MX0KKworJSBPcHRpb25hbCBwYWNrYWdlczoKKyUKKyUgSWYgcHJvY2Vzc2luZyBvZiB0aGVzZSBkb2N1bWVudHMgZmFpbHMgYXQgeW91ciBUZVggaW5zdGFsbGF0aW9uLAorJSB0aGVzZSBtYXkgYmUgY29tbWVudGVkIG91dCAoaW5kZXBlbmRlbnRseSkgdG8gbWFrZSB0aGluZ3Mgd29yay4KKyUgVGhlc2UgYXJlIGJvdGggc3VwcGxpZWQgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSB0ZVRlWAorJSBkaXN0cmlidXRpb24uCislCislIFRoZSAiZmFuY3loZHIiIHBhY2thZ2UgbWFrZXMgbmljZXIgcGFnZSBmb290ZXJzIHJlYXNvbmFibGUgdG8KKyUgaW1wbGVtZW50LCBhbmQgaXMgdXNlZCB0byBwdXQgdGhlIGNoYXB0ZXIgYW5kIHNlY3Rpb24gaW5mb3JtYXRpb24gaW4gCislIHRoZSBmb290ZXJzLgorJQorXFJlcXVpcmVQYWNrYWdle2ZhbmN5aGRyfVx0eXBlb3V0e1VzaW5nIGZhbmNpZXIgZm9vdGVycyB0aGFuIHVzdWFsLn0KKworCislIFJlcXVpcmVkIHBhY2thZ2U6CislCislIFRoaXMgZ2l2ZXMgdXMgYWxsIHRoZSBQeXRob24tc3BlY2lmaWMgbWFya3VwIHRoYXQgd2UgcmVhbGx5IHdhbnQuCislIFRoaXMgc2hvdWxkIGNvbWUgbGFzdC4gIERvIG5vdCBjaGFuZ2UgdGhpcy4KKyUKK1xSZXF1aXJlUGFja2FnZXtweXRob259CisKKyUgc3VwcG9ydCBmb3IgbW9kdWxlIHN5bm9wc2lzIHNlY3Rpb25zOgorXG5ld2NvbW1hbmR7XHB5QE1vZFN5bm9wc2lzRmlsZW5hbWV9e1xqb2JuYW1lLnN5bn0KKworCislIG5lZWQgdG8gZG8gb25lIG9mIHRoZXNlLi4uLgorXG5ld2NvbW1hbmR7XHB5QGRvSG9yaXpvbnRhbFJ1bGV9e1xydWxle1x0ZXh0d2lkdGh9ezFwdH19CisKKworJSBDaGFuZ2UgdGhlIHRpdGxlIHBhZ2UgdG8gbG9vayBhIGJpdCBiZXR0ZXIsIGFuZCBmaXQgaW4gd2l0aCB0aGUKKyUgZm5jeWNoYXAgYGBCamFybmUnJyBzdHlsZSBhIGJpdCBiZXR0ZXIuCislCitccmVuZXdjb21tYW5ke1xtYWtldGl0bGV9eworICBccHlAZG9Ib3Jpem9udGFsUnVsZQorICBcQGlmdW5kZWZpbmVke3BkZmluZm99e317eworICAgICUgVGhpcyBcZGVmIGlzIHJlcXVpcmVkIHRvIGRlYWwgd2l0aCBtdWx0aS1saW5lIGF1dGhvcnM7IGl0CisgICAgJSBjaGFuZ2VzIFxcIHRvICcsICcgKGNvbW1hLXNwYWNlKSwgbWFraW5nIGl0IHBhc3MgbXVzdGVyIGZvcgorICAgICUgZ2VuZXJhdGluZyBkb2N1bWVudCBpbmZvIGluIHRoZSBQREYgZmlsZS4KKyAgICBcZGVmXFx7LCB9CisgICAgXHBkZmluZm97CisgICAgICAvQXV0aG9yIChcQGF1dGhvcikKKyAgICAgIC9UaXRsZSAoXEB0aXRsZSkKKyAgICB9CisgIH19CisgIFxiZWdpbntmbHVzaHJpZ2h0fQorICAgIHtccm1cSHVnZVxweUBIZWFkZXJGYW1pbHkgXEB0aXRsZX0gXHBhcgorICAgIHtcZW1cbGFyZ2VccHlASGVhZGVyRmFtaWx5IFxweUByZWxlYXNlfSBccGFyCisgICAgXHZzcGFjZXsyNXB0fQorICAgIHtcTGFyZ2VccHlASGVhZGVyRmFtaWx5IFxAYXV0aG9yfSBccGFyCisgICAgXHZzcGFjZXsyNXB0fQorICAgIFxAZGF0ZSBccGFyCisgICAgXHB5QGF1dGhvcmFkZHJlc3MgXHBhcgorICBcZW5ke2ZsdXNocmlnaHR9CisgIFxAdGhhbmtzCisgIFxzZXRjb3VudGVye2Zvb3Rub3RlfXswfQorICBcbGV0XHRoYW5rc1xyZWxheFxsZXRcbWFrZXRpdGxlXHJlbGF4CisgIFxnZGVmXEB0aGFua3N7fVxnZGVmXEBhdXRob3J7fVxnZGVmXEB0aXRsZXt9Cit9CisKKworXGxldFxweUBPbGRUYWJsZW9mY29udGVudHM9XHRhYmxlb2Zjb250ZW50cworXHJlbmV3Y29tbWFuZHtcdGFibGVvZmNvbnRlbnRzfXsKKyAgXGJlZ2luZ3JvdXAKKyAgICBccGFyc2tpcCA9IDBtbQorICAgIFxweUBPbGRUYWJsZW9mY29udGVudHMKKyAgXGVuZGdyb3VwCisgIFxweUBkb0hvcml6b250YWxSdWxlCisgIFx2c3BhY2V7MTJwdH0KKyAgXHB5QGRvaW5nQHBhZ2VAdGFyZ2V0c3RydWUKK30gIAorCislIEZpeCB0aGUgdGhlaW5kZXggZW52aXJvbm1lbnQgdG8gYWRkIGFuIGVudHJ5IHRvIHRoZSBUYWJsZSBvZgorJSBDb250ZW50czsgdGhpcyBpcyBtdWNoIG5pY2VyIHRoYW4ganVzdCBoYXZpbmcgdG8ganVtcCB0byB0aGUgZW5kIG9mCislIHRoZSBib29rIGFuZCBmbGlwIGFyb3VuZCwgZXNwZWNpYWxseSB3aXRoIG11bHRpcGxlIGluZGV4ZXMuCislCitcbGV0XHB5QE9sZFRoZWluZGV4PVx0aGVpbmRleAorXHJlbmV3Y29tbWFuZHtcdGhlaW5kZXh9eworICBcY2xlYXJwYWdlCisgIFxweUBPbGRUaGVpbmRleAorICBcYWRkY29udGVudHNsaW5le3RvY317c2VjdGlvbn17XGluZGV4bmFtZX0KK30KKworXEBpZnVuZGVmaW5lZHtmYW5jeWhmfXsKKyAgXHBhZ2VzdHlsZXtwbGFpbn19eworICBccGFnZXN0eWxle25vcm1hbH19CQklIHN0YXJ0IHRoaXMgd2F5OyBjaGFuZ2UgZm9yCitccGFnZW51bWJlcmluZ3thcmFiaWN9CQklIFRvQyAmIGNoYXB0ZXJzCitcc2V0Y291bnRlcntzZWNudW1kZXB0aH17Mn0KKworXHRoaXNwYWdlc3R5bGV7ZW1wdHl9CmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvdGV4aW5wdXRzL2x0eG1hcmt1cC5zdHkgYi9kb2MvdG9vbHMvdGV4aW5wdXRzL2x0eG1hcmt1cC5zdHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ2MWQ3MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy90ZXhpbnB1dHMvbHR4bWFya3VwLnN0eQpAQCAtMCwwICsxLDQwIEBACislIENyZWF0ZWQgYnkgRnJlZCBMLiBEcmFrZSwgSnIuIDxmZHJha2VAYWNtLm9yZz4sIGFzIHBhcnQgb2YgdGhlCislIFB5dGhvbiBEb2N1bWVudGF0aW9uIFByb2plY3QuCislCislIERlZmluZSBzb21lIHNpbXBsZSBtYXJrdXAgZm9yIHRoZSBMYVRlWCBjb21tYW5kIGRvY3VtZW50YXRpb246CisKK1xQcm92aWRlc1BhY2thZ2V7bHR4bWFya3VwfQorXFJlcXVpcmVQYWNrYWdle3B5dGhvbn0gICAgICAlIGZ1bGxsaW5laXRlbXMgZW52aXJvbm1lbnQKKworJSBUaGVzZSB0d28gbWFjcm9zIGFyZSB1c2VkIGluIGNvbnN0cnVjdGluZyB0aGUgbGFzdCBwYXJhbWV0ZXIgdG8gdGhlCislIGVudmRlc2MgYW5kIG1hY3JvZGVzYyBlbnZpcm9ubWVudHMuCisKK1xuZXdjb21tYW5ke1xweUBsdHhAb3B0cGFyYW19WzFde3tbfVx2YXJ7IzF9e119fQorXG5ld2NvbW1hbmR7XHB5QGx0eEBwYXJhbX1bMV17XHtcdmFyeyMxfVx9fQorCitcbmV3ZW52aXJvbm1lbnR7ZW52ZGVzY31bMl17CisgIFxiZWdpbntmdWxsbGluZWl0ZW1zfQorICAgIFxpdGVtW1xjb2Rle1xlIGJlZ2luXHt7XGJmc2VyaWVzICMxfVx9eyUKKyAgICAgIFxsZXRcb3A9XHB5QGx0eEBvcHRwYXJhbSUKKyAgICAgIFxsZXRccD1ccHlAbHR4QHBhcmFtJQorICAgICAgXGxldFx1bnNwZWNpZmllZD1ccHlAdW5zcGVjaWZpZWQlCisgICAgICBcbGV0XG1vcmVhcmdzPVxweUBtb3JlYXJncyUKKyAgICAgICAgICMyfX1dCisgICAgXGl0ZW1bXGNvZGV7XGUgZW5kXHt7XGJmc2VyaWVzICMxfVx9fV0KKyAgICBcaW5kZXh7IzEgZW52aXJvbm1lbnRAXGlkeGNvZGV7IzF9IGVudmlyb25tZW50fQorICAgIFxpbmRleHtlbnZpcm9ubWVudHMhIzFAXGlkeGNvZGV7IzF9fQorfXtcZW5ke2Z1bGxsaW5laXRlbXN9fQorCitcbmV3ZW52aXJvbm1lbnR7bWFjcm9kZXNjfVsyXXsKKyAgXGJlZ2lue2Z1bGxsaW5laXRlbXN9CisgICAgXGl0ZW1bXGNvZGV7e1xlXGJmc2VyaWVzIzF9eyUKKyAgICAgIFxsZXRcb3A9XHB5QGx0eEBvcHRwYXJhbSUKKyAgICAgIFxsZXRccD1ccHlAbHR4QHBhcmFtJQorICAgICAgXGxldFx1bnNwZWNpZmllZD1ccHlAdW5zcGVjaWZpZWQlCisgICAgICBcbGV0XG1vcmVhcmdzPVxweUBtb3JlYXJncyUKKyAgICAgICMyfX1dCisgICAgXGluZGV4eyMxQFxpZHhjb2Rle1xlICMxfX0KK317XGVuZHtmdWxsbGluZWl0ZW1zfX0KKworXG5ld2NvbW1hbmR7XGVudn1bMV17XGNvZGV7IzF9fQorXG5ld2NvbW1hbmR7XG1hY3JvfVsxXXtcY29kZXtcZSMxfX0KZGlmZiAtLWdpdCBhL2RvYy90b29scy90ZXhpbnB1dHMvbWFudWFsLmNscyBiL2RvYy90b29scy90ZXhpbnB1dHMvbWFudWFsLmNscwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODljYWUxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL3RleGlucHV0cy9tYW51YWwuY2xzCkBAIC0wLDAgKzEsMTUyIEBACislCislIG1hbnVhbC5jbHMgZm9yIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbgorJQorCitcTmVlZHNUZVhGb3JtYXR7TGFUZVgyZX1bMTk5NS8xMi8wMV0KK1xQcm92aWRlc0NsYXNze21hbnVhbH0KKyAgICAgICAgICAgICBbMTk5OC8wMy8wMyBEb2N1bWVudCBjbGFzcyAoUHl0aG9uIG1hbnVhbCldCisKK1xSZXF1aXJlUGFja2FnZXtweXBhcGVyfQorCislIENoYW5nZSB0aGUgb3B0aW9ucyBoZXJlIHRvIGdldCBhIGRpZmZlcmVudCBzZXQgb2YgYmFzaWMgb3B0aW9ucywgYnV0IG9ubHkKKyUgaWYgeW91IGhhdmUgdG8uICBQYXBlciBhbmQgZm9udCBzaXplIHNob3VsZCBiZSBhZGp1c3RlZCBpbiBweXBhcGVyLnN0eS4KKyUKK1xMb2FkQ2xhc3NbXHB5QHBhcGVyLFxweUBwdHNpemUsdHdvc2lkZSxvcGVucmlnaHRde3JlcG9ydH0KKworXHNldGNvdW50ZXJ7c2VjbnVtZGVwdGh9ezJ9CisKKyUgT3B0aW9uYWwgcGFja2FnZXM6CislCislIElmIHByb2Nlc3Npbmcgb2YgdGhlc2UgZG9jdW1lbnRzIGZhaWxzIGF0IHlvdXIgVGVYIGluc3RhbGxhdGlvbiwKKyUgdGhlc2UgbWF5IGJlIGNvbW1lbnRlZCBvdXQgKGluZGVwZW5kZW50bHkpIHRvIG1ha2UgdGhpbmdzIHdvcmsuCislIFRoZXNlIGFyZSBib3RoIHN1cHBsaWVkIHdpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgdGVUZVgKKyUgZGlzdHJpYnV0aW9uLgorJQorJSBUaGUgImZhbmN5aGRyIiBwYWNrYWdlIG1ha2VzIG5pY2VyIHBhZ2UgZm9vdGVycyByZWFzb25hYmxlIHRvCislIGltcGxlbWVudCwgYW5kIGlzIHVzZWQgdG8gcHV0IHRoZSBjaGFwdGVyIGFuZCBzZWN0aW9uIGluZm9ybWF0aW9uIGluIAorJSB0aGUgZm9vdGVycy4KKyUKK1xSZXF1aXJlUGFja2FnZXtmYW5jeWhkcn1cdHlwZW91dHtVc2luZyBmYW5jaWVyIGZvb3RlcnMgdGhhbiB1c3VhbC59CisKKworJSBSZXF1aXJlZCBwYWNrYWdlczoKKyUKKyUgVGhlICJmbmN5Y2hhcCIgcGFja2FnZSBpcyB1c2VkIHRvIGdldCB0aGUgbmljZSBjaGFwdGVyIGhlYWRlcnMuICBUaGUKKyUgLnN0eSBmaWxlIGlzIGRpc3RyaWJ1dGVkIHdpdGggUHl0aG9uLCBzbyB5b3Ugc2hvdWxkIG5vdCBuZWVkIHRvIGRpc2FibGUKKyUgaXQuICBZb3UnZCBhbHNvIGVuZCB1cCB3aXRoIGEgbWl4ZWQgcGFnZSBzdHlsZTsgdWdsaWVyIHRoYW4gc3RvY2sgTGFUZVghCislCitcUmVxdWlyZVBhY2thZ2VbQmphcm5lXXtmbmN5Y2hhcH1cdHlwZW91dHtVc2luZyBmYW5jeSBjaGFwdGVyIGhlYWRpbmdzLn0KKyUgRG8gaG9yaXpvbnRhbCBydWxlcyBpdCB0aGlzIHdheSB0byBtYXRjaDoKK1xuZXdjb21tYW5ke1xweUBkb0hvcml6b250YWxSdWxlfXtcbWdocnVsZWZpbGx7XFJXfX0KKyUKKyUKKyUgVGhpcyBnaXZlcyB1cyBhbGwgdGhlIFB5dGhvbi1zcGVjaWZpYyBtYXJrdXAgdGhhdCB3ZSByZWFsbHkgd2FudC4KKyUgVGhpcyBzaG91bGQgY29tZSBsYXN0LiAgRG8gbm90IGNoYW5nZSB0aGlzLgorJQorXFJlcXVpcmVQYWNrYWdle3B5dGhvbn0KKworJSBzdXBwb3J0IGZvciBtb2R1bGUgc3lub3BzaXMgc2VjdGlvbnM6CitcbmV3Y29tbWFuZHtccHlATW9kU3lub3BzaXNGaWxlbmFtZX17XGpvYm5hbWVcdGhlY2hhcHRlci5zeW59CitcbGV0XHB5QE9sZENoYXB0ZXI9XGNoYXB0ZXIKK1xyZW5ld2NvbW1hbmR7XGNoYXB0ZXJ9eworICBccHlAUHJvY2Vzc01vZFN5bm9wc2lzCisgIFxweUBjbG9zZU1vZFN5bm9wc2lzRmlsZQorICBccHlAT2xkQ2hhcHRlcgorfQorCisKKyUgQ2hhbmdlIHRoZSB0aXRsZSBwYWdlIHRvIGxvb2sgYSBiaXQgYmV0dGVyLCBhbmQgZml0IGluIHdpdGggdGhlCislIGZuY3ljaGFwIGBgQmphcm5lJycgc3R5bGUgYSBiaXQgYmV0dGVyLgorJQorXHJlbmV3Y29tbWFuZHtcbWFrZXRpdGxlfXslCisgIFxiZWdpbnt0aXRsZXBhZ2V9JQorICAgIFxsZXRcZm9vdG5vdGVzaXplXHNtYWxsCisgICAgXGxldFxmb290bm90ZXJ1bGVccmVsYXgKKyAgICBccHlAZG9Ib3Jpem9udGFsUnVsZSUKKyAgICBcQGlmdW5kZWZpbmVke3BkZmluZm99e317eworICAgICAgJSBUaGlzIFxkZWYgaXMgcmVxdWlyZWQgdG8gZGVhbCB3aXRoIG11bHRpLWxpbmUgYXV0aG9yczsgaXQKKyAgICAgICUgY2hhbmdlcyBcXCB0byAnLCAnIChjb21tYS1zcGFjZSksIG1ha2luZyBpdCBwYXNzIG11c3RlciBmb3IKKyAgICAgICUgZ2VuZXJhdGluZyBkb2N1bWVudCBpbmZvIGluIHRoZSBQREYgZmlsZS4KKyAgICAgIFxkZWZcXHssIH0KKyAgICAgIFxwZGZpbmZveworICAgICAgICAvQXV0aG9yIChcQGF1dGhvcikKKyAgICAgICAgL1RpdGxlIChcQHRpdGxlKQorICAgICAgfQorICAgIH19CisgICAgXGJlZ2lue2ZsdXNocmlnaHR9JQorICAgICAge1xybVxIdWdlXHB5QEhlYWRlckZhbWlseSBcQHRpdGxlIFxwYXJ9JQorICAgICAge1xlbVxMQVJHRVxweUBIZWFkZXJGYW1pbHkgXHB5QHJlbGVhc2UgXHBhcn0KKyAgICAgIFx2ZmlsbAorICAgICAge1xMQVJHRVxweUBIZWFkZXJGYW1pbHkgXEBhdXRob3IgXHBhcn0KKyAgICAgIFx2ZmlsbFx2ZmlsbAorICAgICAge1xsYXJnZQorICAgICAgIFxAZGF0ZSBccGFyCisgICAgICAgXHZmaWxsCisgICAgICAgXHB5QGF1dGhvcmFkZHJlc3MgXHBhcgorICAgICAgfSUKKyAgICBcZW5ke2ZsdXNocmlnaHR9JVxwYXIKKyAgICBcQHRoYW5rcworICBcZW5ke3RpdGxlcGFnZX0lCisgIFxzZXRjb3VudGVye2Zvb3Rub3RlfXswfSUKKyAgXGxldFx0aGFua3NccmVsYXhcbGV0XG1ha2V0aXRsZVxyZWxheAorICBcZ2RlZlxAdGhhbmtze31cZ2RlZlxAYXV0aG9ye31cZ2RlZlxAdGl0bGV7fQorfQorCisKKyUgQ2F0Y2ggdGhlIGVuZCBvZiB0aGUge2Fic3RyYWN0fSBlbnZpcm9ubWVudCwgYnV0IGhlcmUgbWFrZSBzdXJlIHRoZQorJSBhYnN0cmFjdCBpcyBmb2xsb3dlZCBieSBhIGJsYW5rIHBhZ2UgaWYgdGhlICdvcGVucmlnaHQnIG9wdGlvbiBpcyB1c2VkLgorJQorXGxldFxweUBPbGRFbmRBYnN0cmFjdD1cZW5kYWJzdHJhY3QKK1xyZW5ld2NvbW1hbmR7XGVuZGFic3RyYWN0fXsKKyAgXGlmQG9wZW5yaWdodAorICAgIFxpZm9kZFx2YWx1ZXtwYWdlfQorICAgICAgXHR5cGVvdXR7QWRkaW5nIGJsYW5rIHBhZ2UgYWZ0ZXIgdGhlIGFic3RyYWN0Ln0KKyAgICAgIFx2ZmlsXHBhZ2VicmVhaworICAgIFxmaQorICBcZmkKKyAgXHB5QE9sZEVuZEFic3RyYWN0Cit9CisKKyUgVGhpcyB3cmFwcyB0aGUgXHRhYmxlb2Zjb250ZW50cyBtYWNybyB3aXRoIGFsbCB0aGUgbWFnaWMgdG8gZ2V0IHRoZQorJSBzcGFjaW5nIHJpZ2h0IGFuZCBoYXZlIHRoZSByaWdodCBudW1iZXIgb2YgcGFnZXMgaWYgdGhlICdvcGVucmlnaHQnCislIG9wdGlvbiBoYXMgYmVlbiB1c2VkLiAgVGhpcyBlbGltaW5hdGVzIGEgZmFpciBhbW91bnQgb2YgY3J1ZCBpbiB0aGUKKyUgaW5kaXZpZHVhbCBkb2N1bWVudCBmaWxlcy4KKyUKK1xsZXRccHlAT2xkVGFibGVvZmNvbnRlbnRzPVx0YWJsZW9mY29udGVudHMKK1xyZW5ld2NvbW1hbmR7XHRhYmxlb2Zjb250ZW50c317JQorICBcc2V0Y291bnRlcntwYWdlfXsxfSUKKyAgXHBhZ2VicmVhayUKKyAgXHBhZ2VzdHlsZXtwbGFpbn0lCisgIHslCisgICAgXHBhcnNraXAgPSAwbW0lCisgICAgXHB5QE9sZFRhYmxlb2Zjb250ZW50cyUKKyAgICBcaWZAb3BlbnJpZ2h0JQorICAgICAgXGlmb2RkXHZhbHVle3BhZ2V9JQorICAgICAgICBcdHlwZW91dHtBZGRpbmcgYmxhbmsgcGFnZSBhZnRlciB0aGUgdGFibGUgb2YgY29udGVudHMufSUKKyAgICAgICAgXHBhZ2VicmVha1xoc3BhY2V7MHB0fSUKKyAgICAgIFxmaSUKKyAgICBcZmklCisgICAgXGNsZWFyZG91YmxlcGFnZSUKKyAgfSUKKyAgXHBhZ2VudW1iZXJpbmd7YXJhYmljfSUKKyAgXEBpZnVuZGVmaW5lZHtmYW5jeWhmfXt9e1xwYWdlc3R5bGV7bm9ybWFsfX0lCisgIFxweUBkb2luZ0BwYWdlQHRhcmdldHN0cnVlJQorfQorJSBUaGlzIGlzIG5lZWRlZCB0byBnZXQgdGhlIHdpZHRoIG9mIHRoZSBzZWN0aW9uICMgYXJlYSB3aWRlIGVub3VnaCBpbiB0aGUKKyUgbGlicmFyeSByZWZlcmVuY2UuICBEb2luZyBpdCBoZXJlIGtlZXBzIGl0IHRoZSBzYW1lIGZvciBhbGwgdGhlIG1hbnVhbHMuCislCitccmVuZXdjb21tYW5kKlxsQHNlY3Rpb257XEBkb3R0ZWR0b2NsaW5lezF9ezEuNWVtfXsyLjZlbX19CitccmVuZXdjb21tYW5kKlxsQHN1YnNlY3Rpb257XEBkb3R0ZWR0b2NsaW5lezJ9ezQuMWVtfXszLjVlbX19Citcc2V0Y291bnRlcnt0b2NkZXB0aH17MX0KKworCislIEZpeCB0aGUgdGhlaW5kZXggZW52aXJvbm1lbnQgdG8gYWRkIGFuIGVudHJ5IHRvIHRoZSBUYWJsZSBvZgorJSBDb250ZW50czsgdGhpcyBpcyBtdWNoIG5pY2VyIHRoYW4ganVzdCBoYXZpbmcgdG8ganVtcCB0byB0aGUgZW5kIG9mCislIHRoZSBib29rIGFuZCBmbGlwIGFyb3VuZCwgZXNwZWNpYWxseSB3aXRoIG11bHRpcGxlIGluZGV4ZXMuCislCitcbGV0XHB5QE9sZFRoZWluZGV4PVx0aGVpbmRleAorXHJlbmV3Y29tbWFuZHtcdGhlaW5kZXh9eworICBcY2xlYXJkb3VibGVwYWdlCisgIFxweUBPbGRUaGVpbmRleAorICBcYWRkY29udGVudHNsaW5le3RvY317Y2hhcHRlcn17XGluZGV4bmFtZX0KK30KZGlmZiAtLWdpdCBhL2RvYy90b29scy90ZXhpbnB1dHMvcHlwYXBlci5zdHkgYi9kb2MvdG9vbHMvdGV4aW5wdXRzL3B5cGFwZXIuc3R5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NTk2MzcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvdGV4aW5wdXRzL3B5cGFwZXIuc3R5CkBAIC0wLDAgKzEsMTggQEAKKyUKKyUgIENoYW5nZSB0aGlzIHRvIHNheSBhNHBhcGVyIGluc3RlYWQgb2YgbGV0dGVycGFwZXIgaWYgeW91IHdhbnQgQTQuICBUaGVzZQorJSAgYXJlIHRoZSBsYXRleCBkZWZhdWx0cy4KKyUKK1xuZXdjb21tYW5ke1xweUBwYXBlcn17bGV0dGVycGFwZXJ9CitcbmV3Y29tbWFuZHtccHlAcHRzaXplfXsxMHB0fQorCislICBUaGVzZSBzZXQgdXAgdGhlIGZvbnRzIGZvciB0aGUgZG9jdW1lbnRzLgorJQorJSAgVGhlICJ0aW1lcyIgcGFja2FnZSBtYWtlcyB0aGUgZGVmYXVsdCBmb250IHRoZSBQb3N0U2NyaXB0IFRpbWVzCislICBmb250LCB3aGljaCBtYWtlcyBmb3Igc21hbGxlciBQb3N0U2NyaXB0IGFuZCBhIGZvbnQgdGhhdCBtb3JlIHBlb3BsZSAKKyUgIGxpa2UuCislCislICBUaGUgImF2YW50IiBwYWNrYWdlIGNhdXNlcyB0aGUgQXZhbnRHYXJkZSBmb250IHRvIGJlIHVzZWQgZm9yCislICBzYW5zLXNlcmlmIHRleHQsIGluc3RlYWQgb2YgdGhlIHVnbGllciBIZWx2ZXRpY2Egc2V0IHVwIGJ5IHRoZSAidGltZXMiCislICBwYWNrYWdlLgorJQorXFJlcXVpcmVQYWNrYWdle3RpbWVzfVx0eXBlb3V0e1VzaW5nIFRpbWVzIGluc3RlYWQgb2YgQ29tcHV0ZXIgTW9kZXJuLn0KZGlmZiAtLWdpdCBhL2RvYy90b29scy90ZXhpbnB1dHMvcHl0aG9uLmlzdCBiL2RvYy90b29scy90ZXhpbnB1dHMvcHl0aG9uLmlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmZhMGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL3RleGlucHV0cy9weXRob24uaXN0CkBAIC0wLDAgKzEsMTEgQEAKK2xpbmVfbWF4IDEwMAoraGVhZGluZ3NfZmxhZyAxCitoZWFkaW5nX3ByZWZpeCAiICBcXGJpZ2xldHRlciAiCisKK3ByZWFtYmxlICJcXGJlZ2lue3RoZWluZGV4fQorXFxkZWZcXGJpZ2xldHRlciMxe3tcXExhcmdlXFxzZmZhbWlseSMxfVxcbm9wYWdlYnJlYWtcXHZzcGFjZXsxbW19fQorCisiCisKK3N5bWhlYWRfcG9zaXRpdmUgIntTeW1ib2xzfSIKK251bWhlYWRfcG9zaXRpdmUgIntOdW1iZXJzfSIKZGlmZiAtLWdpdCBhL2RvYy90b29scy90ZXhpbnB1dHMvcHl0aG9uLnN0eSBiL2RvYy90b29scy90ZXhpbnB1dHMvcHl0aG9uLnN0eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTYxZDg3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL3RleGlucHV0cy9weXRob24uc3R5CkBAIC0wLDAgKzEsMTA4MiBAQAorJQorJSBweXRob24uc3R5IGZvciB0aGUgUHl0aG9uIGRvY3VtbWVudGF0aW9uICBbd29ya3Mgb25seSB3aXRoIHdpdGggTGF0ZXgyZV0KKyUKKworXE5lZWRzVGVYRm9ybWF0e0xhVGVYMmV9WzE5OTUvMTIvMDFdCitcUHJvdmlkZXNQYWNrYWdle3B5dGhvbn0KKyAgICAgICAgICAgICBbMTk5OC8wMS8xMSBMYVRlWCBwYWNrYWdlIChQeXRob24gbWFya3VwKV0KKworXFJlcXVpcmVQYWNrYWdle2xvbmd0YWJsZX0KKworJSBVbmNvbW1lbnQgdGhlc2UgdHdvIGxpbmVzIHRvIGlnbm9yZSB0aGUgcGFwZXIgc2l6ZSBhbmQgbWFrZSB0aGUgcGFnZSAKKyUgc2l6ZSBtb3JlIGxpa2UgYSB0eXBpY2FsIHB1Ymxpc2hlZCBtYW51YWwuCislXHJlbmV3Y29tbWFuZHtccGFwZXJoZWlnaHR9ezlpbn0KKyVccmVuZXdjb21tYW5ke1xwYXBlcndpZHRofXs4LjVpbn0gICAlIHR5cGljYWwgc3F1YXJpc2ggbWFudWFsCislXHJlbmV3Y29tbWFuZHtccGFwZXJ3aWR0aH17N2lufSAgICAgJSBPJ1JlaWxseSBgYFByb2dyYW1tbWluZyBQeXRob24nJworCislIFRoZXNlIHBhY2thZ2VzIGNhbiBiZSB1c2VkIHRvIGFkZCBtYXJnaW5hbCBhbm5vdGF0aW9ucyB3aGljaCBpbmRpY2F0ZQorJSBpbmRleCBlbnRyaWVzIGFuZCBsYWJlbHM7IHVzZWZ1bCBmb3IgcmV2aWV3aW5nIHRoaXMgbWVzc3kgZG9jdW1lbnRhdGlvbiEKKyUKKyVcUmVxdWlyZVBhY2thZ2V7c2hvd2tleXN9CislXFJlcXVpcmVQYWNrYWdle3Nob3dpZHh9CisKKyUgZm9yIFBERiBvdXRwdXQsIHVzZSBtYXhpbWFsIGNvbXByZXNzaW9uICYgYSBsb3Qgb2Ygb3RoZXIgc3R1ZmYKKyUgKHRlc3QgZm9yIFBERiByZWNvbW1lbmRlZCBieSBUYW5tb3kgQmhhdHRhY2hhcnlhIDx0YW5tb3lAcWNkLmxhbmwuZ292PikKKyUKK1xuZXdpZlxpZnB5QGRvaW5nQHBhZ2VAdGFyZ2V0cworXHB5QGRvaW5nQHBhZ2VAdGFyZ2V0c2ZhbHNlCisKK1xpZnhccGRmb3V0cHV0XHVuZGVmaW5lZFxlbHNlXGlmY2FzZVxwZGZvdXRwdXQKK1xlbHNlCisgIFxpbnB1dHtwZGZjb2xvcn0KKyAgXGxldFxweUBMaW5rQ29sb3I9XE5hdnlCbHVlCisgIFxsZXRccHlATm9ybWFsQ29sb3I9XEJsYWNrCisgIFxwZGZjb21wcmVzc2xldmVsPTkKKyAgXHBkZnBhZ2V3aWR0aD1ccGFwZXJ3aWR0aCAgICAlIHBhZ2Ugd2lkdGggb2YgUERGIG91dHB1dAorICBccGRmcGFnZWhlaWdodD1ccGFwZXJoZWlnaHQgICUgcGFnZSBoZWlnaHQgb2YgUERGIG91dHB1dAorICAlCisgICUgUGFkIHRoZSBudW1iZXIgd2l0aCAnMCcgdG8gMyBkaWdpdHMgd2lkZSBzbyBubyBwYWdlIG5hbWUgaXMgYSBwcmVmaXgKKyAgJSBvZiBhbnkgb3RoZXIuCisgICUKKyAgXG5ld2NvbW1hbmR7XHB5QHRhcmdldG5vfVsxXXtcaWZudW0jMTwxMDAgMFxmaVxpZm51bSMxPDEwIDBcZmkjMX0KKyAgXG5ld2NvbW1hbmR7XHB5QHBhZ2Vub317XHB5QHRhcmdldG5vXHRoZXBhZ2V9CisgICUKKyAgJSBUaGlzIGRlZmluaXRpb24gYWxsb3dzIHRoZSBlbnRyaWVzIGluIHRoZSBwYWdlLXZpZXcgb2YgdGhlIFRvQyB0byBiZQorICAlIGFjdGl2ZSBsaW5rcy4gIFNvbWUgd29yaywgc29tZSBkb24ndC4KKyAgJQorICBcbGV0XHB5QE9sZENvbnRlbnRzbGluZT1cY29udGVudHNsaW5lCisgICUKKyAgJSBNYWNybyB0aGF0IHRha2VzIHR3byBhcmdzOiB0aGUgbmFtZSB0byBsaW5rIHRvIGFuZCB0aGUgY29udGVudCBvZgorICAlIHRoZSBsaW5rLiAgVGhpcyB0YWtlcyBjYXJlIG9mIHRoZSBQREYgbWFnaWMsIGdldHRpbmcgdGhlIGNvbG9ycworICAlIHRoZSBzYW1lIGZvciBlYWNoIGxpbmssIGFuZCBhdm9pZHMgaGF2aW5nIGxvdHMgb2YgZ2FyYmFnZSBhbGwgb3ZlciAKKyAgJSB0aGlzIHN0eWxlIGZpbGUuCisgIFxuZXdjb21tYW5ke1xweUBsaW5rVG9OYW1lfVsyXXslCisgICAgXHBkZmFubm90bGluayBhdHRyey9Cb3JkZXIgWzAgMCAwXX0gZ290byBuYW1leyMxfSUKKyAgICAgIFxweUBMaW5rQ29sb3IjMlxweUBOb3JtYWxDb2xvciUKKyAgICBccGRmZW5kbGluayUKKyAgfSAgICAKKyAgJSBDb21wdXRlIHRoZSBwYWRkZWQgcGFnZSBudW1iZXIgc2VwYXJhdGVseSBzaW5jZSB3ZSBlbmQgdXAgd2l0aCBhIHBhaXIgb2YKKyAgJSBccmVsYXggdG9rZW5zOyB0aGlzIGdldHMgdGhlIHJpZ2h0IHN0cmluZyBjb21wdXRlZCBhbmQgd29ya3MuCisgIFxyZW5ld2NvbW1hbmR7XGNvbnRlbnRzbGluZX1bM117JQorICAgIFxkZWZcbXlAcGFnZW5ve1xweUB0YXJnZXRub3sjM319JQorICAgIFxweUBPbGRDb250ZW50c2xpbmV7IzF9e1xweUBsaW5rVG9OYW1le3BhZ2VcbXlAcGFnZW5vfXsjMn19eyMzfSUKKyAgfQorICBcQXRFbmREb2N1bWVudHsKKyAgICBcSW5wdXRJZkZpbGVFeGlzdHN7XGpvYm5hbWUuYmttfXtccGRmY2F0YWxvZ3svUGFnZU1vZGUgL1VzZU91dGxpbmVzfX17fQorICB9CisgIFxuZXdjb21tYW5ke1xweUB0YXJnZXR9WzFdeyUKKyAgICBcaWZweUBkb2luZ0BwYWdlQHRhcmdldHMlCisgICAgICB7XHBkZmRlc3QgbmFtZXsjMX0geHl6fSUKKyAgICBcZmklCisgIH0KKyAgXGxldFxweUBPbGRMYWJlbD1cbGFiZWwKKyAgXHJlbmV3Y29tbWFuZHtcbGFiZWx9WzFdeyUKKyAgICBccHlAT2xkTGFiZWx7IzF9JQorICAgIFxweUB0YXJnZXR7bGFiZWwtIzF9JQorICB9CisgICUgVGhpcyBzdHVmZiBhZGRzIGEgcGFnZSMgZGVzdGluYXRpb24gdG8gZXZlcnkgUERGIHBhZ2UsIHdoZXJlICMgaXMgdGhyZWUKKyAgJSBkaWdpdHMgd2lkZSwgcGFkZGVkIHdpdGggbGVhZGluZyB6ZXJvcy4gIFRoaXMgZG9lc24ndCByZWFsbHkgaGVscCB3aXRoCisgICUgdGhlIGZyb250bWF0dGVyLCBidXQgZG9lcyBmaW5lIHdpdGggdGhlIGJvZHkuCisgICUKKyAgJSBUaGlzIGlzICpoZWF2aWx5KiBiYXNlZCBvbiB0aGUgaHlwZXJyZWYgcGFja2FnZS4KKyAgJQorICBcZGVmXEBiZWdpbmR2aXslCisgICAgXHVudmJveCBcQGJlZ2luZHZpYm94CisgICAgXEBoeXBlcmZpeGhlYWQKKyAgfQorICBcZGVmXEBoeXBlcmZpeGhlYWR7JQorICAgXGxldFxIQG9sZEB0aGVoZWFkXEB0aGVoZWFkCisgICAgICAgXGdsb2JhbFxkZWZcQGZvb3tccHlAdGFyZ2V0e3BhZ2VccHlAcGFnZW5vfX0lCisgICAgIFxleHBhbmRhZnRlclxpZnhcZXhwYW5kYWZ0ZXJcQGVtcHR5XEhAb2xkQHRoZWhlYWQKKyAgICAgICBcZGVmXEhAb2xkQHRoZWhlYWR7XGhmaWx9XGZpCisgICAgXGRlZlxAdGhlaGVhZHtcQGZvb1xyZWxheFxIQG9sZEB0aGVoZWFkfSUKKyAgfQorXGZpXGZpCisKKyUgSW5jcmVhc2UgcHJpbnRhYmxlIHBhZ2Ugc2l6ZSAoY29waWVkIGZyb20gZnVsbHBhZ2Uuc3R5KQorXHRvcG1hcmdpbiAwcHQKK1xhZHZhbmNlIFx0b3BtYXJnaW4gYnkgLVxoZWFkaGVpZ2h0CitcYWR2YW5jZSBcdG9wbWFyZ2luIGJ5IC1caGVhZHNlcAorCislIGF0dGVtcHQgdG8gd29yayBhIGxpdHRsZSBiZXR0ZXIgZm9yIEE0IHVzZXJzCitcdGV4dGhlaWdodCBccGFwZXJoZWlnaHQKK1xhZHZhbmNlXHRleHRoZWlnaHQgYnkgLTJpbgorCitcb2Rkc2lkZW1hcmdpbiAwcHQKK1xldmVuc2lkZW1hcmdpbiAwcHQKKyVcZXZlbnNpZGVtYXJnaW4gLS4yNWluICAlIGZvciBgYG1hbnVhbCBzaXplJycgZG9jdW1lbnRzCitcbWFyZ2lucGFyd2lkdGggMC41aW4KKworXHRleHR3aWR0aCBccGFwZXJ3aWR0aAorXGFkdmFuY2VcdGV4dHdpZHRoIGJ5IC0yaW4KKworCislIFN0eWxlIHBhcmFtZXRlcnMgYW5kIG1hY3JvcyB1c2VkIGJ5IG1vc3QgZG9jdW1lbnRzIGhlcmUKK1xyYWdnZWRib3R0b20KK1xzbG9wcHkKK1xwYXJpbmRlbnQgPSAwbW0KK1xwYXJza2lwID0gMm1tCitcaGJhZG5lc3MgPSA1MDAwICAgICAgICAgICAgICAgICUgZG9uJ3QgcHJpbnQgdHJpdmlhbCBncmlwZXMKKworXHBhZ2VzdHlsZXtlbXB0eX0gICAgICAgICAgICAgICAlIHN0YXJ0IHRoaXMgd2F5OyBjaGFuZ2UgZm9yCitccGFnZW51bWJlcmluZ3tyb21hbn0gICAgICAgICAgICUgVG9DICYgY2hhcHRlcnMKKworJSBVc2UgdGhpcyB0byBzZXQgdGhlIGZvbnQgZmFtaWx5IGZvciBoZWFkZXJzIGFuZCBvdGhlciBkZWNvcjoKK1xuZXdjb21tYW5ke1xweUBIZWFkZXJGYW1pbHl9e1xzZmZhbWlseX0KKworJSBSZWRlZmluZSB0aGUgJ25vcm1hbCcgaGVhZGVyL2Zvb3RlciBzdHlsZSB3aGVuIHVzaW5nICJmYW5jeWhkciIgcGFja2FnZToKK1xAaWZ1bmRlZmluZWR7ZmFuY3loZn17fXsKKyAgJSBVc2UgXHBhZ2VzdHlsZXtub3JtYWx9IGFzIHRoZSBwcmltYXJ5IHBhZ2VzdHlsZSBmb3IgdGV4dC4KKyAgXGZhbmN5cGFnZXN0eWxle25vcm1hbH17CisgICAgXGZhbmN5aGZ7fQorICAgIFxmYW5jeWZvb3RbTEUsUk9de3tccHlASGVhZGVyRmFtaWx5XHRoZXBhZ2V9fQorICAgIFxmYW5jeWZvb3RbTE9de3tccHlASGVhZGVyRmFtaWx5XG5vdXBwZXJjYXNle1xyaWdodG1hcmt9fX0KKyAgICBcZmFuY3lmb290W1JFXXt7XHB5QEhlYWRlckZhbWlseVxub3VwcGVyY2FzZXtcbGVmdG1hcmt9fX0KKyAgICBccmVuZXdjb21tYW5ke1xoZWFkcnVsZXdpZHRofXswcHR9CisgICAgXHJlbmV3Y29tbWFuZHtcZm9vdHJ1bGV3aWR0aH17MC40cHR9CisgIH0KKyAgJSBVcGRhdGUgdGhlIHBsYWluIHN0eWxlIHNvIHdlIGdldCB0aGUgcGFnZSBudW1iZXIgJiBmb290ZXIgbGluZSwKKyAgJSBidXQgbm90IGEgY2hhcHRlciBvciBzZWN0aW9uIHRpdGxlLiAgVGhpcyBpcyB0byBrZWVwIHRoZSBmaXJzdAorICAlIHBhZ2Ugb2YgYSBjaGFwdGVyIGFuZCB0aGUgYmxhbmsgcGFnZSBiZXR3ZWVuIGNoYXB0ZXJzIGBjbGVhbi4nCisgIFxmYW5jeXBhZ2VzdHlsZXtwbGFpbn17CisgICAgXGZhbmN5aGZ7fQorICAgIFxmYW5jeWZvb3RbTEUsUk9de3tccHlASGVhZGVyRmFtaWx5XHRoZXBhZ2V9fQorICAgIFxyZW5ld2NvbW1hbmR7XGhlYWRydWxld2lkdGh9ezBwdH0KKyAgICBccmVuZXdjb21tYW5ke1xmb290cnVsZXdpZHRofXswLjRwdH0KKyAgfQorICAlIFJlZGVmaW5lIFxjbGVhcmRvdWJsZXBhZ2Ugc28gdGhhdCB0aGUgYmxhbmsgcGFnZSBiZXR3ZWVuIGNoYXB0ZXJzCisgICUgZ2V0cyB0aGUgcGxhaW4gc3R5bGUgYW5kIG5vdCB0aGUgZmFuY3kgc3R5bGUuICBUaGlzIGlzIGRlc2NyaWJlZAorICAlIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgZmFuY3loZHIgcGFja2FnZSBieSBQaWV0IHZvbiBPb3N0cnVtLgorICBcQGlmdW5kZWZpbmVke2NoYXB0ZXJ9e317CisgICAgXHJlbmV3Y29tbWFuZHtcY2xlYXJkb3VibGVwYWdlfXsKKyAgICAgIFxjbGVhcnBhZ2VcaWZAb3BlbnJpZ2h0IFxpZm9kZFxjQHBhZ2VcZWxzZQorICAgICAgXGhib3h7fQorICAgICAgXHRoaXNwYWdlc3R5bGV7cGxhaW59CisgICAgICBcbmV3cGFnZQorICAgICAgXGlmQHR3b2NvbHVtblxoYm94e31cbmV3cGFnZVxmaVxmaVxmaQorICAgIH0KKyAgfQorfQorCislIFRoaXMgc2V0cyB1cCB0aGUge3ZlcmJhdGltfSBlbnZpcm9ubWVudCB0byBiZSBpbmRlbnRlZCBhbmQgYSBtaW5pcGFnZSwKKyUgYW5kIHRvIGhhdmUgYWxsIHRoZSBvdGhlciBtb3N0bHkgbmljZSBwcm9wZXJ0aWVzIHRoYXQgd2Ugd2FudCBmb3IKKyUgY29kZSBzYW1wbGVzLgorCitcbGV0XHB5QE9sZFZlcmJhdGltPVx2ZXJiYXRpbQorXGxldFxweUBPbGRFbmRWZXJiYXRpbT1cZW5kdmVyYmF0aW0KK1xSZXF1aXJlUGFja2FnZXt2ZXJiYXRpbX0KKworJSBWYXJpYWJsZSB1c2VkIGJ5IGJlZ2luIGNvZGUgY29tbWFuZAorXG5ld2xlbmd0aHtccHlAY29kZXdpZHRofQorCitccmVuZXdjb21tYW5ke1x2ZXJiYXRpbX17JQorICBcc2V0bGVuZ3Roe1xwYXJpbmRlbnR9ezFjbX0lCisgICUgQ2FsY3VsYXRlIHRoZSB0ZXh0IHdpZHRoIGZvciB0aGUgbWluaXBhZ2U6CisgIFxzZXRsZW5ndGh7XHB5QGNvZGV3aWR0aH17XGxpbmV3aWR0aH0lCisgIFxhZGR0b2xlbmd0aHtccHlAY29kZXdpZHRofXstXHBhcmluZGVudH0lCisgICUKKyAgXHBhclxpbmRlbnQlCisgIFxiZWdpbnttaW5pcGFnZX1bdF17XHB5QGNvZGV3aWR0aH0lCisgICAgXHNtYWxsJQorICAgIFxweUBPbGRWZXJiYXRpbSUKK30KK1xyZW5ld2NvbW1hbmR7XGVuZHZlcmJhdGltfXslCisgICAgXHB5QE9sZEVuZFZlcmJhdGltJQorICBcZW5ke21pbmlwYWdlfSUKK30KKworJSBUaGlzIGRvZXMgYSBzaW1pbGFyIHRoaW5nIGZvciB0aGUge2FsbHR0fSBlbnZpcm9ubWVudDoKK1xSZXF1aXJlUGFja2FnZXthbGx0dH0KK1xsZXRccHlAT2xkQWxsVFQ9XGFsbHR0CitcbGV0XHB5QE9sZEVuZEFsbFRUPVxlbmRhbGx0dAorCitccmVuZXdjb21tYW5ke1xhbGx0dH17JQorICBcc2V0bGVuZ3Roe1xwYXJpbmRlbnR9ezFjbX0lCisgICUgQ2FsY3VsYXRlIHRoZSB0ZXh0IHdpZHRoIGZvciB0aGUgbWluaXBhZ2U6CisgIFxzZXRsZW5ndGh7XHB5QGNvZGV3aWR0aH17XGxpbmV3aWR0aH0lCisgIFxhZGR0b2xlbmd0aHtccHlAY29kZXdpZHRofXstXHBhcmluZGVudH0lCisgICUKKyAgXHBhclxpbmRlbnQlCisgIFxiZWdpbnttaW5pcGFnZX1bdF17XHB5QGNvZGV3aWR0aH0lCisgICAgXHNtYWxsJQorICAgIFxweUBPbGRBbGxUVCUKK30KK1xyZW5ld2NvbW1hbmR7XGVuZGFsbHR0fXslCisgICAgXHB5QE9sZEVuZEFsbFRUJQorICBcZW5ke21pbmlwYWdlfSUKK30KKworCitcbmV3Y29tbWFuZHtccHlAbW9kdWxlYmFka2V5fXt7LS1qdXN0LXNvbWUtanVuay0tfX0KKworCislJSAgTG90cyBvZiBpbmRleC1lbnRyeSBnZW5lcmF0aW9uIHN1cHBvcnQuCisKKyUgQ29tbWFuZCB0byB3cmFwIGFyb3VuZCBzdHVmZiB0aGF0IHJlZmVycyB0byBmdW5jdGlvbiAvIG1vZHVsZSAvCislIGF0dHJpYnV0ZSBuYW1lcyAgaW4gdGhlIGluZGV4LiAgRGVmYXVsdCBiZWhhdmlvcjogbGlrZSBcY29kZXt9LiAgVG8KKyUganVzdCBrZWVwIHRoZSBpbmRleCBlbnRyaWVzIGluIHRoZSByb21hbiBmb250LCB1bmNvbW1lbnQgdGhlIHNlY29uZAorJSBkZWZpbml0aW9uOyBpdCBtYXRjaGVzIE8nUmVpbGx5IHN0eWxlIG1vcmUuCislCitcbmV3Y29tbWFuZHtccHlAaWR4Y29kZX1bMV17XHRleHR0dHsjMX19CislXHJlbmV3Y29tbWFuZHtccHlAaWR4Y29kZX1bMV17IzF9CisKKyUgQ29tbWFuZCB0byBnZW5lcmF0ZSB0d28gaW5kZXggZW50cmllcyAodXNpbmcgc3ViZW50cmllcykKK1xuZXdjb21tYW5ke1xpbmRleGlpfVsyXXtcaW5kZXh7IzEhIzJ9XGluZGV4eyMyISMxfX0KKworJSBBbmQgdGhyZWUgZW50cmllcyAodXNpbmcgb25seSBvbmUgbGV2ZWwgb2Ygc3ViZW50cmllcykKK1xuZXdjb21tYW5ke1xpbmRleGlpaX1bM117XGluZGV4eyMxISMyICMzfVxpbmRleHsjMiEjMywgIzF9XGluZGV4eyMzISMxICMyfX0KKworJSBBbmQgZm91ciAoYWdhaW4sIHVzaW5nIG9ubHkgb25lIGxldmVsIG9mIHN1YmVudHJpZXMpCitcbmV3Y29tbWFuZHtcaW5kZXhpdn1bNF17CitcaW5kZXh7IzEhIzIgIzMgIzR9CitcaW5kZXh7IzIhIzMgIzQsICMxfQorXGluZGV4eyMzISM0LCAjMSAjMn0KK1xpbmRleHsjNCEjMSAjMiAjM30KK30KKworJSBDb21tYW5kIHRvIGdlbmVyYXRlIGEgcmVmZXJlbmNlIHRvIGEgZnVuY3Rpb24sIHN0YXRlbWVudCwga2V5d29yZCwKKyUgb3BlcmF0b3IuCitcbmV3Y29tbWFuZHtca3dpbmRleH1bMV17XGluZGV4aWl7a2V5d29yZH17IzFAe1xweUBpZHhjb2RleyMxfX19fQorXG5ld2NvbW1hbmR7XHN0aW5kZXh9WzFde1xpbmRleGlpe3N0YXRlbWVudH17IzFAe1xweUBpZHhjb2RleyMxfX19fQorXG5ld2NvbW1hbmR7XG9waW5kZXh9WzFde1xpbmRleGlpe29wZXJhdG9yfXsjMUB7XHB5QGlkeGNvZGV7IzF9fX19CitcbmV3Y29tbWFuZHtcZXhpbmRleH1bMV17XGluZGV4aWl7ZXhjZXB0aW9ufXsjMUB7XHB5QGlkeGNvZGV7IzF9fX19CitcbmV3Y29tbWFuZHtcb2JpbmRleH1bMV17XGluZGV4aWl7b2JqZWN0fXsjMX19CitcbmV3Y29tbWFuZHtcYmlmdW5jaW5kZXh9WzFdeyUKKyAgXGluZGV4eyMxQHtccHlAaWR4Y29kZXsjMSgpfX0gKGJ1aWx0LWluIGZ1bmN0aW9uKX19CisKKyUgQWRkIGFuIGluZGV4IGVudHJ5IGZvciBhIG1vZHVsZQorXG5ld2NvbW1hbmR7XHB5QHJlZm1vZHVsZX1bMl17XGluZGV4eyMxQHtccHlAaWR4Y29kZXsjMX19ICgjMm1vZHVsZSl9fQorXG5ld2NvbW1hbmR7XHJlZm1vZGluZGV4fVsxXXtccHlAcmVmbW9kdWxleyMxfXt9fQorXG5ld2NvbW1hbmR7XHJlZmJpbW9kaW5kZXh9WzFde1xweUByZWZtb2R1bGV7IzF9e2J1aWx0LWluIH19CitcbmV3Y29tbWFuZHtccmVmZXhtb2RpbmRleH1bMV17XHB5QHJlZm1vZHVsZXsjMX17ZXh0ZW5zaW9uIH19CitcbmV3Y29tbWFuZHtccmVmc3Rtb2RpbmRleH1bMV17XHB5QHJlZm1vZHVsZXsjMX17c3RhbmRhcmQgfX0KKworJSBSZWZlciB0byBhIG1vZHVsZSdzIGRvY3VtZW50YXRpb24gdXNpbmcgYSBoeXBlcmxpbmsgb2YgdGhlIG1vZHVsZSdzCislIG5hbWUsIGF0IGxlYXN0IGlmIHdlJ3JlIGJ1aWxkaW5nIFBERjoKK1xAaWZ1bmRlZmluZWR7cGRmYW5ub3RsaW5rfXslCisgIFxuZXdjb21tYW5ke1xyZWZtb2R1bGV9WzJdW1xweUBtb2R1bGViYWRrZXlde1xtb2R1bGV7IzJ9fQorfXslCisgIFxuZXdjb21tYW5ke1xyZWZtb2R1bGV9WzJdW1xweUBtb2R1bGViYWRrZXldeyUKKyAgICBcaWZ4XHB5QG1vZHVsZWJhZGtleSMxXGRlZlxweUBtb2R1bGVrZXl7IzJ9XGVsc2VcZGVmXHB5QG1vZHVsZWtleXsjMX1cZmklCisgICAgXHB5QGxpbmtUb05hbWV7bGFiZWwtbW9kdWxlLVxweUBtb2R1bGVrZXl9e1xtb2R1bGV7IzJ9fSUKKyAgfQorfQorCislIHN1cHBvcnQgZm9yIHRoZSBtb2R1bGUgaW5kZXgKK1xuZXdpZlxpZnB5QFVzZU1vZHVsZUluZGV4CitccHlAVXNlTW9kdWxlSW5kZXhmYWxzZQorCitcbmV3Y29tbWFuZHtcbWFrZW1vZGluZGV4fXsKKyAgXG5ld3dyaXRlXG1vZGluZGV4ZmlsZQorICBcb3Blbm91dFxtb2RpbmRleGZpbGU9bW9kXGpvYm5hbWUuaWR4CisgIFxweUBVc2VNb2R1bGVJbmRleHRydWUKK30KKworJSBBZGQgdGhlIGRlZmluaW5nIGVudHJ5IGZvciBhIG1vZHVsZQorXG5ld2NvbW1hbmR7XHB5QG1vZGluZGV4fVsyXXslCisgIFxyZW5ld2NvbW1hbmR7XHB5QHRoaXNtb2R1bGV9eyMxfQorICBcc2V0aW5kZXhzdWJpdGVteyhpbiBtb2R1bGUgIzEpfSUKKyAgXGluZGV4eyMxQHtccHlAaWR4Y29kZXsjMX19ICgjMm1vZHVsZSl8dGV4dGJmfSUKKyAgXGlmcHlAVXNlTW9kdWxlSW5kZXglCisgICAgXEBpZnVuZGVmaW5lZHtweUBtb2RwbGF0QFxweUB0aGlzbW9kdWxla2V5fXsKKyAgICAgIFx3cml0ZVxtb2RpbmRleGZpbGV7XHByb3RlY3RcaW5kZXhlbnRyeXsjMUB7XHRleHR0dHsjMX19fXtcdGhlcGFnZX19JQorICAgIH17XHdyaXRlXG1vZGluZGV4ZmlsZXtccHJvdGVjdFxpbmRleGVudHJ5eyMxQHtcdGV4dHR0eyMxfSAlCisgICAgICAgIFxlbXBoeyhccHlAcGxhdGZvcm1vZltccHlAdGhpc21vZHVsZWtleV17fSl9fX17XHRoZXBhZ2V9fSUKKyAgICB9CisgIFxmaSUKK30KKworJSAqKiogWFhYICoqKiBUSEUgTkVYVCBGT1VSIE1BQ1JPUyBBUkUgTk9XIE9CU09MRVRFICEhISAqKioKKworJSBidWlsdC1pbiAmIFB5dGhvbiBtb2R1bGVzIGluIHRoZSBtYWluIGRpc3RyaWJ1dGlvbgorXG5ld2NvbW1hbmR7XGJpbW9kaW5kZXh9WzFde1xweUBtb2RpbmRleHsjMX17YnVpbHQtaW4gfSUKKyAgXHR5cGVvdXR7KioqIE1BQ1JPIGJpbW9kaW5kZXggSVMgT0JTT0xFVEUgLS0gVVNFIGRlY2xhcmVtb2R1bGUgSU5TVEVBRCF9fQorXG5ld2NvbW1hbmR7XHN0bW9kaW5kZXh9WzFde1xweUBtb2RpbmRleHsjMX17c3RhbmRhcmQgfSUKKyAgXHR5cGVvdXR7KioqIE1BQ1JPIHN0bW9kaW5kZXggSVMgT0JTT0xFVEUgLS0gVVNFIGRlY2xhcmVtb2R1bGUgSU5TVEVBRCF9fQorCislIFB5dGhvbiAmIGV4dGVuc2lvbiBtb2R1bGVzIG91dHNpZGUgdGhlIG1haW4gZGlzdHJpYnV0aW9uCitcbmV3Y29tbWFuZHtcbW9kaW5kZXh9WzFde1xweUBtb2RpbmRleHsjMX17fSUKKyAgXHR5cGVvdXR7KioqIE1BQ1JPIG1vZGluZGV4IElTIE9CU09MRVRFIC0tIFVTRSBkZWNsYXJlbW9kdWxlIElOU1RFQUQhfX0KK1xuZXdjb21tYW5ke1xleG1vZGluZGV4fVsxXXtccHlAbW9kaW5kZXh7IzF9e2V4dGVuc2lvbiB9JQorICBcdHlwZW91dHsqKiogTUFDUk8gZXhtb2RpbmRleCBJUyBPQlNPTEVURSAtLSBVU0UgZGVjbGFyZW1vZHVsZSBJTlNURUFEIX19CisKKyUgQWRkaXRpb25hbCBzdHJpbmcgZm9yIGFuIGluZGV4IGVudHJ5CitcbmV3aWZcaWZweUB1c2luZ3N1Yml0ZW1ccHlAdXNpbmdzdWJpdGVtZmFsc2UKK1xuZXdjb21tYW5ke1xweUBpbmRleHN1Yml0ZW19e30KK1xuZXdjb21tYW5ke1xzZXRpbmRleHN1Yml0ZW19WzFde1xyZW5ld2NvbW1hbmR7XHB5QGluZGV4c3ViaXRlbX17ICMxfSUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxweUB1c2luZ3N1Yml0ZW10cnVlfQorXG5ld2NvbW1hbmR7XHR0aW5kZXh9WzFdeyUKKyAgXGlmcHlAdXNpbmdzdWJpdGVtCisgICAgXGluZGV4eyMxQHtccHlAaWR4Y29kZXsjMX19XHB5QGluZGV4c3ViaXRlbX0lCisgIFxlbHNlJQorICAgIFxpbmRleHsjMUB7XHB5QGlkeGNvZGV7IzF9fX0lCisgIFxmaSUKK30KK1xuZXdjb21tYW5ke1x3aXRoc3ViaXRlbX1bMl17JQorICBcYmVnaW5ncm91cCUKKyAgICBcZGVmXHR0aW5kZXgjIzF7XGluZGV4eyMjMUB7XHB5QGlkeGNvZGV7IyMxfX0gIzF9fSUKKyAgICAjMiUKKyAgXGVuZGdyb3VwJQorfQorCisKKyUgTW9kdWxlIHN5bm9wc2lzIHByb2Nlc3NpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUKK1xuZXdjb21tYW5ke1xweUB0aGlzY2xhc3N9e30KK1xuZXdjb21tYW5ke1xweUB0aGlzbW9kdWxlfXt9CitcbmV3Y29tbWFuZHtccHlAdGhpc21vZHVsZWtleX17fQorXG5ld2NvbW1hbmR7XHB5QHRoaXNtb2R1bGV0eXBlfXt9CisKK1xuZXdjb21tYW5ke1xweUBzdGFuZGFyZEluZGV4TW9kdWxlfVsxXXtccHlAbW9kaW5kZXh7IzF9e3N0YW5kYXJkIH19CitcbmV3Y29tbWFuZHtccHlAYnVpbHRpbkluZGV4TW9kdWxlfVsxXXtccHlAbW9kaW5kZXh7IzF9e2J1aWx0LWluIH19CitcbmV3Y29tbWFuZHtccHlAZXh0ZW5zaW9uSW5kZXhNb2R1bGV9WzFde1xweUBtb2RpbmRleHsjMX17ZXh0ZW5zaW9uIH19CitcbmV3Y29tbWFuZHtccHlASW5kZXhNb2R1bGV9WzFde1xweUBtb2RpbmRleHsjMX17fX0KKworXG5ld2lmXGlmcHlASGF2ZU1vZFN5bm9wc2lzICAgICAgIFxweUBIYXZlTW9kU3lub3BzaXNmYWxzZQorXG5ld2lmXGlmcHlATW9kU3lub3BzaXNGaWxlSXNPcGVuIFxweUBNb2RTeW5vcHNpc0ZpbGVJc09wZW5mYWxzZQorXG5ld2lmXGlmcHlASGF2ZU1vZFBsYXRmb3JtICAgICAgIFxweUBIYXZlTW9kUGxhdGZvcm1mYWxzZQorCislIFxkZWNsYXJlbW9kdWxlW2tleV17dHlwZX17bmFtZX0KK1xuZXdjb21tYW5ke1xkZWNsYXJlbW9kdWxlfVszXVtccHlAbW9kdWxlYmFka2V5XXsKKyAgXHB5QG9wZW5Nb2RTeW5vcHNpc0ZpbGUKKyAgXHJlbmV3Y29tbWFuZHtccHlAdGhpc21vZHVsZXR5cGV9eyMyfQorICBcaWZ4XHB5QG1vZHVsZWJhZGtleSMxCisgICAgXHJlbmV3Y29tbWFuZHtccHlAdGhpc21vZHVsZWtleX17IzN9CisgIFxlbHNlCisgICAgXHJlbmV3Y29tbWFuZHtccHlAdGhpc21vZHVsZWtleX17IzF9CisgIFxmaQorICBcQGlmdW5kZWZpbmVke3B5QCMySW5kZXhNb2R1bGV9eyUKKyAgICBcdHlwZW91dHsqKiogTUFDUk8gZGVjbGFyZW1vZHVsZSBjYWxsZWQgd2l0aCB1bmtub3duIG1vZHVsZSB0eXBlOiBgIzInfQorICAgIFxweUBJbmRleE1vZHVsZXsjM30lCisgIH17JQorICAgIFxjc25hbWUgcHlAIzJJbmRleE1vZHVsZVxlbmRjc25hbWV7IzN9JQorICB9CisgIFxsYWJlbHttb2R1bGUtXHB5QHRoaXNtb2R1bGVrZXl9Cit9CitcbmV3aWZcaWZweUBNb2RQbGF0Zm9ybUZpbGVJc09wZW4gXHB5QE1vZFBsYXRmb3JtRmlsZUlzT3BlbmZhbHNlCitcbmV3Y29tbWFuZHtccHlATW9kUGxhdGZvcm1GaWxlbmFtZX17XGpvYm5hbWUucGxhfQorXG5ld2NvbW1hbmR7XHBsYXRmb3JtfVsxXXsKKyAgXGlmcHlATW9kUGxhdGZvcm1GaWxlSXNPcGVuXGVsc2UKKyAgICBcbmV3d3JpdGVccHlATW9kUGxhdGZvcm1GaWxlCisgICAgXG9wZW5vdXRccHlATW9kUGxhdGZvcm1GaWxlPVxweUBNb2RQbGF0Zm9ybUZpbGVuYW1lCisgICAgXHB5QE1vZFBsYXRmb3JtRmlsZUlzT3BlbnRydWUKKyAgXGZpCit9CitcSW5wdXRJZkZpbGVFeGlzdHN7XGpvYm5hbWUucGxhfXt9e30KK1xuZXdjb21tYW5ke1xweUBwbGF0Zm9ybW9mfVsyXVtccHlAbW9kdWxlYmFka2V5XXslCisgIFxpZnhccHlAbW9kdWxlYmFka2V5IzEgXGRlZlxweUBrZXl7IzJ9JQorICBcZWxzZSBcZGVmXHB5QGtleXsjMX0lCisgIFxmaSUKKyAgXGNzbmFtZSBweUBtb2RwbGF0QFxweUBrZXlcZW5kY3NuYW1lJQorfQorXG5ld2NvbW1hbmR7XGlnbm9yZVBsYXRmb3JtQW5ub3RhdGlvbn1bMV17fQorCislIFxtb2R1bGVhdXRob3J7bmFtZX17ZW1haWx9CitcbmV3Y29tbWFuZHtcbW9kdWxlYXV0aG9yfVsyXXt9CisKKyUgXHNlY3Rpb25hdXRob3J7bmFtZX17ZW1haWx9CitcbmV3Y29tbWFuZHtcc2VjdGlvbmF1dGhvcn1bMl17fQorCisKK1xuZXdjb21tYW5ke1xweUBkZWZzeW5vcHNpc317TW9kdWxlIGhhcyBubyBzeW5vcHNpcy59CitcbmV3Y29tbWFuZHtccHlAbW9kdWxlc3lub3BzaXN9e1xweUBkZWZzeW5vcHNpc30KK1xuZXdjb21tYW5ke1xtb2R1bGVzeW5vcHNpc31bMV17CisgIFxweUBIYXZlTW9kU3lub3BzaXN0cnVlCisgIFxyZW5ld2NvbW1hbmR7XHB5QG1vZHVsZXN5bm9wc2lzfXsjMX0KK30KKworJSBkZWZpbmUgdGhlIGZpbGUKK1xuZXd3cml0ZVxweUBNb2RTeW5vcHNpc0ZpbGUKKworJSBoYWNrZWQgZnJvbSBcYWRkdG9jb250ZW50cyBmcm9tIGxhdGV4Lmx0eDoKK1xsb25nXGRlZlxweUB3cml0ZU1vZFN5bm9wc2lzRmlsZSMxeyUKKyAgXHByb3RlY3RlZEB3cml0ZVxweUBNb2RTeW5vcHNpc0ZpbGUlCisgICAgICB7XGxldFxsYWJlbFxAZ29iYmxlIFxsZXRcaW5kZXhcQGdvYmJsZSBcbGV0XGdsb3NzYXJ5XEBnb2JibGV9JQorICAgICAge1xzdHJpbmcjMX0lCit9CitcbmV3Y29tbWFuZHtccHlAY2xvc2VNb2RTeW5vcHNpc0ZpbGV9eworICBcaWZweUBNb2RTeW5vcHNpc0ZpbGVJc09wZW4KKyAgICBcY2xvc2VvdXRccHlATW9kU3lub3BzaXNGaWxlCisgICAgXHB5QE1vZFN5bm9wc2lzRmlsZUlzT3BlbmZhbHNlCisgIFxmaQorfQorXG5ld2NvbW1hbmR7XHB5QG9wZW5Nb2RTeW5vcHNpc0ZpbGV9eworICBcaWZweUBNb2RTeW5vcHNpc0ZpbGVJc09wZW5cZWxzZQorICAgIFxvcGVub3V0XHB5QE1vZFN5bm9wc2lzRmlsZT1ccHlATW9kU3lub3BzaXNGaWxlbmFtZQorICAgIFxweUBNb2RTeW5vcHNpc0ZpbGVJc09wZW50cnVlCisgIFxmaQorfQorCitcbmV3Y29tbWFuZHtccHlAUHJvY2Vzc01vZFN5bm9wc2lzfXsKKyAgXGlmcHlASGF2ZU1vZFN5bm9wc2lzCisgICAgXHB5QHdyaXRlTW9kU3lub3BzaXNGaWxle1xtb2R1bGVzeW5vcHNpcyUKKyAgICAgIHtccHlAdGhpc21vZHVsZWtleX17XHB5QHRoaXNtb2R1bGV9JQorICAgICAge1xweUB0aGlzbW9kdWxldHlwZX17XHB5QG1vZHVsZXN5bm9wc2lzfX0lCisgICAgXHB5QEhhdmVNb2RTeW5vcHNpc2ZhbHNlCisgIFxmaQorICBccmVuZXdjb21tYW5ke1xweUBtb2R1bGVzeW5vcHNpc317XHB5QGRlZnN5bm9wc2lzfQorfQorXEF0RW5kRG9jdW1lbnR7XHB5QFByb2Nlc3NNb2RTeW5vcHNpc1xweUBjbG9zZU1vZFN5bm9wc2lzRmlsZX0KKworCitcbG9uZ1xkZWZccHlAd3JpdGVNb2RQbGF0Zm9ybUZpbGUjMXslCisgIFxwcm90ZWN0ZWRAd3JpdGVccHlATW9kUGxhdGZvcm1GaWxlJQorICAgIHtcbGV0XGxhYmVsXEBnb2JibGUgXGxldFxpbmRleFxAZ29iYmxlIFxsZXRcZ2xvc3NhcnlcQGdvYmJsZX0lCisgICAge1xzdHJpbmcjMX0lCit9CisKKworXG5ld2NvbW1hbmR7XGxvY2FsbW9kdWxldGFibGV9eworICBcSWZGaWxlRXhpc3Rze1xweUBNb2RTeW5vcHNpc0ZpbGVuYW1lfXsKKyAgICBcYmVnaW57c3lub3BzaXN0YWJsZX0KKyAgICAgIFxpbnB1dHtccHlATW9kU3lub3BzaXNGaWxlbmFtZX0KKyAgICBcZW5ke3N5bm9wc2lzdGFibGV9CisgIH17fQorfQorCitcQGlmdW5kZWZpbmVke3BkZm91dHB1dH17CisgIFxuZXdjb21tYW5ke1xweUBNb2RTeW5vcHNpc1N1bW1hcnl9WzRde1xiZmNvZGV7IzJ9ICYgIzRcXH0KK317CisgIFxuZXdjb21tYW5ke1xweUBNb2RTeW5vcHNpc1N1bW1hcnl9WzRdeyUKKyAgICBccHlAbGlua1RvTmFtZXtsYWJlbC1tb2R1bGUtIzF9e1xiZmNvZGV7IzJ9fSAmICM0XFwKKyAgfQorfQorXG5ld2Vudmlyb25tZW50e3N5bm9wc2lzdGFibGV9eworICAlIGtleSwgbmFtZSwgdHlwZSwgc3lub3BzaXMKKyAgXGxldFxtb2R1bGVzeW5vcHNpcz1ccHlATW9kU3lub3BzaXNTdW1tYXJ5CisgIFxiZWdpbnt0YWJ1bGFyfXtsbH0KK317CisgIFxlbmR7dGFidWxhcn0KK30KKyUKKyUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitcbmV3Y29tbWFuZHtccHlAcmVzZXR9eworICBccHlAdXNpbmdzdWJpdGVtZmFsc2UKKyAgXHB5QFByb2Nlc3NNb2RTeW5vcHNpcworICBccmVuZXdjb21tYW5ke1xweUB0aGlzY2xhc3N9e30KKyAgXHJlbmV3Y29tbWFuZHtccHlAdGhpc21vZHVsZX17fQorICBccmVuZXdjb21tYW5ke1xweUB0aGlzbW9kdWxla2V5fXt9CisgIFxyZW5ld2NvbW1hbmR7XHB5QHRoaXNtb2R1bGV0eXBlfXt9Cit9CisKKyUgQXVnbWVudCB0aGUgc2VjdGlvbmluZyBjb21tYW5kcyB1c2VkIHRvIGdldCBvdXIgb3duIGZvbnQgZmFtaWx5IGluIHBsYWNlLAorJSBhbmQgcmVzZXQgc29tZSBpbnRlcm5hbCBkYXRhIGl0ZW1zOgorXHJlbmV3Y29tbWFuZHtcc2VjdGlvbn17XHB5QHJlc2V0JQorICAgICAgICAgICAgICAgICAgICAgICAgXEBzdGFydHNlY3Rpb257c2VjdGlvbn17MX17XHpAfSUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMy41ZXggXEBwbHVzIC0xZXggXEBtaW51cyAtLjJleH0lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Mi4zZXggXEBwbHVzLjJleH0lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJlc2V0QGZvbnRcTGFyZ2VccHlASGVhZGVyRmFtaWx5fX0KK1xyZW5ld2NvbW1hbmR7XHN1YnNlY3Rpb259e1xAc3RhcnRzZWN0aW9ue3N1YnNlY3Rpb259ezJ9e1x6QH0lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTMuMjVleFxAcGx1cyAtMWV4IFxAbWludXMgLS4yZXh9JQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEuNWV4IFxAcGx1cyAuMmV4fSUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtccmVzZXRAZm9udFxsYXJnZVxweUBIZWFkZXJGYW1pbHl9fQorXHJlbmV3Y29tbWFuZHtcc3Vic3Vic2VjdGlvbn17XEBzdGFydHNlY3Rpb257c3Vic3Vic2VjdGlvbn17M317XHpAfSUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMy4yNWV4XEBwbHVzIC0xZXggXEBtaW51cyAtLjJleH0lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MS41ZXggXEBwbHVzIC4yZXh9JQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyZXNldEBmb250XG5vcm1hbHNpemVccHlASGVhZGVyRmFtaWx5fX0KK1xyZW5ld2NvbW1hbmR7XHBhcmFncmFwaH17XEBzdGFydHNlY3Rpb257cGFyYWdyYXBofXs0fXtcekB9JQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMuMjVleCBcQHBsdXMxZXggXEBtaW51cy4yZXh9JQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0xZW19JQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyZXNldEBmb250XG5vcm1hbHNpemVccHlASGVhZGVyRmFtaWx5fX0KK1xyZW5ld2NvbW1hbmR7XHN1YnBhcmFncmFwaH17XEBzdGFydHNlY3Rpb257c3VicGFyYWdyYXBofXs1fXtccGFyaW5kZW50fSUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszLjI1ZXggXEBwbHVzMWV4IFxAbWludXMgLjJleH0lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTFlbX0lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJlc2V0QGZvbnRcbm9ybWFsc2l6ZVxweUBIZWFkZXJGYW1pbHl9fQorCisKKyUgVGhpcyBnZXRzIHRoZSB1bmRlcnNjb3JlcyBjbG9zZXIgdG8gdGhlIHJpZ2h0IHdpZHRoOyB0aGUgb25seSBjaGFuZ2UKKyUgZnJvbSBzdGFuZGFyZCBMYVRlWCBpcyB0aGUgd2lkdGggc3BlY2lmaWVkLgorCitcRGVjbGFyZVRleHRDb21tYW5kRGVmYXVsdHtcdGV4dHVuZGVyc2NvcmV9eyUKKyAgXGxlYXZldm1vZGUgXGtlcm4uMDZlbVx2Ym94e1xocnVsZVxAd2lkdGguNTVlbX19CisKKyUgVW5kZXJzY29yZSBoYWNrIChvbmx5IGFjdCBsaWtlIHN1YnNjcmlwdCBvcGVyYXRvciBpZiBpbiBtYXRoIG1vZGUpCislCislIFRoZSBmb2xsb3dpbmcgaXMgZHVlIHRvIE1hcmsgV29vZGluZyAodGhlIG9sZCB2ZXJzaW9uIGRpZG4ndCB3b3JrIHdpdGgKKyUgTGF0ZXggMmUuCisKK1xEZWNsYXJlUm9idXN0Q29tbWFuZFxoYWNrc2NvcmV7JQorICBcaWZtbW9kZV9cZWxzZVx0ZXh0dW5kZXJzY29yZVxmaSUKK30KK1xiZWdpbmdyb3VwCitcY2F0Y29kZWBcX1xhY3RpdmUKK1xkZWZcbmV4dHslCisgIFxBdEJlZ2luRG9jdW1lbnR7XGNhdGNvZGVgXF9cYWN0aXZlXGRlZl97XGhhY2tzY29yZXt9fX0lCit9CitcZXhwYW5kYWZ0ZXJcZW5kZ3JvdXBcbmV4dAorCisKKyUgTm93IGZvciBhIGxvdCBvZiBzZW1hbnRpY2FsbHktbG9hZGVkIGVudmlyb25tZW50cyB0aGF0IGRvIGEgdG9uIG9mIG1hZ2ljYWwKKyUgdGhpbmdzIHRvIGdldCB0aGUgcmlnaHQgZm9ybWF0dGluZyBhbmQgaW5kZXggZW50cmllcyBmb3IgdGhlIHN0dWZmIGluCislIFB5dGhvbiBtb2R1bGVzIGFuZCBDIEFQSS4KKworCislIHtmdWxsbGluZWl0ZW1zfSBpcyB1c2VkIGluIG9uZSBwbGFjZSBpbiBsaWJyZWdleC50ZXgsIGJ1dCBpcyByZWFsbHkgZm9yCislIGludGVybmFsIHVzZSBpbiB0aGlzIGZpbGUuCislCitcbmV3Y29tbWFuZHtccHlAaXRlbW5ld2xpbmV9WzFdeyUKKyAgXEB0ZW1wZGltYVxsaW5ld2lkdGglCisgIFxhZHZhbmNlXEB0ZW1wZGltYSBcbGVmdG1hcmdpblxtYWtlYm94W1xAdGVtcGRpbWFdW2xdeyMxfSUKK30KKworXG5ld2Vudmlyb25tZW50e2Z1bGxsaW5laXRlbXN9eworICBcYmVnaW57bGlzdH17fXtcbGFiZWx3aWR0aCBcbGVmdG1hcmdpbiBcbGFiZWxzZXAgMHB0CisgICAgICAgICAgICAgICAgIFxyaWdodG1hcmdpbiAwcHQgXHRvcHNlcCAtXHBhcnNraXAgXHBhcnRvcHNlcCBccGFyc2tpcAorICAgICAgICAgICAgICAgICBcaXRlbXNlcCAtXHBhcnNlcAorICAgICAgICAgICAgICAgICBcbGV0XG1ha2VsYWJlbD1ccHlAaXRlbW5ld2xpbmV9Cit9e1xlbmR7bGlzdH19CisKKyUgXG9wdGlvbmFsIGlzIG1vc3RseSBmb3IgdXNlIGluIHRoZSBhcmd1bWVudHMgcGFyYW1ldGVycyB0byB0aGUgdmFyaW91cworJSB7KmRlc2N9IGVudmlyb25tZW50cyBkZWZpbmVkIGJlbG93LCBidXQgbWF5IGJlIHVzZWQgZWxzZXdoZXJlLiAgS25vd24gdG8KKyUgYmUgdXNlZCBpbiB0aGUgZGVidWdnZXIgY2hhcHRlci4KKyUKKyUgVHlwaWNhbCB1c2FnZToKKyUKKyUgICAgIFxiZWdpbntmdW5jZGVzY317bXlmdW5jfXtyZXFwYXJtXG9wdGlvbmFseywgb3B0cGFybX19CislICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eICAgICAgIF5eXgorJSAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gc3BhY2UgaGVyZSAgICAgICBObyBzcGFjZSBoZXJlCislCislIFdoZW4gYSBmdW5jdGlvbiBoYXMgbXVsdGlwbGUgb3B0aW9uYWwgcGFyYW1ldGVycywgXG9wdGlvbmFsIHNob3VsZCBiZQorJSBuZXN0ZWQsIG5vdCBjaGFpbmVkLiAgVGhpcyBpcyByaWdodDoKKyUKKyUgICAgIFxiZWdpbntmdW5jZGVzY317bXlmdW5jfXtcb3B0aW9uYWx7cGFybTFcb3B0aW9uYWx7LCBwYXJtMn19fQorJQorXGxldFxweUBiYWRrZXk9XEB1bmRlZmluZWQKKworXG5ld2NvbW1hbmR7XG9wdGlvbmFsfVsxXXslCisgIHtcdGV4dG5vcm1hbHtcTGFyZ2VbfX17IzF9XGhzcGFjZXswLjVtbX17XHRleHRub3JtYWx7XExhcmdlXX19fQorCislIFRoaXMgY2FuIGJlIHVzZWQgd2hlbiBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBhY2NlcHRzIGFuIHZhcnlpbmcgbnVtYmVyIAorJSBvZiBhcmd1bWVudHMsIHN1Y2ggYXMgYnkgdXNpbmcgdGhlICphcmdzIHN5bnRheCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QuCitcbmV3Y29tbWFuZHtccHlAbW9yZWFyZ3N9ey4uLn0KKworJSBUaGlzIGNhbiBiZSB1c2VkIHdoZW4geW91IGRvbid0IHdhbnQgdG8gZG9jdW1lbnQgdGhlIHBhcmFtZXRlcnMgdG8gYSAKKyUgZnVuY3Rpb24gb3IgbWV0aG9kLCBidXQgc2ltcGx5IHN0YXRlIHRoYXQgaXQncyBhbiBhbGlhcyBmb3IKKyUgc29tZXRoaW5nIGVsc2UuCitcbmV3Y29tbWFuZHtccHlAdW5zcGVjaWZpZWR9ey4uLn0KKworJSBDIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUgXGJlZ2lue2NmdW5jZGVzY31bcmVmY291bnRde3R5cGV9e25hbWV9e2FyZ2xpc3R9CislIE5vdGUgdGhhdCB0aGUgW3JlZmNvdW50XSBzbG90IHNob3VsZCBvbmx5IGJlIGZpbGxlZCBpbiBieQorJSB0b29scy9hbm5vLWFwaS5weTsgaXQgcHVsbHMgdGhlIHZhbHVlIGZyb20gdGhlIHJlZmNvdW50cyBkYXRhYmFzZS4KK1xuZXdlbnZpcm9ubWVudHtjZnVuY2Rlc2N9WzRdW1xweUBiYWRrZXldeworICBcYmVnaW57ZnVsbGxpbmVpdGVtc30KKyAgICBcaXRlbVtcY29kZXsjMiBcYmZjb2RleyMzfShccHlAdmFydmFyc3sjNH0pfVxpbmRleHsjM0B7XHB5QGlkeGNvZGV7IzMoKX19fV0KKyAgICBcaWZ4IzFcQHVuZGVmaW5lZFxlbHNlJQorICAgICAgXGVtcGh7UmV0dXJuIHZhbHVlOiBcdGV4dGJmeyMxfS59XFwKKyAgICBcZmkKK317XGVuZHtmdWxsbGluZWl0ZW1zfX0KKworJSBDIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUgXGJlZ2lue2N2YXJkZXNjfXt0eXBlfXtuYW1lfQorXG5ld2Vudmlyb25tZW50e2N2YXJkZXNjfVsyXXsKKyAgXGJlZ2lue2Z1bGxsaW5laXRlbXN9CisgICAgXGl0ZW1bXGNvZGV7IzEgXGJmY29kZXsjMn19XGluZGV4eyMyQHtccHlAaWR4Y29kZXsjMn19fV0KK317XGVuZHtmdWxsbGluZWl0ZW1zfX0KKworJSBDIGRhdGEgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUgXGJlZ2lue2N0eXBlZGVzY31baW5kZXggbmFtZV17dHlwZWRlZiBuYW1lfQorXG5ld2Vudmlyb25tZW50e2N0eXBlZGVzY31bMl1bXHB5QGJhZGtleV17CisgIFxiZWdpbntmdWxsbGluZWl0ZW1zfQorICAgIFxpdGVtW1xiZmNvZGV7IzJ9JQorICAgIFxpZngjMVxAdW5kZWZpbmVkJQorICAgICAgXGluZGV4eyMyQHtccHlAaWR4Y29kZXsjMn19IChDIHR5cGUpfQorICAgIFxlbHNlJQorICAgICAgXGluZGV4eyMyQHtccHlAaWR4Y29kZXsjMX19IChDIHR5cGUpfQorICAgIFxmaV0KK317XGVuZHtmdWxsbGluZWl0ZW1zfX0KKworJSBGdW5reSBtYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUgXGJlZ2lue2NzaW1wbGVtYWNyb317bmFtZX0KKyUgLS0gInNpbXBsZSIgYmVjYXVzZSBpdCBoYXMgbm8gYXJnczsgTk9UIGZvciBjb25zdGFudCBkZWZpbml0aW9ucyEKK1xuZXdlbnZpcm9ubWVudHtjc2ltcGxlbWFjcm9kZXNjfVsxXXsKKyAgXGJlZ2lue2Z1bGxsaW5laXRlbXN9CisgICAgXGl0ZW1bXGJmY29kZXsjMX1caW5kZXh7IzFAe1xweUBpZHhjb2RleyMxfX0gKG1hY3JvKX1dCit9e1xlbmR7ZnVsbGxpbmVpdGVtc319CisKKyUgc2ltcGxlIGZ1bmN0aW9ucyAobm90IG1ldGhvZHMpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislIFxiZWdpbntmdW5jZGVzY317bmFtZX17YXJnc30KK1xuZXdjb21tYW5ke1xmdW5jbGluZX1bMl17JQorICBcZnVuY2xpbmVuaXsjMX17IzJ9JQorICBcaW5kZXh7IzFAe1xweUBpZHhjb2RleyMxKCl9fSAoaW4gbW9kdWxlIFxweUB0aGlzbW9kdWxlKX19CitcbmV3ZW52aXJvbm1lbnR7ZnVuY2Rlc2N9WzJdeworICBcYmVnaW57ZnVsbGxpbmVpdGVtc30KKyAgICBcZnVuY2xpbmV7IzF9eyMyfQorfXtcZW5ke2Z1bGxsaW5laXRlbXN9fQorCislIHNpbWlsYXIgdG8ge2Z1bmNkZXNjfSwgYnV0IGRvZXNuJ3QgYWRkIHRvIHRoZSBpbmRleAorXG5ld2NvbW1hbmR7XGZ1bmNsaW5lbml9WzJde1xpdGVtW1xjb2Rle1xiZmNvZGV7IzF9KFxweUB2YXJ2YXJzeyMyfSl9XX0KK1xuZXdlbnZpcm9ubWVudHtmdW5jZGVzY25pfVsyXXsKKyAgXGJlZ2lue2Z1bGxsaW5laXRlbXN9CisgICAgXGZ1bmNsaW5lbml7IzF9eyMyfQorfXtcZW5ke2Z1bGxsaW5laXRlbXN9fQorCislIGNsYXNzZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJSBcYmVnaW57Y2xhc3NkZXNjfXtuYW1lfXtjb25zdHJ1Y3RvciBhcmdzfQorXG5ld2Vudmlyb25tZW50e2NsYXNzZGVzY31bMl17CisgICUgVXNpbmcgXHJlbmV3Y29tbWFuZCBkb2Vzbid0IHdvcmsgZm9yIHRoaXMsIGZvciB1bmtub3duIHJlYXNvbnM6CisgIFxnbG9iYWxcZGVmXHB5QHRoaXNjbGFzc3sjMX0KKyAgXGJlZ2lue2Z1bGxsaW5laXRlbXN9CisgICAgXGl0ZW1bXHN0cm9uZ3tjbGFzcyB9XGNvZGV7XGJmY29kZXsjMX0oXHB5QHZhcnZhcnN7IzJ9KX0lCisgICAgICBcaW5kZXh7IzFAe1xweUBpZHhjb2RleyMxfX0gKGNsYXNzIGluIFxweUB0aGlzbW9kdWxlKX1dCit9e1xlbmR7ZnVsbGxpbmVpdGVtc319CisKKyUgXGJlZ2lue2V4Y2NsYXNzZGVzY317bmFtZX17Y29uc3RydWN0b3IgYXJnc30KKyUgYnV0IGluZGV4ZXMgYXMgYW4gZXhjZXB0aW9uCitcbmV3ZW52aXJvbm1lbnR7ZXhjY2xhc3NkZXNjfVsyXXsKKyAgJSBVc2luZyBccmVuZXdjb21tYW5kIGRvZXNuJ3Qgd29yayBmb3IgdGhpcywgZm9yIHVua25vd24gcmVhc29uczoKKyAgXGdsb2JhbFxkZWZccHlAdGhpc2NsYXNzeyMxfQorICBcYmVnaW57ZnVsbGxpbmVpdGVtc30KKyAgICBcaXRlbVtcc3Ryb25ne2V4Y2VwdGlvbiB9XGNvZGV7XGJmY29kZXsjMX0oXHB5QHZhcnZhcnN7IzJ9KX0lCisgICAgICBcaW5kZXh7IzFAe1xweUBpZHhjb2RleyMxfX0gKGV4Y2VwdGlvbiBpbiBccHlAdGhpc21vZHVsZSl9XQorfXtcZW5ke2Z1bGxsaW5laXRlbXN9fQorCisKK1xsZXRccHlAY2xhc3NiYWRrZXk9XEB1bmRlZmluZWQKKworJSBvYmplY3QgbWV0aG9kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUgXGJlZ2lue21ldGhvZGRlc2N9W2NsYXNzbmFtZV17bWV0aG9kbmFtZX17YXJnc30KK1xuZXdjb21tYW5ke1xtZXRob2RsaW5lfVszXVtcQHVuZGVmaW5lZF17CisgIFxtZXRob2RsaW5lbml7IzJ9eyMzfQorICBcaWZ4IzFcQHVuZGVmaW5lZAorICAgIFxpbmRleHsjMkB7XHB5QGlkeGNvZGV7IzIoKX19IChccHlAdGhpc2NsYXNzXCBtZXRob2QpfQorICBcZWxzZQorICAgIFxpbmRleHsjMkB7XHB5QGlkeGNvZGV7IzIoKX19ICgjMSBtZXRob2QpfQorICBcZmkKK30KK1xuZXdlbnZpcm9ubWVudHttZXRob2RkZXNjfVszXVtcQHVuZGVmaW5lZF17CisgIFxiZWdpbntmdWxsbGluZWl0ZW1zfQorICAgIFxpZngjMVxAdW5kZWZpbmVkCisgICAgICBcbWV0aG9kbGluZXsjMn17IzN9CisgICAgXGVsc2UKKyAgICAgIFxkZWZccHlAdGhpc2NsYXNzeyMxfQorICAgICAgXG1ldGhvZGxpbmV7IzJ9eyMzfQorICAgIFxmaQorfXtcZW5ke2Z1bGxsaW5laXRlbXN9fQorCislIHNpbWlsYXIgdG8ge21ldGhvZGRlc2N9LCBidXQgZG9lc24ndCBhZGQgdG8gdGhlIGluZGV4CislIChuZXZlciBhY3R1YWxseSB1c2VzIHRoZSBvcHRpb25hbCBhcmd1bWVudCkKK1xuZXdjb21tYW5ke1xtZXRob2RsaW5lbml9WzNdW1xweUBjbGFzc2JhZGtleV17JQorICBcaXRlbVtcY29kZXtcYmZjb2RleyMyfShccHlAdmFydmFyc3sjM30pfV19CitcbmV3ZW52aXJvbm1lbnR7bWV0aG9kZGVzY25pfVszXVtccHlAY2xhc3NiYWRrZXldeworICBcYmVnaW57ZnVsbGxpbmVpdGVtc30KKyAgICBcbWV0aG9kbGluZW5peyMyfXsjM30KK317XGVuZHtmdWxsbGluZWl0ZW1zfX0KKworJSBvYmplY3QgZGF0YSBhdHRyaWJ1dGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUgXGJlZ2lue21lbWJlcmRlc2N9W2NsYXNzbmFtZV17bWVtYmVybmFtZX0KK1xuZXdjb21tYW5ke1xtZW1iZXJsaW5lfVsyXVtccHlAY2xhc3NiYWRrZXldeyUKKyAgXGlmeCMxXEB1bmRlZmluZWQKKyAgICBcbWVtYmVybGluZW5peyMyfQorICAgIFxpbmRleHsjMkB7XHB5QGlkeGNvZGV7IzJ9fSAoXHB5QHRoaXNjbGFzc1wgYXR0cmlidXRlKX0KKyAgXGVsc2UKKyAgICBcbWVtYmVybGluZW5peyMyfQorICAgIFxpbmRleHsjMkB7XHB5QGlkeGNvZGV7IzJ9fSAoIzEgYXR0cmlidXRlKX0KKyAgXGZpCit9CitcbmV3ZW52aXJvbm1lbnR7bWVtYmVyZGVzY31bMl1bXHB5QGNsYXNzYmFka2V5XXsKKyAgXGJlZ2lue2Z1bGxsaW5laXRlbXN9CisgICAgXGlmeCMxXEB1bmRlZmluZWQKKyAgICAgIFxtZW1iZXJsaW5leyMyfQorICAgIFxlbHNlCisgICAgICBcZGVmXHB5QHRoaXNjbGFzc3sjMX0KKyAgICAgIFxtZW1iZXJsaW5leyMyfQorICAgIFxmaQorfXtcZW5ke2Z1bGxsaW5laXRlbXN9fQorCislIHNpbWlsYXIgdG8ge21lbWJlcmRlc2N9LCBidXQgZG9lc24ndCBhZGQgdG8gdGhlIGluZGV4CislIChuZXZlciBhY3R1YWxseSB1c2VzIHRoZSBvcHRpb25hbCBhcmd1bWVudCkKK1xuZXdjb21tYW5ke1xtZW1iZXJsaW5lbml9WzJdW1xweUBjbGFzc2JhZGtleV17XGl0ZW1bXGJmY29kZXsjMn1dfQorXG5ld2Vudmlyb25tZW50e21lbWJlcmRlc2NuaX1bMl1bXHB5QGNsYXNzYmFka2V5XXsKKyAgXGJlZ2lue2Z1bGxsaW5laXRlbXN9CisgICAgXG1lbWJlcmxpbmVuaXsjMn0KK317XGVuZHtmdWxsbGluZWl0ZW1zfX0KKworJSBGb3IgZXhjZXB0aW9uczogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUgXGJlZ2lue2V4Y2Rlc2N9e25hbWV9CislICAtLSBmb3IgY29uc3RydWN0b3IgaW5mb3JtYXRpb24sIHVzZSBleGNjbGFzc2Rlc2MgaW5zdGVhZAorXG5ld2Vudmlyb25tZW50e2V4Y2Rlc2N9WzFdeworICBcYmVnaW57ZnVsbGxpbmVpdGVtc30KKyAgICBcaXRlbVtcc3Ryb25ne2V4Y2VwdGlvbiB9XGJmY29kZXsjMX0lCisgICAgICAgICAgXGluZGV4eyMxQHtccHlAaWR4Y29kZXsjMX19IChleGNlcHRpb24gaW4gXHB5QHRoaXNtb2R1bGUpfV0KK317XGVuZHtmdWxsbGluZWl0ZW1zfX0KKworJSBNb2R1bGUgZGF0YSBvciBjb25zdGFudHM6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyUgXGJlZ2lue2RhdGFkZXNjfXtuYW1lfQorXG5ld2NvbW1hbmR7XGRhdGFsaW5lfVsxXXslCisgIFxkYXRhbGluZW5peyMxfVxpbmRleHsjMUB7XHB5QGlkeGNvZGV7IzF9fSAoZGF0YSBpbiBccHlAdGhpc21vZHVsZSl9fQorXG5ld2Vudmlyb25tZW50e2RhdGFkZXNjfVsxXXsKKyAgXGJlZ2lue2Z1bGxsaW5laXRlbXN9CisgICAgXGRhdGFsaW5leyMxfQorfXtcZW5ke2Z1bGxsaW5laXRlbXN9fQorCislIHNpbWlsYXIgdG8ge2RhdGFkZXNjfSwgYnV0IGRvZXNuJ3QgYWRkIHRvIHRoZSBpbmRleAorXG5ld2NvbW1hbmR7XGRhdGFsaW5lbml9WzFde1xpdGVtW1xiZmNvZGV7IzF9XVxub3BhZ2VicmVha30KK1xuZXdlbnZpcm9ubWVudHtkYXRhZGVzY25pfVsxXXsKKyAgXGJlZ2lue2Z1bGxsaW5laXRlbXN9CisgICAgXGRhdGFsaW5lbml7IzF9Cit9e1xlbmR7ZnVsbGxpbmVpdGVtc319CisKKyUgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislIFxiZWdpbntvcGNvZGVkZXNjfXtuYW1lfXt2YXJ9CislIC0tIHt2YXJ9IG1heSBiZSB7fQorXG5ld2Vudmlyb25tZW50e29wY29kZWRlc2N9WzJdeworICBcYmVnaW57ZnVsbGxpbmVpdGVtc30KKyAgICBcaXRlbVtcYmZjb2RleyMxfVxxdWFkXHZhcnsjMn1dCit9e1xlbmR7ZnVsbGxpbmVpdGVtc319CisKKworXG5ld2NvbW1hbmR7XG5vZGVuYW1lfVsxXXtcbGFiZWx7IzF9fQorCislIEZvciB0aGVzZSBjb21tYW5kcywgdXNlIFxjb21tYW5ke30gdG8gZ2V0IHRoZSB0eXBvZ3JhcGh5IHJpZ2h0LCBub3QgCislIHtcY29tbWFuZH0uICBUaGlzIHdvcmtzIGJldHRlciB3aXRoIHRoZSB0ZXhpbmZvIHRyYW5zbGF0aW9uLgorXG5ld2NvbW1hbmR7XEFCQ317e1xzYyBhYmN9fQorXG5ld2NvbW1hbmR7XFVOSVh9e3tcc2MgVW5peH19CitcbmV3Y29tbWFuZHtcUE9TSVh9e1BPU0lYfQorXG5ld2NvbW1hbmR7XEFTQ0lJfXt7XHNjIGFzY2lpfX0KK1xuZXdjb21tYW5ke1xDcHB9e0NccHJvdGVjdFxyYWlzZWJveHsuMThleH17Kyt9fQorXG5ld2NvbW1hbmR7XEN9e0N9CitcbmV3Y29tbWFuZHtcRU9GfXt7XHNjIGVvZn19CitcbmV3Y29tbWFuZHtcTlVMTH17XGNvbnN0YW50e05VTEx9fQorCislIEFsc28gZm9yIGNvbnNpc3RlbmN5OiBzcGVsbCBQeXRob24gIlB5dGhvbiIsIG5vdCAicHl0aG9uIiEKKworJSBjb2RlIGlzIHRoZSBtb3N0IGRpZmZpY3VsdCBvbmUuLi4KK1xuZXdjb21tYW5ke1xjb2RlfVsxXXtcdGV4dHJte1xAdm9iZXlzcGFjZXNcQG5vbGlnc1xkZWZce3tcY2hhcmBce31cZGVmXH17XGNoYXJgXH19XGRlZlx+e1xjaGFyYFx+fVxkZWZcXntcY2hhcmBcXn1cZGVmXGV7XGNoYXJgXFx9XGRlZlwke1xjaGFyYFwkfVxkZWZcI3tcY2hhcmBcI31cZGVmXCZ7XGNoYXJgXCZ9XGRlZlwle1xjaGFyYFwlfSUKK1x0ZXh0dHR7IzF9fX0KKworXG5ld2NvbW1hbmR7XGJmY29kZX1bMV17XGNvZGV7XGJmc2VyaWVzIzF9fSAlIGJvbGQtZmFjZWQgY29kZSBmb250CitcbmV3Y29tbWFuZHtca2JkfVsxXXtcY29kZXsjMX19CitcbmV3Y29tbWFuZHtcc2FtcH1bMV17YFxjb2RleyMxfSd9CislIFRoaXMgd2VpcmQgZGVmaW5pdGlvbiBvZiBcdmFye30gYWxsb3dzIGl0IHRvIGFsd2F5cyBhcHBlYXIgaW4gcm9tYW4KKyUgaXRhbGljcywgYW5kIHdvbid0IGdldCBmdW5reSBpbiBjb2RlIGZyYWdtZW50cyB3aGVuIHdlIHBsYXkgYXJvdW5kCislIHdpdGggZm9udHMuICBUaGlzIGFsc28gd29ya3MgZGlyZWN0bHkgaW4gbWF0aCBtb2RlLgorXG5ld2NvbW1hbmR7XHZhcn1bMV17JQorICBcaWZtbW9kZSUKKyAgICBcaGJveHtcbm9ybWFsc2l6ZVx0ZXh0cm17XHRleHRpdHsjMVwvfX19JQorICBcZWxzZSUKKyAgICBcbm9ybWFsc2l6ZVx0ZXh0cm17XHRleHRpdHsjMVwvfX0lCisgIFxmaSUKK30KK1xyZW5ld2NvbW1hbmR7XGVtcGh9WzFde3tcZW0gIzF9fQorXG5ld2NvbW1hbmR7XGRmbn1bMV17XGVtcGh7IzF9fQorXG5ld2NvbW1hbmR7XHN0cm9uZ31bMV17e1xiZiAjMX19CislIGxldCdzIGV4cGVyaW1lbnQgd2l0aCBhIG5ldyBmb250OgorXG5ld2NvbW1hbmR7XGZpbGV9WzFde2B7XHNtYWxsXHRleHRzZnsjMX19J30KK1xuZXdjb21tYW5ke1xmaWxlbnF9WzFde3tcc21hbGxcdGV4dHNmeyMxfX19CisKKyUgVXNlIHRoaXMgZGVmL3JlZGVmIGFwcHJvYWNoIGZvciBcdXJse30gc2luY2UgaHlwZXJyZWYgZGVmaW5lZCB0aGlzIGFscmVhZHksCislIGJ1dCBvbmx5IGlmIHdlIGFjdHVhbGx5IHVzZWQgaHlwZXJyZWY6CitcQGlmdW5kZWZpbmVke3BkZmFubm90bGlua317CisgIFxuZXdjb21tYW5ke1xweUB1cmx9WzFde1xtYm94e1xzbWFsbFx0ZXh0c2Z7IzF9fX0KK317CisgIFxuZXdjb21tYW5ke1xweUB1cmx9WzFde3slCisgICAgXHBkZmFubm90bGluayBhdHRyey9Cb3JkZXIgWzAgMCAwXX0gdXNlcnsvUyAvVVJJIC9VUkkgKCMxKX0lCisgICAgXHB5QExpbmtDb2xvciUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciBvZiB0aGUgbGluayB0ZXh0CisgICAgXG1ib3h7XHNtYWxsXHRleHRzZnsjMX19JQorICAgIFxweUBOb3JtYWxDb2xvciUgICAgICAgICAgICAgICAgICAgIFR1cm4gaXQgYmFjayBvZmY7IHRoZXNlIGFyZSBkZWNsYXJhdGl2ZQorICAgIFxwZGZlbmRsaW5rfSUgICAgICAgICAgICAgICAgICAgICAgIGFuZCBkb24ndCBhcHBlYXIgYm91bmQgdG8gdGhlIGN1cnJlbnQKKyAgfSUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0aW5nICJib3giLgorfQorXGxldFx1cmw9XHB5QHVybAorXG5ld2NvbW1hbmR7XGVtYWlsfVsxXXt7XHNtYWxsXHRleHRzZnsjMX19fQorXG5ld2NvbW1hbmR7XG5ld3Nncm91cH1bMV17e1xzbWFsbFx0ZXh0c2Z7IzF9fX0KKworXG5ld2NvbW1hbmR7XHB5QHZhcnZhcnN9WzFde3slCisgIHtcbGV0XHVuc3BlY2lmaWVkPVxweUB1bnNwZWNpZmllZCUKKyAgIFxsZXRcbW9yZWFyZ3M9XHB5QG1vcmVhcmdzJQorICAgXHZhcnsjMX19fX0KKworJSBJJ2QgcmVhbGx5IGxpa2UgdG8gZ2V0IHJpZCBvZiB0aGlzIQorXG5ld2lmXGlmdGV4aVx0ZXhpZmFsc2UKKworJSBUaGlzIGlzIHVzZWQgdG8gZ2V0IGwyaCB0byBwdXQgdGhlIGNvcHlyaWdodCBhbmQgYWJzdHJhY3Qgb24KKyUgYSBzZXBhcmF0ZSBIVE1MIHBhZ2UuCitcbmV3aWZcaWZodG1sXGh0bWxmYWxzZQorCisKKyUgVGhlc2Ugc2hvdWxkIGJlIHVzZWQgZm9yIGFsbCByZWZlcmVuY2VzIHRvIGlkZW50aWZpZXJzIHdoaWNoIGFyZQorJSB1c2VkIHRvIHJlZmVyIHRvIGluc3RhbmNlcyBvZiBzcGVjaWZpYyBsYW5ndWFnZSBjb25zdHJ1Y3RzLiAgU2VlIHRoZQorJSBuYW1lcyBmb3Igc3BlY2lmaWMgc2VtYW50aWMgYXNzaWdubWVudHMuCislCislIEZvciBub3csIGRvbid0IGRvIGFueXRoaW5nIHJlYWxseSBmYW5jeSB3aXRoIHRoZW07IGp1c3QgdXNlIHRoZW0gYXMKKyUgbG9naWNhbCBtYXJrdXAuICBUaGlzIG1pZ2h0IGNoYW5nZSBpbiB0aGUgZnV0dXJlLgorJQorXG5ld2NvbW1hbmR7XG1vZHVsZX1bMV17XHRleHR0dHsjMX19CitcbmV3Y29tbWFuZHtca2V5d29yZH1bMV17XHRleHR0dHsjMX19CitcbmV3Y29tbWFuZHtcZXhjZXB0aW9ufVsxXXtcdGV4dHR0eyMxfX0KK1xuZXdjb21tYW5ke1xjbGFzc31bMV17XHRleHR0dHsjMX19CitcbmV3Y29tbWFuZHtcZnVuY3Rpb259WzFde1x0ZXh0dHR7IzF9fQorXG5ld2NvbW1hbmR7XG1lbWJlcn1bMV17XHRleHR0dHsjMX19CitcbmV3Y29tbWFuZHtcbWV0aG9kfVsxXXtcdGV4dHR0eyMxfX0KKworXG5ld2NvbW1hbmR7XHB5dHlwZX1bMV17IzF9ICAgICAgICAgICAgICUgYnVpbHQtaW4gUHl0aG9uIHR5cGUKKworXG5ld2NvbW1hbmR7XGNmdW5jdGlvbn1bMV17XHRleHR0dHsjMX19CitcbmV3Y29tbWFuZHtcY3R5cGV9WzFde1x0ZXh0dHR7IzF9fSAgICAgJSBDIHN0cnVjdCBvciB0eXBlZGVmIG5hbWUKK1xuZXdjb21tYW5ke1xjZGF0YX1bMV17XHRleHR0dHsjMX19ICAgICAlIEMgdmFyaWFibGUsIHR5cGljYWxseSBnbG9iYWwKKworXG5ld2NvbW1hbmR7XG1pbWV0eXBlfVsxXXt7XHNtYWxsXHRleHRzZnsjMX19fQorJSBUaGUgXCEgaXMgYSAibmVnYXRpdmUgdGhpbiBzcGFjZSIgaW4gbWF0aCBtb2RlLgorXG5ld2NvbW1hbmR7XHJlZ2V4cH1bMV17JQorICB7XHRpbnkkXnteXGxjZWlsfVwhXCEkJQorICAge1xub3JtYWxzaXplXGNvZGV7IzF9fSUKKyAgICRcIVxyZmxvb3JcISQlCisgIH19CitcbmV3Y29tbWFuZHtcZW52dmFyfVsxXXslCisgICMxJQorICBcaW5kZXh7IzFAeyMxfX0lCisgIFxpbmRleHtlbnZpcm9ubWVudCB2YXJpYWJsZXMheyMxfX0lCit9CitcbmV3Y29tbWFuZHtcbWFrZXZhcn1bMV17IzF9ICAgICAgICAgICAgJSB2YXJpYWJsZSBpbiBhIE1ha2VmaWxlCitcbmV3Y29tbWFuZHtcY2hhcmFjdGVyfVsxXXtcc2FtcHsjMX19CisKKyUgY29uc3RhbnRzIGRlZmluZWQgaW4gUHl0aG9uIG1vZHVsZXMgb3IgQyBoZWFkZXJzLCBub3QgbGFuZ3VhZ2UgY29uc3RhbnRzOgorXG5ld2NvbW1hbmR7XGNvbnN0YW50fVsxXXtcY29kZXsjMX19ICAgICUgbWFuaWZlc3QgY29uc3RhbnQsIG5vdCBzeW50YWN0aWMKKworXG5ld2NvbW1hbmR7XG1hbnBhZ2V9WzJde3tcZW1waHsjMX0oIzIpfX0KK1xuZXdjb21tYW5ke1xwZXB9WzFde1BFUCAjMVxpbmRleHtQeXRob24gRW5oYW5jZW1lbnQgUHJvcG9zYWxzIVBFUCAjMX19CitcbmV3Y29tbWFuZHtccmZjfVsxXXtSRkMgIzFcaW5kZXh7UkZDIVJGQyAjMX19CitcbmV3Y29tbWFuZHtccHJvZ3JhbX1bMV17XHN0cm9uZ3sjMX19CitcbmV3Y29tbWFuZHtccHJvZ3JhbW9wdH1bMV17XHN0cm9uZ3sjMX19CislIE5vdGUgdGhhdCBcbG9uZ3Byb2dyYW1vcHQgcHJvdmlkZXMgdGhlICctLSchCitcbmV3Y29tbWFuZHtcbG9uZ3Byb2dyYW1vcHR9WzFde1xzdHJvbmd7LXt9LSMxfX0KKworJSBjaXRlZCB0aXRsZXM6ICBcY2l0ZXRpdGxle1RpdGxlIG9mIFdvcmt9CislICAgICAgIG9ubGluZTogIFxjaXRldGl0bGVbdXJsLXRvLXJlc291cmNlXXtUaXRsZSBvZiBXb3JrfQorXG5ld2NvbW1hbmR7XGNpdGV0aXRsZX1bMl1bVVJMXXtcZW1waHsjMn19CisKKworJSBEZXByZWNhdGlvbiBzdHVmZi4KKyUgU2hvdWxkIGJlIGV4dGVuZGVkIHRvIGFsbG93IGFuIGluZGV4IC8gbGlzdCBvZiBkZXByZWNhdGVkIHN0dWZmLiAgQnV0CislIHRoZXJlJ3MgYSBsb3Qgb2Ygc3R1ZmYgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIG1ha2UgdGhhdCBhdXRvbWF0YWJsZS4KKyUKKyUgRmlyc3QgcGFyYW1ldGVyIGlzIHRoZSByZWxlYXNlIG51bWJlciB0aGF0IGRlcHJlY2F0ZXMgdGhlIGZlYXR1cmUsIHRoZQorJSBzZWNvbmQgaXMgdGhlIGFjdGlvbiB0aGUgc2hvdWxkIGJlIHRha2VuIGJ5IHVzZXJzIG9mIHRoZSBmZWF0dXJlLgorJQorJSBFeGFtcGxlOgorJSAgXGRlcHJlY2F0ZWR7MS41LjF9e1VzZSBcbWV0aG9ke2Zyb2JuaWNhdGUoKX0gaW5zdGVhZC59CislCitcbmV3Y29tbWFuZHtcZGVwcmVjYXRlZH1bMl17JQorICBcc3Ryb25ne0RlcHJlY2F0ZWQgc2luY2UgcmVsZWFzZSAjMS59ICAjMlxwYXJ9CisKKyUgTmV3IHN0dWZmLgorJSBUaGlzIHNob3VsZCBiZSB1c2VkIHRvIG1hcmsgdGhpbmdzIHdoaWNoIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUKKyUgZGV2ZWxvcG1lbnQgdHJlZSBidXQgdGhhdCBhcmVuJ3QgaW4gdGhlIHJlbGVhc2UsIGJ1dCBhcmUgZG9jdW1lbnRlZC4KKyUgVGhpcyBhbGxvd3MgcmVsZWFzZSBvZiBkb2N1bWVudGF0aW9uIHRoYXQgYWxyZWFkeSBpbmNsdWRlcyB1cGRhdGVkCislIGRlc2NyaXB0aW9ucy4gIFBsYWNlIGF0IGVuZCBvZiBkZXNjcmlwdG9yIGVudmlyb25tZW50LgorJQorJSBFeGFtcGxlOgorJSAgXHZlcnNpb25hZGRlZHsxLjUuMn0KKyUgIFx2ZXJzaW9uY2hhbmdlZFtzaG9ydCBleHBsYW5hdGlvbl17Mi4wfQorJQorXG5ld2NvbW1hbmR7XHZlcnNpb25hZGRlZH1bMV17JQorICB7ICBOZXcgaW4gdmVyc2lvbiAjMS4gIH19CitcbmV3Y29tbWFuZHtcdmVyc2lvbmNoYW5nZWR9WzJdW1xweUBiYWRrZXldeyUKKyAgXGlmeCMxXEB1bmRlZmluZWQlCisgICAgeyAgQ2hhbmdlZCBpbiB2ZXJzaW9uICMyLiAgfSUKKyAgXGVsc2UlCisgICAgeyAgQ2hhbmdlZCBpbiB2ZXJzaW9uICMyOlwgIzEuICB9JQorICBcZmklCit9CisKKworJSBUYWJsZXMuCislCitcbmV3ZW52aXJvbm1lbnR7dGFibGVpaX1bNF17JQorICBcYmVnaW57Y2VudGVyfSUKKyAgICBcZGVmXGxpbmVpaSMjMSMjMntcY3NuYW1lIzJcZW5kY3NuYW1leyMjMX0mIyMyXFx9JQorICAgIFxiZWdpbnt0YWJ1bGFyfXsjMX1cc3Ryb25neyMzfSZcc3Ryb25neyM0fSBcXCogXGhsaW5lJQorfXslCisgICAgXGVuZHt0YWJ1bGFyfSUKKyAgXGVuZHtjZW50ZXJ9JQorfQorCitcbmV3ZW52aXJvbm1lbnR7bG9uZ3RhYmxlaWl9WzRdeyUKKyAgXGJlZ2lue2NlbnRlcn0lCisgICAgXGRlZlxsaW5laWkjIzEjIzJ7XGNzbmFtZSMyXGVuZGNzbmFtZXsjIzF9JiMjMlxcfSUKKyAgICBcYmVnaW57bG9uZ3RhYmxlfVtjXXsjMX1cc3Ryb25neyMzfSZcc3Ryb25neyM0fSBcXCogXGhsaW5lXGVuZGhlYWQlCit9eyUKKyAgICBcZW5ke2xvbmd0YWJsZX0lCisgIFxlbmR7Y2VudGVyfSUKK30KKworXG5ld2Vudmlyb25tZW50e3RhYmxlaWlpfVs1XXslCisgIFxiZWdpbntjZW50ZXJ9JQorICAgIFxkZWZcbGluZWlpaSMjMSMjMiMjM3tcY3NuYW1lIzJcZW5kY3NuYW1leyMjMX0mIyMyJiMjM1xcfSUKKyAgICBcYmVnaW57dGFidWxhcn17IzF9XHN0cm9uZ3sjM30mXHN0cm9uZ3sjNH0mXHN0cm9uZ3sjNX0gXFwlCisgICAgICBcaGxpbmUlCit9eyUKKyAgICBcZW5ke3RhYnVsYXJ9JQorICBcZW5ke2NlbnRlcn0lCit9CisKK1xuZXdlbnZpcm9ubWVudHtsb25ndGFibGVpaWl9WzVdeyUKKyAgXGJlZ2lue2NlbnRlcn0lCisgICAgXGRlZlxsaW5laWlpIyMxIyMyIyMze1xjc25hbWUjMlxlbmRjc25hbWV7IyMxfSYjIzImIyMzXFx9JQorICAgIFxiZWdpbntsb25ndGFibGV9W2NdeyMxfVxzdHJvbmd7IzN9JlxzdHJvbmd7IzR9JlxzdHJvbmd7IzV9IFxcJQorICAgICAgXGhsaW5lXGVuZGhlYWQlCit9eyUKKyAgICBcZW5ke2xvbmd0YWJsZX0lCisgIFxlbmR7Y2VudGVyfSUKK30KKworXG5ld2Vudmlyb25tZW50e3RhYmxlaXZ9WzZdeyUKKyAgXGJlZ2lue2NlbnRlcn0lCisgICAgXGRlZlxsaW5laXYjIzEjIzIjIzMjIzR7XGNzbmFtZSMyXGVuZGNzbmFtZXsjIzF9JiMjMiYjIzMmIyM0XFx9JQorICAgIFxiZWdpbnt0YWJ1bGFyfXsjMX1cc3Ryb25neyMzfSZcc3Ryb25neyM0fSZcc3Ryb25neyM1fSZcc3Ryb25neyM2fSBcXCUKKyAgICAgIFxobGluZSUKK317JQorICAgIFxlbmR7dGFidWxhcn0lCisgIFxlbmR7Y2VudGVyfSUKK30KKworXG5ld2Vudmlyb25tZW50e2xvbmd0YWJsZWl2fVs2XXslCisgIFxiZWdpbntjZW50ZXJ9JQorICAgIFxkZWZcbGluZWl2IyMxIyMyIyMzIyM0e1xjc25hbWUjMlxlbmRjc25hbWV7IyMxfSYjIzImIyMzJiMjNFxcfSUKKyAgICBcYmVnaW57bG9uZ3RhYmxlfVtjXXsjMX1cc3Ryb25neyMzfSZcc3Ryb25neyM0fSZcc3Ryb25neyM1fSZcc3Ryb25neyM2fSUKKyAgICAgIFxcJQorICAgICAgXGhsaW5lXGVuZGhlYWQlCit9eyUKKyAgICBcZW5ke2xvbmd0YWJsZX0lCisgIFxlbmR7Y2VudGVyfSUKK30KKworJSBDcm9zcy1yZWZlcmVuY2luZyAoQU1LLCBuZXcgaW1wbC4gRkxEKQorJSBTYW1wbGUgdXNhZ2U6CislICBcYmVnaW57c2VlYWxzb30KKyUgICAgXHNlZW1vZHVsZXtyYW5kfXtVbmlmb3JtIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLn07ICUgTW9kdWxlIHhyZWYKKyUgICAgXHNlZXRleHR7XGVtcGh7RW5jeWNsb3BlZGlhIEJyaXRhbm5pY2F9fS4gICAgICAgICAgICUgUmVmIHRvIGEgYm9vaworJSAKKyUgICAgJSBBIGZ1bmt5IGNhc2U6IG1vZHVsZSBuYW1lIGNvbnRhaW5zICdfJzsgaGF2ZSB0byBzdXBwbHkgYW4gb3B0aW9uYWwga2V5CislICAgIFxzZWVtb2R1bGVbY29weXJlZ117Y29weV9yZWd9e0ludGVyZmFjZSBjb25zdHJ1Y3RvciByZWdpc3RyYXRpb24gZm9yCislICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxtb2R1bGV7cGlja2xlfS59CislICBcZW5ke3NlZWFsc299CislCislIE5vdGUgdGhhdCB0aGUgbGFzdCBwYXJhbWV0ZXIgZm9yIFxzZWVtb2R1bGUgYW5kIFxzZWV0ZXh0IHNob3VsZCBiZSBjb21wbGV0ZQorJSBzZW50ZW5jZXMgYW5kIGJlIHRlcm1pbmF0ZWQgd2l0aCB0aGUgcHJvcGVyIHB1bmN0dWF0aW9uLgorCitcQGlmdW5kZWZpbmVke3BkZmFubm90bGlua317JQorICBcbmV3Y29tbWFuZHtccHlAc2VlbW9kdWxlfVszXVtccHlAbW9kdWxlYmFka2V5XXslCisgICAgXHBhciUKKyAgICBcaWZ4XHB5QG1vZHVsZWJhZGtleSMxXGRlZlxweUBtb2R1bGVrZXl7IzJ9XGVsc2VcZGVmXHB5QG1vZHVsZWtleXsjMX1cZmklCisgICAgXGJlZ2lue2Z1bGxsaW5laXRlbXN9CisgICAgICBcaXRlbVtNb2R1bGUgXG1vZHVsZXsjMn0gKHNlY3Rpb24gXHJlZnttb2R1bGUtXHB5QG1vZHVsZWtleX0pOl0KKyAgICAgICMzCisgICAgXGVuZHtmdWxsbGluZWl0ZW1zfQorICB9Cit9e1xuZXdjb21tYW5ke1xweUBzZWVtb2R1bGV9WzNdW1xweUBtb2R1bGViYWRrZXldeyUKKyAgICBccGFyJQorICAgIFxpZnhccHlAbW9kdWxlYmFka2V5IzFcZGVmXHB5QG1vZHVsZWtleXsjMn1cZWxzZVxkZWZccHlAbW9kdWxla2V5eyMxfVxmaSUKKyAgICBcYmVnaW57ZnVsbGxpbmVpdGVtc30KKyAgICAgIFxpdGVtW1xweUBsaW5rVG9OYW1le2xhYmVsLW1vZHVsZS1ccHlAbW9kdWxla2V5fXtNb2R1bGUgXG1vZHVsZXsjMn19CisgICAgICAgICAgICAoc2VjdGlvbiBccmVme21vZHVsZS1ccHlAbW9kdWxla2V5fSk6XQorICAgICAgIzMKKyAgICBcZW5ke2Z1bGxsaW5laXRlbXN9CisgIH0KK30KKyUgXHNlZXRpdGxlW3VybF17dGl0bGV9e3doeSBpdCdzIGludGVyZXN0aW5nfQorXG5ld2NvbW1hbmR7XHB5QHNlZXRpdGxlfVszXVtccHlAbW9kdWxlYmFka2V5XXslCisgIFxwYXIKKyAgXGJlZ2lue2Z1bGxsaW5laXRlbXN9CisgICAgXGl0ZW1bXGNpdGV0aXRsZXsjMn1dCisgICAgXGlmeFxweUBtb2R1bGViYWRrZXkjMVxlbHNlCisgICAgICBcaXRlbVt7XHNtYWxseyhcdXJseyMxfSl9fV0KKyAgICBcZmkKKyAgICAjMworICBcZW5ke2Z1bGxsaW5laXRlbXN9Cit9CislIFxzZWVwZXB7bnVtYmVyfXt0aXRsZX17d2h5IGl0J3MgaW50ZXJlc3Rpbmd9CitcbmV3Y29tbWFuZHtccHlAc2VlcGVwfVszXXslCisgIFxwYXIlCisgIFxiZWdpbntmdWxsbGluZWl0ZW1zfQorICAgIFxpdGVtW1xwZXB7IzF9LCBgYFxlbXBoeyMyfScnXQorICAgICMzCisgIFxlbmR7ZnVsbGxpbmVpdGVtc30KK30KKyUgXHNlZXJmY3tudW1iZXJ9e3RpdGxlfXt3aHkgaXQncyBpbnRlcmVzdGluZ30KK1xuZXdjb21tYW5ke1xweUBzZWVyZmN9WzNdeyUKKyAgXHBhciUKKyAgXGJlZ2lue2Z1bGxsaW5laXRlbXN9CisgICAgXGl0ZW1bXHJmY3sjMX0sIGBgXGVtcGh7IzJ9JyddCisgICAgIzMKKyAgXGVuZHtmdWxsbGluZWl0ZW1zfQorfQorJSBcc2VldXJse3VybH17d2h5IGl0J3MgaW50ZXJlc3Rpbmd9CitcbmV3Y29tbWFuZHtccHlAc2VldXJsfVsyXXslCisgIFxwYXIlCisgIFxiZWdpbntmdWxsbGluZWl0ZW1zfQorICAgIFxpdGVtW1x1cmx7IzF9XQorICAgICMyCisgIFxlbmR7ZnVsbGxpbmVpdGVtc30KK30KK1xuZXdlbnZpcm9ubWVudHtzZWVhbHNvfVswXXsKKyAgXHBhcgorICBcc3Ryb25ne1NlZSBBbHNvOn1ccGFyCisgIFxkZWZcc2VldGV4dCMjMXtccGFyeyMjMX19CisgIFxsZXRcc2VlbW9kdWxlPVxweUBzZWVtb2R1bGUKKyAgXGxldFxzZWVwZXA9XHB5QHNlZXBlcAorICBcbGV0XHNlZXJmYz1ccHlAc2VlcmZjCisgIFxsZXRcc2VldGl0bGU9XHB5QHNlZXRpdGxlCisgIFxsZXRcc2VldXJsPVxweUBzZWV1cmwKK317XHBhcn0KKworCislIEFsbG93IHRoZSBQeXRob24gcmVsZWFzZSBudW1iZXIgdG8gYmUgc3BlY2lmaWVkIGluZGVwZW5kZW50bHkgb2YgdGhlCislIFxkYXRle30uICBUaGlzIGFsbG93cyB0aGUgZGF0ZSB0byByZWZsZWN0IHRoZSBkb2N1bWVudCdzIGRhdGUgYW5kCislIHJlbGVhc2UgdG8gc3BlY2lmeSB0aGUgUHl0aG9uIHJlbGVhc2UgdGhhdCBpcyBkb2N1bWVudGVkLgorJQorXG5ld2NvbW1hbmR7XHB5QHJlbGVhc2V9e30KK1xuZXdjb21tYW5ke1x2ZXJzaW9ufXt9CitcbmV3Y29tbWFuZHtcc2hvcnR2ZXJzaW9ufXt9CitcbmV3Y29tbWFuZHtccmVsZWFzZW5hbWV9e1JlbGVhc2V9CitcbmV3Y29tbWFuZHtccmVsZWFzZX1bMV17JQorICBccmVuZXdjb21tYW5ke1xweUByZWxlYXNlfXtccmVsZWFzZW5hbWVcc3BhY2VcdmVyc2lvbn0lCisgIFxyZW5ld2NvbW1hbmR7XHZlcnNpb259eyMxfX0KK1xuZXdjb21tYW5ke1xzZXRzaG9ydHZlcnNpb259WzFdeyUKKyAgXHJlbmV3Y29tbWFuZHtcc2hvcnR2ZXJzaW9ufXsjMX19CisKKyUgQWxsb3cgc3BlY2lmaWNhdGlvbiBvZiB0aGUgYXV0aG9yJ3MgYWRkcmVzcyBzZXBhcmF0ZWx5IGZyb20gdGhlCislIGF1dGhvcidzIG5hbWUuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGZvcm1hdCB0aGVtIGRpZmZlcmVudGx5LCB3aGljaAorJSBpcyBhIGdvb2QgdGhpbmcuCislCitcbmV3Y29tbWFuZHtccHlAYXV0aG9yYWRkcmVzc317fQorXG5ld2NvbW1hbmR7XGF1dGhvcmFkZHJlc3N9WzFde1xyZW5ld2NvbW1hbmR7XHB5QGF1dGhvcmFkZHJlc3N9eyMxfX0KK1xsZXRcZGV2ZWxvcGVyc2FkZHJlc3M9XGF1dGhvcmFkZHJlc3MKK1xsZXRcZGV2ZWxvcGVyPVxhdXRob3IKK1xsZXRcZGV2ZWxvcGVycz1cYXV0aG9yCisKKyUgVGhpcyBzZXRzIHVwIHRoZSBmYW5jeSBjaGFwdGVyIGhlYWRpbmdzIHRoYXQgbWFrZSB0aGUgZG9jdW1lbnRzIGxvb2sKKyUgYXQgbGVhc3QgYSBsaXR0bGUgYmV0dGVyIHRoYW4gdGhlIHVzdWFsIExhVGVYIG91dHB1dC4KKyUKK1xAaWZ1bmRlZmluZWR7Q2hUaXRsZVZhcn17fXsKKyAgXENoTmFtZVZhcntccmFnZ2VkbGVmdFxub3JtYWxzaXplXHB5QEhlYWRlckZhbWlseX0KKyAgXENoTnVtVmFye1xyYWdnZWRsZWZ0IFxiZnNlcmllc1xMYXJnZVxweUBIZWFkZXJGYW1pbHl9CisgIFxDaFRpdGxlVmFye1xyYWdnZWRsZWZ0IFxybVxIdWdlXHB5QEhlYWRlckZhbWlseX0KKyAgJSBUaGlzIGNyZWF0ZXMgY2hhcHRlciBoZWFkcyB3aXRob3V0IHRoZSBsZWFkaW5nIFx2c3BhY2Uqe306CisgIFxkZWZcQG1ha2VjaGFwdGVyaGVhZCMxeyUKKyAgICB7XHBhcmluZGVudCBcekAgXHJhZ2dlZHJpZ2h0IFxub3JtYWxmb250CisgICAgICBcaWZudW0gXGNAc2VjbnVtZGVwdGggPlxtQG5lCisgICAgICAgIFxET0NICisgICAgICBcZmkKKyAgICAgIFxpbnRlcmxpbmVwZW5hbHR5XEBNCisgICAgICBcRE9USXsjMX0KKyAgICB9CisgIH0KK30KKworCislIERlZmluaXRpb24gbGlzdHM7IHJlcXVlc3RlZCBieSBBTUsgZm9yIEhPV1RPIGRvY3VtZW50cy4gIFByb2JhYmx5IHVzZWZ1bAorJSBlbHNld2hlcmUgYXMgd2VsbCwgc28ga2VlcCBpbiBpbiB0aGUgZ2VuZXJhbCBzdHlsZSBzdXBwb3J0LgorJQorXG5ld2Vudmlyb25tZW50e2RlZmluaXRpb25zfXslCisgIFxiZWdpbntkZXNjcmlwdGlvbn0lCisgIFxkZWZcdGVybSMjMXtcaXRlbVsjIzFdXG1ib3h7fVxcKlswbW1dfQorfXslCisgIFxlbmR7ZGVzY3JpcHRpb259JQorfQorCislIFRlbGwgVGVYIGFib3V0IHBhdGhvbG9naWNhbCBoeXBoZW5hdGlvbiBjYXNlczoKK1xoeXBoZW5hdGlvbntCYXNlLUhUVFAtUmUtcXVlc3QtSGFuZC1sZXJ9CmRpZmYgLS1naXQgYS9kb2MvdG9vbHMvdGV4aW5wdXRzL3JlcG9ydGluZ2J1Z3MudGV4IGIvZG9jL3Rvb2xzL3RleGlucHV0cy9yZXBvcnRpbmdidWdzLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDY0NzBhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3Rvb2xzL3RleGlucHV0cy9yZXBvcnRpbmdidWdzLnRleApAQCAtMCwwICsxLDY1IEBACitcbGFiZWx7cmVwb3J0aW5nLWJ1Z3N9CisKK1B5dGhvbiBpcyBhIG1hdHVyZSBwcm9ncmFtbWluZyBsYW5ndWFnZSB3aGljaCBoYXMgZXN0YWJsaXNoZWQgYQorcmVwdXRhdGlvbiBmb3Igc3RhYmlsaXR5LiAgSW4gb3JkZXIgdG8gbWFpbnRhaW4gdGhpcyByZXB1dGF0aW9uLCB0aGUKK2RldmVsb3BlcnMgd291bGQgbGlrZSB0byBrbm93IG9mIGFueSBkZWZpY2llbmNpZXMgeW91IGZpbmQgaW4gUHl0aG9uCitvciBpdHMgZG9jdW1lbnRhdGlvbi4KKworQWxsIGJ1ZyByZXBvcnRzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdmlhIHRoZSBQeXRob24gQnVnIFRyYWNrZXIgb24KK1NvdXJjZUZvcmdlIChcdXJse2h0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvYnVncy8/Z3JvdXBfaWQ9NTQ3MH0pLiAgVGhlCitidWcgdHJhY2tlciBvZmZlcnMgYSBXZWIgZm9ybSB3aGljaCBhbGxvd3MgcGVydGluZW50IGluZm9ybWF0aW9uIHRvIGJlCitlbnRlcmVkIGFuZCBzdWJtaXR0ZWQgdG8gdGhlIGRldmVsb3BlcnMuCisKK0JlZm9yZSBzdWJtaXR0aW5nIGEgcmVwb3J0LCBwbGVhc2UgbG9nIGludG8gU291cmNlRm9yZ2UgaWYgeW91IGFyZSBhCittZW1iZXI7IHRoaXMgd2lsbCBtYWtlIGl0IHBvc3NpYmxlIGZvciB0aGUgZGV2ZWxvcGVycyB0byBjb250YWN0IHlvdQorZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaWYgbmVlZGVkLiAgSWYgeW91IGFyZSBub3QgYSBTb3VyY2VGb3JnZQorbWVtYmVyIGJ1dCB3b3VsZCBub3QgbWluZCB0aGUgZGV2ZWxvcGVycyBjb250YWN0aW5nIHlvdSwgeW91IG1heQoraW5jbHVkZSB5b3VyIGVtYWlsIGFkZHJlc3MgaW4geW91ciBidWcgZGVzY3JpcHRpb24uICBJbiB0aGlzIGNhc2UsCitwbGVhc2UgcmVhbGl6ZSB0aGF0IHRoZSBpbmZvcm1hdGlvbiBpcyBwdWJsaWNhbGx5IGF2YWlsYWJsZSBhbmQgY2Fubm90CitiZSBwcm90ZWN0ZWQuCisKK1RoZSBmaXJzdCBzdGVwIGluIGZpbGluZyBhIHJlcG9ydCBpcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgcHJvYmxlbQoraGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZC4gIFRoZSBhZHZhbnRhZ2UgaW4gZG9pbmcgc28sIGFzaWRlIGZyb20KK3NhdmluZyB0aGUgZGV2ZWxvcGVycyB0aW1lLCBpcyB0aGF0IHlvdSBsZWFybiB3aGF0IGhhcyBiZWVuIGRvbmUgdG8KK2ZpeCBpdDsgaXQgbWF5IGJlIHRoYXQgdGhlIHByb2JsZW0gaGFzIGFscmVhZHkgYmVlbiBmaXhlZCBmb3IgdGhlIG5leHQKK3JlbGVhc2UsIG9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaXMgbmVlZGVkIChpbiB3aGljaCBjYXNlIHlvdSBhcmUKK3dlbGNvbWUgdG8gcHJvdmlkZSBpdCBpZiB5b3UgY2FuISkuICBUbyBkbyB0aGlzLCBzZWFyY2ggdGhlIGJ1ZworZGF0YWJhc2UgdXNpbmcgdGhlIHNlYXJjaCBib3ggbmVhciB0aGUgYm90dG9tIG9mIHRoZSBwYWdlLgorCitJZiB0aGUgcHJvYmxlbSB5b3UncmUgcmVwb3J0aW5nIGlzIG5vdCBhbHJlYWR5IGluIHRoZSBidWcgdHJhY2tlciwgZ28KK2JhY2sgdG8gdGhlIFB5dGhvbiBCdWcgVHJhY2tlcgorKFx1cmx7aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9idWdzLz9ncm91cF9pZD01NDcwfSkuICBTZWxlY3QgdGhlCitgYFN1Ym1pdCBhIEJ1ZycnIGxpbmsgYXQgdGhlIHRvcCBvZiB0aGUgcGFnZSB0byBvcGVuIHRoZSBidWcgcmVwb3J0aW5nCitmb3JtLgorCitUaGUgc3VibWlzc2lvbiBmb3JtIGhhcyBhIG51bWJlciBvZiBmaWVsZHMuICBUaGUgb25seSBmaWVsZHMgdGhhdCBhcmUKK3JlcXVpcmVkIGFyZSB0aGUgYGBTdW1tYXJ5JycgYW5kIGBgRGV0YWlscycnIGZpZWxkcy4gIEZvciB0aGUgc3VtbWFyeSwKK2VudGVyIGEgXGVtcGh7dmVyeX0gc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW07IGxlc3MgdGhhbiB0ZW4KK3dvcmRzIGlzIGdvb2QuICBJbiB0aGUgRGV0YWlscyBmaWVsZCwgZGVzY3JpYmUgdGhlIHByb2JsZW0gaW4gZGV0YWlsLAoraW5jbHVkaW5nIHdoYXQgeW91IGV4cGVjdGVkIHRvIGhhcHBlbiBhbmQgd2hhdCBkaWQgaGFwcGVuLiAgQmUgc3VyZSB0bworaW5jbHVkZSB0aGUgdmVyc2lvbiBvZiBQeXRob24geW91IHVzZWQsIHdoZXRoZXIgYW55IGV4dGVuc2lvbiBtb2R1bGVzCit3ZXJlIGludm9sdmVkLCBhbmQgd2hhdCBoYXJkd2FyZSBhbmQgc29mdHdhcmUgcGxhdGZvcm0geW91IHdlcmUgdXNpbmcKKyhpbmNsdWRpbmcgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcyBhcHByb3ByaWF0ZSkuCisKK1RoZSBvbmx5IG90aGVyIGZpZWxkIHRoYXQgeW91IG1heSB3YW50IHRvIHNldCBpcyB0aGUgYGBDYXRlZ29yeScnCitmaWVsZCwgd2hpY2ggYWxsb3dzIHlvdSB0byBwbGFjZSB0aGUgYnVnIHJlcG9ydCBpbnRvIGEgYnJvYWQgY2F0ZWdvcnkKKyhzdWNoIGFzIGBgRG9jdW1lbnRhdGlvbicnIG9yIGBgTGlicmFyeScnKS4KKworRWFjaCBidWcgcmVwb3J0IHdpbGwgYmUgYXNzaWduZWQgdG8gYSBkZXZlbG9wZXIgd2hvIHdpbGwgZGV0ZXJtaW5lCit3aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gY29ycmVjdCB0aGUgcHJvYmxlbS4gIElmIHlvdSBoYXZlIGEKK1NvdXJjZUZvcmdlIGFjY291bnQgYW5kIGxvZ2dlZCBpbiB0byByZXBvcnQgdGhlIHByb2JsZW0sIHlvdSB3aWxsCityZWNlaXZlIGFuIHVwZGF0ZSBlYWNoIHRpbWUgYWN0aW9uIGlzIHRha2VuIG9uIHRoZSBidWcuCisKKworXGJlZ2lue3NlZWFsc299CisgIFxzZWV0aXRsZVtodHRwOi8vd3d3LW1pY2UuY3MudWNsLmFjLnVrL211bHRpbWVkaWEvc29mdHdhcmUvZG9jdW1lbnRhdGlvbi9SZXBvcnRpbmdCdWdzLmh0bWxde0hvdworICAgICAgICB0byBSZXBvcnQgQnVncyBFZmZlY3RpdmVseX17QXJ0aWNsZSB3aGljaCBnb2VzIGludG8gc29tZQorICAgICAgICBkZXRhaWwgYWJvdXQgaG93IHRvIGNyZWF0ZSBhIHVzZWZ1bCBidWcgcmVwb3J0LiAgVGhpcworICAgICAgICBkZXNjcmliZXMgd2hhdCBraW5kIG9mIGluZm9ybWF0aW9uIGlzIHVzZWZ1bCBhbmQgd2h5IGl0IGlzCisgICAgICAgIHVzZWZ1bC59CisKKyAgXHNlZXRpdGxlW2h0dHA6Ly93d3cubW96aWxsYS5vcmcvcXVhbGl0eS9idWctd3JpdGluZy1ndWlkZWxpbmVzLmh0bWxde0J1ZworICAgICAgICBXcml0aW5nIEd1aWRlbGluZXN9e0luZm9ybWF0aW9uIGFib3V0IHdyaXRpbmcgYSBnb29kIGJ1ZworICAgICAgICByZXBvcnQuICBTb21lIG9mIHRoaXMgaXMgc3BlY2lmaWMgdG8gdGhlIE1vemlsbGEgcHJvamVjdCwgYnV0CisgICAgICAgIGRlc2NyaWJlcyBnZW5lcmFsIGdvb2QgcHJhY3RpY2VzLn0KK1xlbmR7c2VlYWxzb30KZGlmZiAtLWdpdCBhL2RvYy90b29scy90b2MyYmttLnB5IGIvZG9jL3Rvb2xzL3RvYzJia20ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDVjN2VmOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy90b2MyYmttLnB5CkBAIC0wLDAgKzEsMTQzIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIkNvbnZlcnQgYSBMYVRlWCAudG9jIGZpbGUgdG8gc29tZSBQREZUZVggbWFnaWMgdG8gY3JlYXRlIHRoYXQgbmVhdCBvdXRsaW5lLgorCitUaGUgb3V0cHV0IGZpbGUgaGFzIGFuIGV4dGVuc2lvbiBvZiAnLmJrbScgaW5zdGVhZCBvZiAnLm91dCcsIHNpbmNlIGh5cGVycmVmCithbHJlYWR5IHVzZXMgdGhhdCBleHRlbnNpb24uCisiIiIKKworaW1wb3J0IGdldG9wdAoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCBzeXMKKworCisjIEVuY2ggaXRlbSBpbiBhbiBlbnRyeSBpcyBhIHR1cGxlIG9mOgorIworIyAgIFNlY3Rpb24gIywgIFRpdGxlIFN0cmluZywgIFBhZ2UgIywgIExpc3Qgb2YgU3ViLWVudHJpZXMKKyMKKyMgVGhlIHJldHVybiB2YWx1ZSBvZiBwYXJzZV90b2MoKSBpcyBzdWNoIGEgdHVwbGUuCisKK2NsaW5lX3JlID0gciIiIl4KK1xcY29udGVudHNsaW5lXCBceyhbYS16XSopfSAgICAgICAgICAgICAjIHR5cGUgb2Ygc2VjdGlvbiBpbiAkMQorXHsoPzpcXG51bWJlcmxpbmVcIFx7KFswLTkuQS1aXSspfSk/ICAgICAjIHNlY3Rpb24gbnVtYmVyCisoLiopfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aXRsZSBzdHJpbmcKK1x7KFxkKyl9JCIiIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBhZ2UgbnVtYmVyCisKK2NsaW5lX3J4ID0gcmUuY29tcGlsZShjbGluZV9yZSwgcmUuVkVSQk9TRSkKKworT1VURVJfVE9fSU5ORVIgPSAtMQorCitfdHJhbnNpdGlvbl9tYXAgPSB7CisgICAgKCdjaGFwdGVyJywgJ3NlY3Rpb24nKTogT1VURVJfVE9fSU5ORVIsCisgICAgKCdzZWN0aW9uJywgJ3N1YnNlY3Rpb24nKTogT1VURVJfVE9fSU5ORVIsCisgICAgKCdzdWJzZWN0aW9uJywgJ3N1YnN1YnNlY3Rpb24nKTogT1VURVJfVE9fSU5ORVIsCisgICAgKCdzdWJzdWJzZWN0aW9uJywgJ3N1YnNlY3Rpb24nKTogMSwKKyAgICAoJ3N1YnNlY3Rpb24nLCAnc2VjdGlvbicpOiAxLAorICAgICgnc2VjdGlvbicsICdjaGFwdGVyJyk6IDEsCisgICAgKCdzdWJzZWN0aW9uJywgJ2NoYXB0ZXInKTogMiwKKyAgICAoJ3N1YnN1YnNlY3Rpb24nLCAnc2VjdGlvbicpOiAyLAorICAgICgnc3Vic3Vic2VjdGlvbicsICdjaGFwdGVyJyk6IDMsCisgICAgfQorCitJTkNMVURFRF9MRVZFTFMgPSAoImNoYXB0ZXIiLCAic2VjdGlvbiIsICJzdWJzZWN0aW9uIiwgInN1YnN1YnNlY3Rpb24iKQorCisKK2RlZiBwYXJzZV90b2MoZnAsIGJpZ3BhcnQ9Tm9uZSk6CisgICAgdG9jID0gdG9wID0gW10KKyAgICBzdGFjayA9IFt0b2NdCisgICAgbGV2ZWwgPSBiaWdwYXJ0IG9yICdjaGFwdGVyJworICAgIGxpbmVubyA9IDAKKyAgICB3aGlsZSAxOgorICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGxpbmVubyA9IGxpbmVubyArIDEKKyAgICAgICAgbSA9IGNsaW5lX3J4Lm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG06CisgICAgICAgICAgICBzdHlwZSwgc251bSwgdGl0bGUsIHBhZ2VubyA9IG0uZ3JvdXAoMSwgMiwgMywgNCkKKyAgICAgICAgICAgIHRpdGxlID0gY2xlYW5fdGl0bGUodGl0bGUpCisgICAgICAgICAgICBlbnRyeSA9IChzdHlwZSwgc251bSwgdGl0bGUsIHN0cmluZy5hdG9pKHBhZ2VubyksIFtdKQorICAgICAgICAgICAgaWYgc3R5cGUgPT0gbGV2ZWw6CisgICAgICAgICAgICAgICAgdG9jLmFwcGVuZChlbnRyeSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgc3R5cGUgbm90IGluIElOQ0xVREVEX0xFVkVMUzoKKyAgICAgICAgICAgICAgICAgICAgIyB3ZSBkb24ndCB3YW50IHBhcmFncmFwaHMgJiBzdWJwYXJhZ3JhcGhzCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gX3RyYW5zaXRpb25fbWFwWyhsZXZlbCwgc3R5cGUpXQorICAgICAgICAgICAgICAgIGlmIGRpcmVjdGlvbiA9PSBPVVRFUl9UT19JTk5FUjoKKyAgICAgICAgICAgICAgICAgICAgdG9jID0gdG9jWy0xXVstMV0KKyAgICAgICAgICAgICAgICAgICAgc3RhY2suaW5zZXJ0KDAsIHRvYykKKyAgICAgICAgICAgICAgICAgICAgdG9jLmFwcGVuZChlbnRyeSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShkaXJlY3Rpb24pOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHN0YWNrWzBdCisgICAgICAgICAgICAgICAgICAgICAgICB0b2MgPSBzdGFja1swXQorICAgICAgICAgICAgICAgICAgICB0b2MuYXBwZW5kKGVudHJ5KQorICAgICAgICAgICAgICAgIGxldmVsID0gc3R5cGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoImwuJXM6ICIgKyBsaW5lKQorICAgIHJldHVybiB0b3AKKworCitoYWNrc2NvcmVfcnggPSByZS5jb21waWxlKHIiXFxoYWNrc2NvcmVccyp7W159XSp9IikKK3JhaXNlYm94X3J4ID0gcmUuY29tcGlsZShyIlxccmFpc2Vib3hccyp7W159XSp9IikKK3RpdGxlX3J4ID0gcmUuY29tcGlsZShyIlxcKFthLXpBLVpdKStccysiKQordGl0bGVfdHJhbnMgPSBzdHJpbmcubWFrZXRyYW5zKCIiLCAiIikKKworZGVmIGNsZWFuX3RpdGxlKHRpdGxlKToKKyAgICB0aXRsZSA9IHJhaXNlYm94X3J4LnN1YigiIiwgdGl0bGUpCisgICAgdGl0bGUgPSBoYWNrc2NvcmVfcnguc3ViKHIiXFxfIiwgdGl0bGUpCisgICAgcG9zID0gMAorICAgIHdoaWxlIDE6CisgICAgICAgIG0gPSB0aXRsZV9yeC5zZWFyY2godGl0bGUsIHBvcykKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIHN0YXJ0ID0gbS5zdGFydCgpCisgICAgICAgICAgICBpZiB0aXRsZVtzdGFydDpzdGFydCsxNV0gIT0gIlxcdGV4dHVuZGVyc2NvcmUiOgorICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGVbOnN0YXJ0XSArIHRpdGxlW20uZW5kKCk6XQorICAgICAgICAgICAgcG9zID0gc3RhcnQgKyAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBicmVhaworICAgIHRpdGxlID0gc3RyaW5nLnRyYW5zbGF0ZSh0aXRsZSwgdGl0bGVfdHJhbnMsICJ7fSIpCisgICAgcmV0dXJuIHRpdGxlCisKKworZGVmIHdyaXRlX3RvYyh0b2MsIGZwKToKKyAgICBmb3IgZW50cnkgaW4gdG9jOgorICAgICAgICB3cml0ZV90b2NfZW50cnkoZW50cnksIGZwLCAwKQorCitkZWYgd3JpdGVfdG9jX2VudHJ5KGVudHJ5LCBmcCwgbGF5ZXIpOgorICAgIHN0eXBlLCBzbnVtLCB0aXRsZSwgcGFnZW5vLCB0b2MgPSBlbnRyeQorICAgIHMgPSAiXFxwZGZvdXRsaW5lIGdvdG8gbmFtZXtwYWdlJTAzZH0iICUgcGFnZW5vCisgICAgaWYgdG9jOgorICAgICAgICBzID0gIiVzIGNvdW50IC0lZCIgJSAocywgbGVuKHRvYykpCisgICAgaWYgc251bToKKyAgICAgICAgdGl0bGUgPSAiJXMgJXMiICUgKHNudW0sIHRpdGxlKQorICAgIHMgPSAiJXMgeyVzfVxuIiAlIChzLCB0aXRsZSkKKyAgICBmcC53cml0ZShzKQorICAgIGZvciBlbnRyeSBpbiB0b2M6CisgICAgICAgIHdyaXRlX3RvY19lbnRyeShlbnRyeSwgZnAsIGxheWVyICsgMSkKKworCitkZWYgcHJvY2VzcyhpZm4sIG9mbiwgYmlncGFydD1Ob25lKToKKyAgICB0b2MgPSBwYXJzZV90b2Mob3BlbihpZm4pLCBiaWdwYXJ0KQorICAgIHdyaXRlX3RvYyh0b2MsIG9wZW4ob2ZuLCAidyIpKQorCisKK2RlZiBtYWluKCk6CisgICAgYmlncGFydCA9IE5vbmUKKyAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICJjOiIpCisgICAgaWYgb3B0czoKKyAgICAgICAgYmlncGFydCA9IG9wdHNbMF1bMV0KKyAgICBpZiBub3QgYXJnczoKKyAgICAgICAgdXNhZ2UoKQorICAgICAgICBzeXMuZXhpdCgyKQorICAgIGZvciBmaWxlbmFtZSBpbiBhcmdzOgorICAgICAgICBiYXNlLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQorICAgICAgICBleHQgPSBleHQgb3IgIi50b2MiCisgICAgICAgIHByb2Nlc3MoYmFzZSArIGV4dCwgYmFzZSArICIuYmttIiwgYmlncGFydCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL3VwZGF0ZS1kb2NzLnNoIGIvZG9jL3Rvb2xzL3VwZGF0ZS1kb2NzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc5NjUyYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdG9vbHMvdXBkYXRlLWRvY3Muc2gKQEAgLTAsMCArMSwyMSBAQAorIyEgL2Jpbi9zaAorCisjIFNjcmlwdCB3aGljaCBpbnN0YWxscyBhIGRldmVsb3BtZW50IHNuYXBzaG90IG9mIHRoZSBkb2N1bWVudGF0aW9uCisjIGludG8gdGhlICJQeXRob24gQCBTb3VyY2VGb3JnZSIgd2Vic2l0ZS4KKyMKKyMgVGhlIHB1c2gtZG9jcy5zaCBzY3JpcHQgcHVzaGVzIHRoaXMgdG8gdGhlIFNvdXJjZUZvcmdlIHdoZW4gbmVlZGVkCisjIGFuZCByZW1vdmVzIGl0IHdoZW4gZG9uZS4KKworaWYgWyAteiAiJEhPTUUiIF0gOyB0aGVuCisgICAgSE9NRT1gZ3JlcCBmZHJha2UgL2V0Yy9wYXNzd2QgfCBzZWQgJ3N8Xi4qOlwoW146XSpcKTpbXjpdKiR8XDF8J2AKKyAgICBleHBvcnQgSE9NRQorZmkKKworVVBEQVRFUz0iJEhPTUUvdG1wLyQxIgorCitjZCAvaG9tZS9ncm91cHMvcHl0aG9uL2h0ZG9jcyB8fCBleGl0ICQ/CitybSAtcmYgZGV2ZWwtZG9jcyB8fCBleGl0ICQ/Citta2RpciBkZXZlbC1kb2NzIHx8IGV4aXQgJD8KK2NkIGRldmVsLWRvY3MgfHwgZXhpdCAkPworKGJ6aXAyIC1kYyAiJFVQREFURVMiIHwgdGFyIHhmIC0pIHx8IGV4aXQgJD8KK3JtICIkVVBEQVRFUyIgfHwgZXhpdCAkPwpkaWZmIC0tZ2l0IGEvZG9jL3Rvb2xzL3doaWNobGlicyBiL2RvYy90b29scy93aGljaGxpYnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTBkNDRlZQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy90b29scy93aGljaGxpYnMKQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK3NlZCAtbiAncyVeXFxpbnB1dHtcKGxpYlthLXpBLVowLTlfXSpcKX0uKiUuLi9saWIvXDEudGV4JXAnIC4uL2xpYi9saWIudGV4CmRpZmYgLS1naXQgYS9leGFtcGxlcy9SRUFETUUgYi9leGFtcGxlcy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmOTVlNQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL1JFQURNRQpAQCAtMCwwICsxLDQ4IEBACitJJ3ZlIGZpbmFsbHkgZ290dGVuIGFyb3VuZCB0byB3cml0aW5nIHNvbWUgZXhhbXBsZXMgOi0pCisKK1RoZXkgYXJlbid0IG1hbnksIGJ1dCBhdCBsZWFzdCBpdCdzIHNvbWV0aGluZy4gSWYgeW91IHdyaXRlIGFueSwgZmVlbCBmcmVlIHRvCitzZW5kIHRoZW0gdG8gbWUgYW5kIEkgd2lsbCBhZGQgdGhlbW4uCisKKworY2VydGdlbi5weSAtIENlcnRpZmljYXRlIGdlbmVyYXRpb24gbW9kdWxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRXhhbXBsZSBtb2R1bGUgd2l0aCB0aHJlZSBmdW5jdGlvbnM6CisgIGNyZWF0ZUtleVBhaXIgICAgIC0gQ3JlYXRlIGEgcHVibGljL3ByaXZhdGUga2V5IHBhaXIKKyAgY3JlYXRlQ2VydFJlcXVlc3QgLSBDcmVhdGUgYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0CisgIGNyZWF0ZUNlcnRpZmljYXRlIC0gQ3JlYXRlIGEgY2VydGlmaWNhdGUgZ2l2ZW4gYSBjZXJ0IHJlcXVlc3QKK0luIGZhY3QsIEkgY3JlYXRlZCB0aGUgY2VydGlmaWNhdGVzIGFuZCBrZXlzIGluIHRoZSAnc2ltcGxlJyBkaXJlY3Rvcnkgd2l0aAordGhlIHNjcmlwdCBta19zaW1wbGVfY2VydHMucHkKKworCitzaW1wbGUgLSBTaW1wbGUgY2xpZW50L3NlcnZlciBleGFtcGxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1N0YXJ0IHRoZSBzZXJ2ZXIgd2l0aAorICAgIHB5dGhvbiBzZXJ2ZXIucHkgUE9SVAorYW5kIHN0YXJ0IGNsaWVudHMgd2l0aAorICAgIHB5dGhvbiBjbGllbnQucHkgSE9TVCBQT1JUCisKK1RoZSBzZXJ2ZXIgaXMgYSBzaW1wbGUgZWNobyBzZXJ2ZXIsIGFueXRoaW5nIGEgY2xpZW50IHNlbmRzLCBpdCBzZW5kcyBiYWNrLgorCisKK3Byb3h5LnB5IC0gRXhhbXBsZSBvZiBhbiBTU0wtZW5hYmxlZCBwcm94eQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBwcm94eSBleGFtcGxlIGRlbW9uc3RyYXRlIGhvdyB0byB1c2Ugc2V0X2Nvbm5lY3Rfc3RhdGUgdG8gc3RhcnQKK3RhbGtpbmcgU1NMIG92ZXIgYW4gYWxyZWFkeSBjb25uZWN0ZWQgc29ja2V0LgorCitVc2FnZTogcHl0aG9uIHByb3h5LnB5IHNlcnZlcls6cG9ydF0gcHJveHlbOnBvcnRdCisKK0NvbnRyaWJ1dGVkIGJ5IE1paGFpIEliYW5lc2N1CisKKworU2VjdXJlWE1MUlBDU2VydmVyLnB5IC0gU1NMLWVuYWJsZWQgdmVyc2lvbiBvZiBTaW1wbGVYTUxSUENTZXJ2ZXIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgYWN0cyBleGFjdGx5IGxpa2UgU2ltcGxlWE1MUlBDU2VydmVyIGZyb20gdGhlIHN0YW5kYXJkIHB5dGhvbiBsaWJyYXJ5LAorYnV0IHVzZXMgc2VjdXJlIGNvbm5lY3Rpb25zLiBUaGUgdGVjaG5pcXVlIGFuZCBjbGFzc2VzIHNob3VsZCB3b3JrIGZvciBhbnkKK1NvY2tldFNlcnZlciBzdHlsZSBzZXJ2ZXIuIEhvd2V2ZXIsIHRoZSBjb2RlIGhhcyBub3QgYmVlbiBleHRlbnNpdmVseSB0ZXN0ZWQuCisKK0NvbnRyaWJ1dGVkIGJ5IE1pY2hhbCBXYWxsYWNlCisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL1NlY3VyZVhNTFJQQ1NlcnZlci5weSBiL2V4YW1wbGVzL1NlY3VyZVhNTFJQQ1NlcnZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTdiNDljCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvU2VjdXJlWE1MUlBDU2VydmVyLnB5CkBAIC0wLDAgKzEsMTAyIEBACisiIiIKK1NlY3VyZVhNTFJQQ1NlcnZlciBtb2R1bGUgdXNpbmcgcHlPcGVuU1NMIDAuNQorV3JpdHRlbiAwOTA3LjIwMDIKK2J5IE1pY2hhbCBXYWxsYWNlCitodHRwOi8vd3d3LnNhYnJlbi5uZXQvCisKK1RoaXMgYWN0cyBleGFjdGx5IGxpa2UgU2ltcGxlWE1MUlBDU2VydmVyCitmcm9tIHRoZSBzdGFuZGFyZCBweXRob24gbGlicmFyeSwgYnV0Cit1c2VzIHNlY3VyZSBjb25uZWN0aW9ucy4gVGhlIHRlY2huaXF1ZQorYW5kIGNsYXNzZXMgc2hvdWxkIHdvcmsgZm9yIGFueSBTb2NrZXRTZXJ2ZXIKK3N0eWxlIHNlcnZlci4gSG93ZXZlciwgdGhlIGNvZGUgaGFzIG5vdAorYmVlbiBleHRlbnNpdmVseSB0ZXN0ZWQuCisKK1RoaXMgY29kZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4KK0l0IGlzIHByb3ZpZGVkIEFTLUlTIFdJVEggTk8gV0FSUkFOVFkgV0hBVFNPRVZFUi4KKyIiIgoraW1wb3J0IFNvY2tldFNlcnZlcgoraW1wb3J0IG9zLCBzb2NrZXQKK2ltcG9ydCBTaW1wbGVYTUxSUENTZXJ2ZXIKK2Zyb20gT3BlblNTTCBpbXBvcnQgU1NMCisKK2NsYXNzIFNTTFdyYXBwZXI6CisgICAgIiIiCisgICAgVGhpcyB3aG9sZSBjbGFzcyBleGlzdHMganVzdCB0byBmaWx0ZXIgb3V0IGEgcGFyYW1ldGVyCisgICAgcGFzc2VkIGluIHRvIHRoZSBzaHV0ZG93bigpIG1ldGhvZCBpbiBTaW1wbGVYTUxSUEMuZG9QT1NUKCkKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29ubik6CisgICAgICAgICIiIgorICAgICAgICBDb25uZWN0aW9uIGlzIG5vdCB5ZXQgYSBuZXctc3R5bGUgY2xhc3MsCisgICAgICAgIHNvIEknbSBtYWtpbmcgYSBwcm94eSBpbnN0ZWFkIG9mIHN1YmNsYXNzaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fX2RpY3RfX1siY29ubiJdID0gY29ubgorICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLG5hbWUpOgorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9fZGljdF9fWyJjb25uIl0sIG5hbWUpCisgICAgZGVmIF9fc2V0YXR0cl9fKHNlbGYsbmFtZSwgdmFsdWUpOgorICAgICAgICBzZXRhdHRyKHNlbGYuX19kaWN0X19bImNvbm4iXSwgbmFtZSwgdmFsdWUpCisgICAgZGVmIHNodXRkb3duKHNlbGYsIGhvdz0xKToKKyAgICAgICAgIiIiCisgICAgICAgIFNpbXBsZVhNTFJwY1NlcnZlci5kb1BPU1QgY2FsbHMgc2h1dGRvd24oMSksCisgICAgICAgIGFuZCBDb25uZWN0aW9uLnNodXRkb3duKCkgZG9lc24ndCB0YWtlCisgICAgICAgIGFuIGFyZ3VtZW50LiBTbyB3ZSBqdXN0IGRpc2NhcmQgdGhlIGFyZ3VtZW50LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fX2RpY3RfX1siY29ubiJdLnNodXRkb3duKCkKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGhpcyBpcyB0aGUgb3RoZXIgcGFydCBvZiB0aGUgc2h1dGRvd24oKSB3b3JrYXJvdW5kLgorICAgICAgICBTaW5jZSBzZXJ2ZXJzIGNyZWF0ZSBuZXcgc29ja2V0cywgd2UgaGF2ZSB0byBpbmZlY3QKKyAgICAgICAgdGhlbSB3aXRoIG91ciBtYWdpYy4gOikKKyAgICAgICAgIiIiCisgICAgICAgIGMsIGEgPSBzZWxmLl9fZGljdF9fWyJjb25uIl0uYWNjZXB0KCkKKyAgICAgICAgcmV0dXJuIChTU0xXcmFwcGVyKGMpLCBhKQorCisKKworY2xhc3MgU2VjdXJlVENQU2VydmVyKFNvY2tldFNlcnZlci5UQ1BTZXJ2ZXIpOgorICAgICIiIgorICAgIEp1c3QgbGlrZSBUQ1BTZXJ2ZXIsIGJ1dCB1c2UgYSBzb2NrZXQuCisgICAgVGhpcyByZWFsbHkgb3VnaHQgdG8gbGV0IHlvdSBzcGVjaWZ5IHRoZSBrZXkgYW5kIGNlcnRpZmljYXRlIGZpbGVzLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXJfYWRkcmVzcywgUmVxdWVzdEhhbmRsZXJDbGFzcyk6CisgICAgICAgIFNvY2tldFNlcnZlci5CYXNlU2VydmVyLl9faW5pdF9fKHNlbGYsIHNlcnZlcl9hZGRyZXNzLCBSZXF1ZXN0SGFuZGxlckNsYXNzKQorCisgICAgICAgICMjIFNhbWUgYXMgbm9ybWFsLCBidXQgbWFrZSBpdCBzZWN1cmU6CisgICAgICAgIGN0eCA9IFNTTC5Db250ZXh0KFNTTC5TU0x2MjNfTUVUSE9EKQorICAgICAgICBjdHguc2V0X29wdGlvbnMoU1NMLk9QX05PX1NTTHYyKQorCisgICAgICAgIGRpciA9IG9zLmN1cmRpcgorICAgICAgICBjdHgudXNlX3ByaXZhdGVrZXlfZmlsZSAob3MucGF0aC5qb2luKGRpciwgJ3NlcnZlci5wa2V5JykpCisgICAgICAgIGN0eC51c2VfY2VydGlmaWNhdGVfZmlsZShvcy5wYXRoLmpvaW4oZGlyLCAnc2VydmVyLmNlcnQnKSkKKworICAgICAgICBzZWxmLnNvY2tldCA9IFNTTFdyYXBwZXIoU1NMLkNvbm5lY3Rpb24oY3R4LCBzb2NrZXQuc29ja2V0KHNlbGYuYWRkcmVzc19mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNvY2tldF90eXBlKSkpCisgICAgICAgIHNlbGYuc2VydmVyX2JpbmQoKQorICAgICAgICBzZWxmLnNlcnZlcl9hY3RpdmF0ZSgpCisKKworY2xhc3MgU2VjdXJlWE1MUlBDUmVxdWVzdEhhbmRsZXIoU2ltcGxlWE1MUlBDU2VydmVyLlNpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyKToKKyAgICBkZWYgc2V0dXAoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBXZSBuZWVkIHRvIHVzZSBzb2NrZXQuX2ZpbGVvYmplY3QgQmVjYXVzZSBTU0wuQ29ubmVjdGlvbgorICAgICAgICBkb2Vzbid0IGhhdmUgYSAnZHVwJy4gTm90IGV4YWN0bHkgc3VyZSBXSFkgdGhpcyBpcywgYnV0CisgICAgICAgIHRoaXMgaXMgYmFja2VkIHVwIGJ5IGNvbW1lbnRzIGluIHNvY2tldC5weSBhbmQgU1NML2Nvbm5lY3Rpb24uYworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uID0gc2VsZi5yZXF1ZXN0ICMgZm9yIGRvUE9TVAorICAgICAgICBzZWxmLnJmaWxlID0gc29ja2V0Ll9maWxlb2JqZWN0KHNlbGYucmVxdWVzdCwgInJiIiwgc2VsZi5yYnVmc2l6ZSkKKyAgICAgICAgc2VsZi53ZmlsZSA9IHNvY2tldC5fZmlsZW9iamVjdChzZWxmLnJlcXVlc3QsICJ3YiIsIHNlbGYud2J1ZnNpemUpCisgICAgCisKK2NsYXNzIFNlY3VyZVhNTFJQQ1NlcnZlcihTaW1wbGVYTUxSUENTZXJ2ZXIuU2ltcGxlWE1MUlBDU2VydmVyLCBTZWN1cmVUQ1BTZXJ2ZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyLAorICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcj1TZWN1cmVYTUxSUENSZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgbG9nUmVxdWVzdHM9MSk6CisgICAgICAgICIiIgorICAgICAgICBUaGlzIGlzIHRoZSBleGFjdCBzYW1lIGNvZGUgYXMgU2ltcGxlWE1MUlBDU2VydmVyLl9faW5pdF9fCisgICAgICAgIGV4Y2VwdCBpdCBjYWxscyBTZWN1cmVUQ1BTZXJ2ZXIuX19pbml0X18gaW5zdGVhZCBvZiBwbGFpbgorICAgICAgICBvbGQgVENQU2VydmVyLl9faW5pdF9fCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmZ1bmNzID0ge30KKyAgICAgICAgc2VsZi5sb2dSZXF1ZXN0cyA9IGxvZ1JlcXVlc3RzCisgICAgICAgIHNlbGYuaW5zdGFuY2UgPSBOb25lCisgICAgICAgIFNlY3VyZVRDUFNlcnZlci5fX2luaXRfXyhzZWxmLCBhZGRyLCByZXF1ZXN0SGFuZGxlcikKKwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvY2VydGdlbi5weSBiL2V4YW1wbGVzL2NlcnRnZW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3ZDBjNwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NlcnRnZW4ucHkKQEAgLTAsMCArMSw4MCBAQAorIworIyBjZXJ0Z2VuLnB5CisjCisjIENvcHlyaWdodCAoQykgTWFydGluIFNq9mdyZW4gYW5kIEFCIFN0cmFrdCAyMDAxLCBBbGwgcmlnaHRzIHJlc2VydmVkCisjCisjICRJZDogY2VydGdlbi5weSx2IDEuMiAyMDA0LzA3LzIyIDEyOjAxOjI1IG1hcnRpbiBFeHAgJAorIworIiIiCitDZXJ0aWZpY2F0ZSBnZW5lcmF0aW9uIG1vZHVsZS4KKyIiIgorCitmcm9tIE9wZW5TU0wgaW1wb3J0IGNyeXB0bworCitUWVBFX1JTQSA9IGNyeXB0by5UWVBFX1JTQQorVFlQRV9EU0EgPSBjcnlwdG8uVFlQRV9EU0EKKworZGVmIGNyZWF0ZUtleVBhaXIodHlwZSwgYml0cyk6CisgICAgIiIiCisgICAgQ3JlYXRlIGEgcHVibGljL3ByaXZhdGUga2V5IHBhaXIuCisKKyAgICBBcmd1bWVudHM6IHR5cGUgLSBLZXkgdHlwZSwgbXVzdCBiZSBvbmUgb2YgVFlQRV9SU0EgYW5kIFRZUEVfRFNBCisgICAgICAgICAgICAgICBiaXRzIC0gTnVtYmVyIG9mIGJpdHMgdG8gdXNlIGluIHRoZSBrZXkKKyAgICBSZXR1cm5zOiAgIFRoZSBwdWJsaWMvcHJpdmF0ZSBrZXkgcGFpciBpbiBhIFBLZXkgb2JqZWN0CisgICAgIiIiCisgICAgcGtleSA9IGNyeXB0by5QS2V5KCkKKyAgICBwa2V5LmdlbmVyYXRlX2tleSh0eXBlLCBiaXRzKQorICAgIHJldHVybiBwa2V5CisKK2RlZiBjcmVhdGVDZXJ0UmVxdWVzdChwa2V5LCBkaWdlc3Q9Im1kNSIsICoqbmFtZSk6CisgICAgIiIiCisgICAgQ3JlYXRlIGEgY2VydGlmaWNhdGUgcmVxdWVzdC4KKworICAgIEFyZ3VtZW50czogcGtleSAgIC0gVGhlIGtleSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcmVxdWVzdAorICAgICAgICAgICAgICAgZGlnZXN0IC0gRGlnZXN0aW9uIG1ldGhvZCB0byB1c2UgZm9yIHNpZ25pbmcsIGRlZmF1bHQgaXMgbWQ1CisgICAgICAgICAgICAgICAqKm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc3ViamVjdCBvZiB0aGUgcmVxdWVzdCwgcG9zc2libGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cyBhcmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgIEMgICAgIC0gQ291bnRyeSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNUICAgIC0gU3RhdGUgb3IgcHJvdmluY2UgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICBMICAgICAtIExvY2FsaXR5IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTyAgICAgLSBPcmdhbml6YXRpb24gbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICBPVSAgICAtIE9yZ2FuaXphdGlvbmFsIHVuaXQgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICBDTiAgICAtIENvbW1vbiBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsQWRkcmVzcyAtIEUtbWFpbCBhZGRyZXNzCisgICAgUmV0dXJuczogICBUaGUgY2VydGlmaWNhdGUgcmVxdWVzdCBpbiBhbiBYNTA5UmVxIG9iamVjdAorICAgICIiIgorICAgIHJlcSA9IGNyeXB0by5YNTA5UmVxKCkKKyAgICBzdWJqID0gcmVxLmdldF9zdWJqZWN0KCkKKworICAgIGZvciAoa2V5LHZhbHVlKSBpbiBuYW1lLml0ZW1zKCk6CisgICAgICAgIHNldGF0dHIoc3Viaiwga2V5LCB2YWx1ZSkKKworICAgIHJlcS5zZXRfcHVia2V5KHBrZXkpCisgICAgcmVxLnNpZ24ocGtleSwgZGlnZXN0KQorICAgIHJldHVybiByZXEKKworZGVmIGNyZWF0ZUNlcnRpZmljYXRlKHJlcSwgKGlzc3VlckNlcnQsIGlzc3VlcktleSksIHNlcmlhbCwgKG5vdEJlZm9yZSwgbm90QWZ0ZXIpLCBkaWdlc3Q9Im1kNSIpOgorICAgICIiIgorICAgIEdlbmVyYXRlIGEgY2VydGlmaWNhdGUgZ2l2ZW4gYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0LgorCisgICAgQXJndW1lbnRzOiByZXEgICAgICAgIC0gQ2VydGlmaWNhdGUgcmVxZXVzdCB0byB1c2UKKyAgICAgICAgICAgICAgIGlzc3VlckNlcnQgLSBUaGUgY2VydGlmaWNhdGUgb2YgdGhlIGlzc3VlcgorICAgICAgICAgICAgICAgaXNzdWVyS2V5ICAtIFRoZSBwcml2YXRlIGtleSBvZiB0aGUgaXNzdWVyCisgICAgICAgICAgICAgICBzZXJpYWwgICAgIC0gU2VyaWFsIG51bWJlciBmb3IgdGhlIGNlcnRpZmljYXRlCisgICAgICAgICAgICAgICBub3RCZWZvcmUgIC0gVGltZXN0YW1wIChyZWxhdGl2ZSB0byBub3cpIHdoZW4gdGhlIGNlcnRpZmljYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRzIGJlaW5nIHZhbGlkCisgICAgICAgICAgICAgICBub3RBZnRlciAgIC0gVGltZXN0YW1wIChyZWxhdGl2ZSB0byBub3cpIHdoZW4gdGhlIGNlcnRpZmljYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHMgYmVpbmcgdmFsaWQKKyAgICAgICAgICAgICAgIGRpZ2VzdCAgICAgLSBEaWdlc3QgbWV0aG9kIHRvIHVzZSBmb3Igc2lnbmluZywgZGVmYXVsdCBpcyBtZDUKKyAgICBSZXR1cm5zOiAgIFRoZSBzaWduZWQgY2VydGlmaWNhdGUgaW4gYW4gWDUwOSBvYmplY3QKKyAgICAiIiIKKyAgICBjZXJ0ID0gY3J5cHRvLlg1MDkoKQorICAgIGNlcnQuc2V0X3NlcmlhbF9udW1iZXIoc2VyaWFsKQorICAgIGNlcnQuZ210aW1lX2Fkal9ub3RCZWZvcmUobm90QmVmb3JlKQorICAgIGNlcnQuZ210aW1lX2Fkal9ub3RBZnRlcihub3RBZnRlcikKKyAgICBjZXJ0LnNldF9pc3N1ZXIoaXNzdWVyQ2VydC5nZXRfc3ViamVjdCgpKQorICAgIGNlcnQuc2V0X3N1YmplY3QocmVxLmdldF9zdWJqZWN0KCkpCisgICAgY2VydC5zZXRfcHVia2V5KHJlcS5nZXRfcHVia2V5KCkpCisgICAgY2VydC5zaWduKGlzc3VlcktleSwgZGlnZXN0KQorICAgIHJldHVybiBjZXJ0CisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21rX3NpbXBsZV9jZXJ0cy5weSBiL2V4YW1wbGVzL21rX3NpbXBsZV9jZXJ0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGZkZDJlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWtfc2ltcGxlX2NlcnRzLnB5CkBAIC0wLDAgKzEsMTcgQEAKKyIiIgorQ3JlYXRlIGNlcnRpZmljYXRlcyBhbmQgcHJpdmF0ZSBrZXlzIGZvciB0aGUgJ3NpbXBsZScgZXhhbXBsZS4KKyIiIgorCitmcm9tIE9wZW5TU0wgaW1wb3J0IGNyeXB0bworZnJvbSBjZXJ0Z2VuIGltcG9ydCAqICAgIyB5ZXMgeWVzLCBJIGtub3csIEknbSBsYXp5CitjYWtleSA9IGNyZWF0ZUtleVBhaXIoVFlQRV9SU0EsIDEwMjQpCitjYXJlcSA9IGNyZWF0ZUNlcnRSZXF1ZXN0KGNha2V5LCBDTj0nQ2VydGlmaWNhdGUgQXV0aG9yaXR5JykKK2NhY2VydCA9IGNyZWF0ZUNlcnRpZmljYXRlKGNhcmVxLCAoY2FyZXEsIGNha2V5KSwgMCwgKDAsIDYwKjYwKjI0KjM2NSo1KSkgIyBmaXZlIHllYXJzCitvcGVuKCdzaW1wbGUvQ0EucGtleScsICd3Jykud3JpdGUoY3J5cHRvLmR1bXBfcHJpdmF0ZWtleShjcnlwdG8uRklMRVRZUEVfUEVNLCBjYWtleSkpCitvcGVuKCdzaW1wbGUvQ0EuY2VydCcsICd3Jykud3JpdGUoY3J5cHRvLmR1bXBfY2VydGlmaWNhdGUoY3J5cHRvLkZJTEVUWVBFX1BFTSwgY2FjZXJ0KSkKK2ZvciAoZm5hbWUsIGNuYW1lKSBpbiBbKCdjbGllbnQnLCAnU2ltcGxlIENsaWVudCcpLCAoJ3NlcnZlcicsICdTaW1wbGUgU2VydmVyJyldOgorICAgIHBrZXkgPSBjcmVhdGVLZXlQYWlyKFRZUEVfUlNBLCAxMDI0KQorICAgIHJlcSA9IGNyZWF0ZUNlcnRSZXF1ZXN0KHBrZXksIENOPWNuYW1lKQorICAgIGNlcnQgPSBjcmVhdGVDZXJ0aWZpY2F0ZShyZXEsIChjYWNlcnQsIGNha2V5KSwgMSwgKDAsIDYwKjYwKjI0KjM2NSo1KSkgIyBmaXZlIHllYXJzCisgICAgb3Blbignc2ltcGxlLyVzLnBrZXknICUgKGZuYW1lLCksICd3Jykud3JpdGUoY3J5cHRvLmR1bXBfcHJpdmF0ZWtleShjcnlwdG8uRklMRVRZUEVfUEVNLCBwa2V5KSkKKyAgICBvcGVuKCdzaW1wbGUvJXMuY2VydCcgJSAoZm5hbWUsKSwgJ3cnKS53cml0ZShjcnlwdG8uZHVtcF9jZXJ0aWZpY2F0ZShjcnlwdG8uRklMRVRZUEVfUEVNLCBjZXJ0KSkKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Byb3h5LnB5IGIvZXhhbXBsZXMvcHJveHkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA5NDg2NAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Byb3h5LnB5CkBAIC0wLDAgKzEsNzAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBUaGlzIHNjcmlwdCBkZW1vc3RyYXRlcyBob3cgb25lIGNhbiB1c2UgcHlPcGVuU1NMIHRvIHNwZWFrIFNTTCBvdmVyIGFuIEhUVFAKKyMgcHJveHkKKyMgVGhlIGNoYWxsZW5nZSBoZXJlIGlzIHRvIHN0YXJ0IHRhbGtpbmcgU1NMIG92ZXIgYW4gYWxyZWFkeSBjb25uZWN0ZWQgc29ja2V0CisjCisjIEF1dGhvcjogTWloYWkgSWJhbmVzY3UgPG1pc2FAcmVkaGF0LmNvbT4KKyMKKyMgJElkOiBwcm94eS5weSx2IDEuMiAyMDA0LzA3LzIyIDEyOjAxOjI1IG1hcnRpbiBFeHAgJAorCitpbXBvcnQgc3lzLCBzb2NrZXQsIHN0cmluZworZnJvbSBPcGVuU1NMIGltcG9ydCBTU0wKKworZGVmIHVzYWdlKGV4aXRfY29kZT0wKToKKyAgICBwcmludCAiVXNhZ2U6ICVzIHNlcnZlcls6cG9ydF0gcHJveHlbOnBvcnRdIiAlIHN5cy5hcmd2WzBdCisgICAgcHJpbnQgIiAgQ29ubmVjdHMgU1NMIHRvIHRoZSBzcGVjaWZpZWQgc2VydmVyIChwb3J0IDQ0MyBieSBkZWZhdWx0KSIKKyAgICBwcmludCAiICAgIHVzaW5nIHRoZSBzcGVjaWZpZWQgcHJveHkgKHBvcnQgODA4MCBieSBkZWZhdWx0KSIKKyAgICBzeXMuZXhpdChleGl0X2NvZGUpCisKK2RlZiBtYWluKCk6CisgICAgIyBDb21tYW5kLWxpbmUgcHJvY2Vzc2luZworICAgIGlmIGxlbihzeXMuYXJndikgIT0gMzoKKyAgICAgICAgdXNhZ2UoLTEpCisKKyAgICBzZXJ2ZXIsIHByb3h5ID0gc3lzLmFyZ3ZbMTozXQorCisgICAgcnVuKHNwbGl0X2hvc3Qoc2VydmVyLCA0NDMpLCBzcGxpdF9ob3N0KHByb3h5LCA4MDgwKSkKKworZGVmIHNwbGl0X2hvc3QoaG9zdG5hbWUsIGRlZmF1bHRfcG9ydD04MCk6CisgICAgYSA9IHN0cmluZy5zcGxpdChob3N0bmFtZSwgJzonLCAxKQorICAgIGlmIGxlbihhKSA9PSAxOgorICAgICAgICBhLmFwcGVuZChkZWZhdWx0X3BvcnQpCisgICAgcmV0dXJuIGFbMF0sIGludChhWzFdKQorICAgIAorCisjIENvbm5lY3RzIHRvIHRoZSBzZXJ2ZXIsIHRocm91Z2ggdGhlIHByb3h5CitkZWYgcnVuKHNlcnZlciwgcHJveHkpOgorICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgdHJ5OgorICAgICAgICBzLmNvbm5lY3QocHJveHkpCisgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZToKKyAgICAgICAgcHJpbnQgIlVuYWJsZSB0byBjb25uZWN0IHRvICVzOiVzICVzIiAlIChwcm94eVswXSwgcHJveHlbMV0sIHN0cihlKSkKKyAgICAgICAgc3lzLmV4aXQoLTEpCisKKyAgICAjIFVzZSB0aGUgQ09OTkVDVCBtZXRob2QgdG8gZ2V0IGEgY29ubmVjdGlvbiB0byB0aGUgYWN0dWFsIHNlcnZlcgorICAgIHMuc2VuZCgiQ09OTkVDVCAlczolcyBIVFRQLzEuMFxuXG4iICUgKHNlcnZlclswXSwgc2VydmVyWzFdKSkKKyAgICBwcmludCAiUHJveHkgcmVzcG9uc2U6ICVzIiAlIHN0cmluZy5zdHJpcChzLnJlY3YoMTAyNCkpCisKKyAgICBjdHggPSBTU0wuQ29udGV4dChTU0wuU1NMdjIzX01FVEhPRCkKKyAgICBjb25uID0gU1NMLkNvbm5lY3Rpb24oY3R4LCBzKQorCisgICAgIyBHbyB0byBjbGllbnQgbW9kZQorICAgIGNvbm4uc2V0X2Nvbm5lY3Rfc3RhdGUoKQorCisgICAgIyBzdGFydCB1c2luZyBIVFRQCisKKyAgICBjb25uLnNlbmQoIkhFQUQgLyBIVFRQLzEuMFxuXG4iKQorICAgIHByaW50ICJTZXZlciByZXNwb25zZToiCisgICAgcHJpbnQgIi0iICogNDAKKyAgICB3aGlsZSAxOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBidWZmID0gY29ubi5yZWN2KDQwOTYpCisgICAgICAgIGV4Y2VwdCBTU0wuWmVyb1JldHVybkVycm9yOgorICAgICAgICAgICAgIyB3ZSdyZSBkb25lCisgICAgICAgICAgICBicmVhaworCisgICAgICAgIHByaW50IGJ1ZmYsCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9leGFtcGxlcy9zaW1wbGUvQ0EuY2VydCBiL2V4YW1wbGVzL3NpbXBsZS9DQS5jZXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNjE2MmQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zaW1wbGUvQ0EuY2VydApAQCAtMCwwICsxLDEyIEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUJyekNDQVJnQ0FRQXdEUVlKS29aSWh2Y05BUUVFQlFBd0lERWVNQndHQTFVRUF4TVZRMlZ5ZEdsbWFXTmgKK2RHVWdRWFYwYUc5eWFYUjVNQjRYRFRBeU1EZ3hOVEV5TWpRek4xb1hEVEEzTURneE5ERXlNalF6TjFvd0lERWUKK01Cd0dBMVVFQXhNVlEyVnlkR2xtYVdOaGRHVWdRWFYwYUc5eWFYUjVNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUEKK0E0R05BRENCaVFLQmdRQzlQTmZBRmxSa2p3NFNQTG04VlY0L1VGVmtGSlJLenBGZ3lpMFV4TjFXNUhxU3hNdEgKK2l2WVBpVWhodGZkR2xMbHpjTVRlRStiY0R4WWpkcktoMWJIM09tSk42MGZkcENpdTJZTUd1Y3JOYkx2dUQ4K2YKK0UxdW9xWWhoZUtUVzBwMlYrTWtHTWIvY2JUbUtrMXJIcjVkV0hWWE9yWFR1cy9VOGZtdC8xd2NrTndJREFRQUIKK01BMEdDU3FHU0liM0RRRUJCQVVBQTRHQkFGdDBSSFhKYkZQV0hWbng5L3Z5Q1FsSTNWbHVFQkpxdVVsSkZzcWQKK1ZjdEZ2elF5UHlwWVJYWXF4akQ4SlR4TzBEbUR5dmxQTkV1NG52NlJWeWNhOEZLREYweDhybzVHL2hrQ2tWck4KKzZBdkMxWkljY0hiM0x6bGZTdjhiTkIwaVBrUVB2bkg0WnhERStLSmNPZTgwUzd0dFNSZERuanhtNE5aRm1Vc0kKK050QlMKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NpbXBsZS9DQS5wa2V5IGIvZXhhbXBsZXMvc2ltcGxlL0NBLnBrZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc0N2E5OQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NpbXBsZS9DQS5wa2V5CkBAIC0wLDAgKzEsMTUgQEAKKy0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KK01JSUNYUUlCQUFLQmdRQzlQTmZBRmxSa2p3NFNQTG04VlY0L1VGVmtGSlJLenBGZ3lpMFV4TjFXNUhxU3hNdEgKK2l2WVBpVWhodGZkR2xMbHpjTVRlRStiY0R4WWpkcktoMWJIM09tSk42MGZkcENpdTJZTUd1Y3JOYkx2dUQ4K2YKK0UxdW9xWWhoZUtUVzBwMlYrTWtHTWIvY2JUbUtrMXJIcjVkV0hWWE9yWFR1cy9VOGZtdC8xd2NrTndJREFRQUIKK0FvR0JBSXdaNTRHSEJxUU1aVmFMTHRlSVBHYVRpeVMxTjdUS2lrY21aNG5nMWgzbXVmaS9TZUNGdVBaM3BPYnkKK1dVZ2dBOHk3eUlUQ0owRDB5bWNuRWNsTzlKblVQOFhGOHE3WUJOVmpqU1FLcjd4YTRrK1IxeXprcU93TG5HRkkKK1g1T1dRcEhuR0R6VlpYMTRDR1FNazhwMWpJbDZqejlMck5KL3NwQjRWclRrQjkrQkFrRUEranQzQ2pVM3g0RGwKK0RPeERmd05qd3EybXc0M1NkeUYwM3Zkb2JMSHZRaHhvTGJ1Z2xtU1NlM1Y5bXRlRDNoOU53Z29zSzdRa0Fwd3IKK2dKMkVIQVdKdndKQkFNR1plQ3hmTzVCOWdoVllOZDhKdXBEZElrSWlKaDI4d0pQeDhiZ29uY0JzQi9iN0pFZDUKK2FVYmZDd3VNenkvRkhMVFJXQ2tpUTAycU1TUEJWY3A0MDRrQ1FHUnc3ZzFZNHpUZlZoRmozSXZsRG13Y1MrMysKK3hWWXdSYnNoei9haFRZcFo0SzlLdXVEaktiRUlyZ3d6S2FsRkkyOFpxalU0cjZPa2tBbW1NRnNYRmYwQ1FIVk8KK0puRE1hMjBMZjJ5cmZFamV2anJVb3ROcm1hamZHOWtJK3F2WmdHeDlpUDN3QW5XRWJYUFI1Z0ZqbW82Wll1RjEKK0QzUXRISmJNanVYWldjQkxJZkVDUVFEUDZ5d2p3TUFBQjIyODVHd3lJOEFxdm85VTA1UXRHYnk2Ty9VUTJYb00KK1hzcmpNNDJxbFBJK1MrczcybzQ3d2tSaFJheWhuRTVNSk1wS0pHZ2JUTjhmCistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2ltcGxlL2NsaWVudC5jZXJ0IGIvZXhhbXBsZXMvc2ltcGxlL2NsaWVudC5jZXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZWUzNWUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zaW1wbGUvY2xpZW50LmNlcnQKQEAgLTAsMCArMSwxMSBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlCcHpDQ0FSQUNBUUV3RFFZSktvWklodmNOQVFFRUJRQXdJREVlTUJ3R0ExVUVBeE1WUTJWeWRHbG1hV05oCitkR1VnUVhWMGFHOXlhWFI1TUI0WERUQXlNRGd4TlRFeU1qUXpOMW9YRFRBM01EZ3hOREV5TWpRek4xb3dHREVXCitNQlFHQTFVRUF4TU5VMmx0Y0d4bElFTnNhV1Z1ZERDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDCitnWUVBeW5BUmFEaGQ1SS9CaExHbGNxT3FPb0VzT0VGNEtIOSs1U2Z3UVgxekJhYUk4YlZUcThHQjEvSjVVRlh0CiszdWdMQWI0UUh0VVZCcmtzOXdpK0lHRU5TMUllVWdaWk1zRVRRcVhnemRLM1NYdDdJUG5nZ280R1VsM2RXSUpHCitVWXNPamVhMzdlalYxVGJ0RDVNckVXTlNGNEY5T1AxSDhvV1VGSk9GUi83c2RIRUNBd0VBQVRBTkJna3Foa2lHCis5dzBCQVFRRkFBT0JnUUF6dnNIN2ZEMEdLS1pvMnVMLzVnQmMvWkUxaFN4L0tmUklaNzhDWkdzZ0hJOG9pM1krCitLbTkxUFgySDR4eC8yZHYvWmFBUHNsRGp2dnlWVGw2S1FvTitITW1oY2pZOFhBczFsVnFja2NOYmhWRXcya2djCitBZG15NXlQWm11SUMwblRDMWp6Wm8xZERENFBOckZjUmhvNmZIRGsyYWF4cFMrRG56QU8yL2NUQ1RnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NpbXBsZS9jbGllbnQucGtleSBiL2V4YW1wbGVzL3NpbXBsZS9jbGllbnQucGtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGZmZWMxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc2ltcGxlL2NsaWVudC5wa2V5CkBAIC0wLDAgKzEsMTUgQEAKKy0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KK01JSUNYZ0lCQUFLQmdRREtjQkZvT0Yza2o4R0VzYVZ5bzZvNmdTdzRRWGdvZjM3bEovQkJmWE1GcG9qeHRWT3IKK3dZSFg4bmxRVmUzZTZBc0J2aEFlMVJVR3VTejNDTDRnWVExTFVoNVNCbGt5d1JOQ3BlRE4wcmRKZTNzZytlQ0MKK2pnWlNYZDFZZ2taUml3Nk41cmZ0Nk5YVk51MFBreXNSWTFJWGdYMDQvVWZ5aFpRVWs0VkgvdXgwY1FJREFRQUIKK0FvR0JBSXd2MzE0VTZyQ0UvTFl2Ynl0Y08xNFlaYzd2UjQ2RC9CUWsvRFBkOC9GTnlqZllJZ0VuR0F1N1ZsZFQKK3FrNWEwb1I2WWg5MzMvK3Y3SHVHQ21QUjBhbkNkQlgrMGZ1WmFrTWV0dk0xUE4wTnZ2OFBxRVhmSUxXL2lrVDYKK3JDY0ZXWGZmNG9nNDFIVm1MY2FwNndvNEtlQ0dMeVhFeW5aV0NYTlJuZWRHbkhRaEFrRUErMXRPYTAzb2M5SEoKK1JiQkM4N3RlU0xDVlZhOENpWFdocHR0WEFiQlBCUnB6ckJDZElpdjljcFZRMWlSUmJtS1VnUFJOWDFNUUk1THcKKzZtelFOa1JQbndKQkFNNHRhekxaSkQzS0lxTlRVdVFneGhjUG16ZXJRNWp5bGhiUGNIQjRONVUvblMxZmVXcG0KK1FRZjRBV1FwNFRKVU9xb3FXK25iZGZFd3lPVVBxYzJaZ2U4Q1FRRHVwbkorVHlvMVRTbmNrTTRBdkJWNHpxLzYKKytuOWVJK0dubXZteEVNVDJBM2R3RnhZYUs4b24wTDAvbEp2OFFuemRNeGVET2twSWZHdGhLSTlIOXZQaEFrQUoKKzhDaUZwKy9XUnFNS3lsNXBmcWJ0djZQVXVCMm5Cckp6WVFaamRYZ0Fhck9SMTFOTDdLZmYwWFdIdFhrVWF2ajAKKzhOdkRWdi9GWTN1Ymh2akJYMC9qQWtFQXRqYndiSWNSVmpNUTlGdVprNlNkSkJTTWZzWDdpVERoZ0E3SGduM1UKK1lzSG8zRTA5NGxJaS82NmduQXBWVU9xciticmRnbFA2dUFHMnFQK1pncVdQaXc9PQorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NpbXBsZS9jbGllbnQucHkgYi9leGFtcGxlcy9zaW1wbGUvY2xpZW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNThiMjAKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zaW1wbGUvY2xpZW50LnB5CkBAIC0wLDAgKzEsNTMgQEAKKyMKKyMgY2xpZW50LnB5CisjCisjIENvcHlyaWdodCAoQykgMjAwMSBNYXJ0aW4gU2r2Z3JlbiBhbmQgQUIgU3RyYWt0LCBBbGwgcmlnaHRzIHJlc2VydmVkCisjCisjICRJZDogY2xpZW50LnB5LHYgMS43IDIwMDIvMDgvMTUgMTI6MjA6NDYgbWFydGluIEV4cCAkCisjCisiIiIKK1NpbXBsZSBTU0wgY2xpZW50LCB1c2luZyBibG9ja2luZyBJL08KKyIiIgorCitmcm9tIE9wZW5TU0wgaW1wb3J0IFNTTAoraW1wb3J0IHN5cywgb3MsIHNlbGVjdCwgc29ja2V0CisKK2RlZiB2ZXJpZnlfY2IoY29ubiwgY2VydCwgZXJybnVtLCBkZXB0aCwgb2spOgorICAgICMgVGhpcyBvYnZpb3VzbHkgaGFzIHRvIGJlIHVwZGF0ZWQKKyAgICBwcmludCAnR290IGNlcnRpZmljYXRlOiAlcycgJSBjZXJ0LmdldF9zdWJqZWN0KCkKKyAgICByZXR1cm4gb2sKKworaWYgbGVuKHN5cy5hcmd2KSA8IDM6CisgICAgcHJpbnQgJ1VzYWdlOiBweXRob25bMl0gY2xpZW50LnB5IEhPU1QgUE9SVCcKKyAgICBzeXMuZXhpdCgxKQorCitkaXIgPSBvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pCitpZiBkaXIgPT0gJyc6CisgICAgZGlyID0gb3MuY3VyZGlyCisKKyMgSW5pdGlhbGl6ZSBjb250ZXh0CitjdHggPSBTU0wuQ29udGV4dChTU0wuU1NMdjIzX01FVEhPRCkKK2N0eC5zZXRfdmVyaWZ5KFNTTC5WRVJJRllfUEVFUiwgdmVyaWZ5X2NiKSAjIERlbWFuZCBhIGNlcnRpZmljYXRlCitjdHgudXNlX3ByaXZhdGVrZXlfZmlsZSAob3MucGF0aC5qb2luKGRpciwgJ2NsaWVudC5wa2V5JykpCitjdHgudXNlX2NlcnRpZmljYXRlX2ZpbGUob3MucGF0aC5qb2luKGRpciwgJ2NsaWVudC5jZXJ0JykpCitjdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKG9zLnBhdGguam9pbihkaXIsICdDQS5jZXJ0JykpCisKKyMgU2V0IHVwIGNsaWVudAorc29jayA9IFNTTC5Db25uZWN0aW9uKGN0eCwgc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKSkKK3NvY2suY29ubmVjdCgoc3lzLmFyZ3ZbMV0sIGludChzeXMuYXJndlsyXSkpKQorCit3aGlsZSAxOgorICAgIGxpbmUgPSBzeXMuc3RkaW4ucmVhZGxpbmUoKQorICAgIGlmIGxpbmUgPT0gJyc6CisgICAgICAgIGJyZWFrCisgICAgdHJ5OgorICAgICAgICBzb2NrLnNlbmQobGluZSkKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZShzb2NrLnJlY3YoMTAyNCkpCisgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgIGV4Y2VwdCBTU0wuRXJyb3I6CisgICAgICAgIHByaW50ICdDb25uZWN0aW9uIGRpZWQgdW5leHBlY3RlZGx5JworICAgICAgICBicmVhaworCisKK3NvY2suc2h1dGRvd24oKQorc29jay5jbG9zZSgpCmRpZmYgLS1naXQgYS9leGFtcGxlcy9zaW1wbGUvc2VydmVyLmNlcnQgYi9leGFtcGxlcy9zaW1wbGUvc2VydmVyLmNlcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjODRlOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NpbXBsZS9zZXJ2ZXIuY2VydApAQCAtMCwwICsxLDExIEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUJwekNDQVJBQ0FRRXdEUVlKS29aSWh2Y05BUUVFQlFBd0lERWVNQndHQTFVRUF4TVZRMlZ5ZEdsbWFXTmgKK2RHVWdRWFYwYUc5eWFYUjVNQjRYRFRBeU1EZ3hOVEV5TWpRek9Gb1hEVEEzTURneE5ERXlNalF6T0Zvd0dERVcKK01CUUdBMVVFQXhNTlUybHRjR3hsSUZObGNuWmxjakNCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0MKK2dZRUE2SVVlRUY3SUE1b25NWWoxbnhiTlJzaHRFTXRKb05LbVZoa2h2K2l6aWhTbUZCWnAyWCtzNWlqQ1Z0eDQKK1JsU2JVaDlITjN5UUpuTDBscGl2Nk11aXZYaVlFbE1jbGE4eDNucnlCRzVaTkU2ZHBaSTlOcUdDdU16eWl1aEgKKzJBaHlKUFEyeERPQWx5NVQvam5JTE5VbVBiUEJtcFVYNWhZakFhVHlYTTloVUlrQ0F3RUFBVEFOQmdrcWhraUcKKzl3MEJBUVFGQUFPQmdRQW82dStWOUNVOXRMSkk2aUQzWCtveEM2WjVYQ0w3aXo1Uk9mK0c4SmJrZTIxdVdiV1MKK0pIdm1rMWpFTnJmSFo4ejF2bTVYTjI1VFdORFhQbU5iMWM0bjNSbjlDY29Wbm1HK0lUaEFhcVFadXdTcnlqMkIKK1Rtdnl6S3FOcUxiZG9mRjFPNWh5cWdEVUZHMDkzMjNIbnk0K1R3YVVxMnlNYWo2M2pwTHlVa1pjL1E9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2ltcGxlL3NlcnZlci5wa2V5IGIvZXhhbXBsZXMvc2ltcGxlL3NlcnZlci5wa2V5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiY2ZhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zaW1wbGUvc2VydmVyLnBrZXkKQEAgLTAsMCArMSwxNSBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJQ1hnSUJBQUtCZ1FEb2hSNFFYc2dEbWljeGlQV2ZGczFHeUcwUXkwbWcwcVpXR1NHLzZMT0tGS1lVRm1uWgorZjZ6bUtNSlczSGhHVkp0U0gwYzNmSkFtY3ZTV21LL295Nks5ZUpnU1V4eVZyekhlZXZJRWJsazBUcDJsa2owMgorb1lLNHpQS0s2RWZZQ0hJazlEYkVNNENYTGxQK09jZ3MxU1k5czhHYWxSZm1GaU1CcFBKY3oyRlFpUUlEQVFBQgorQW9HQU1ueWsrSHo4QlB3MXdtV3duMmgrRGY1NjRBaWo1ZzJYSEY2OG0wVFZwd2V3disvVjcrbnZDdEtTei9WegorRUNKU3oxUUhUSjc1VmIva0o4YmplektzRlBuY0JSVUJCUE5sYnZPRDAyRGhEUUFtemRKUHVsNmdRMlR2dHVMdQorMDdLdGZqblFjSDQvMmdxTWtuVzdHQjNTcm9DRFpidzcyUVJ1cmlkRnZmSmxUbGtDUVFENlRPeTdhNVdaT24rUQorbHVZTHlXek9hQjd1ekxmb0hZM3RXTGQxaEpCTGJZK1d2dVhGemZqZ0x0ZU03dnhIcGl0eit4amlGdzZrdEs2bworbWhtdC9RR1RBa0VBN2RDTGdhSTJscWszR3FuZEVXc1UzM1BZSmxnTldBVmpNbkdSTW1Zd0VueFlmN1drUEdZQworMDdxaGxCb1oxU2lpSE9tTUNEK0lZNmZyQ2hkVThDOG04d0pCQUlrNmdaUWo0T29ZaTNYZmRaTEN4VmZJK0NTZQorc3JtYzhvSk5ZSkFhdE8zVnpLS3VXTldCSHREeWZaVTBOYmFtb1M0K1haOGZXeFRzUnRJRFlzN2tadWNDUVFDSAoraDFNSjVNMGhYWHcyNk5sQXhQclhRYWpNYVYvcGF1Q1diZHhta1pBUjZPVnltcXpuY3VkbmpMUHF1RmxDZm02cworOVhoRmR4ZWVXNkw2VkVPbXdlaDdBa0VBc3ZjRWNjZThDQWF1cm9RNFNUNWR3OWRRbHh1b2hIWTM3bEV0V3VGTAorQTcvazFrQ3RMaXRaS3ZBV0RmYXozNE5RVXRncjUvbE9RNmgrakdmSWFmcEhwUT09CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2ltcGxlL3NlcnZlci5weSBiL2V4YW1wbGVzL3NpbXBsZS9zZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5MmVjMwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NpbXBsZS9zZXJ2ZXIucHkKQEAgLTAsMCArMSwxMDEgQEAKKyMKKyMgc2VydmVyLnB5CisjCisjIENvcHlyaWdodCAoQykgMjAwMSBNYXJ0aW4gU2r2Z3JlbiBhbmQgQUIgU3RyYWt0LCBBbGwgcmlnaHRzIHJlc2VydmVkCisjCisjICRJZDogc2VydmVyLnB5LHYgMS4yIDIwMDIvMDcvMjUgMDg6MjY6MzQgbWFydGluIEV4cCAkCisjCisiIiIKK1NpbXBsZSBlY2hvIHNlcnZlciwgdXNpbmcgbm9uYmxvY2tpbmcgSS9PCisiIiIKKworZnJvbSBPcGVuU1NMIGltcG9ydCBTU0wKK2ltcG9ydCBzeXMsIG9zLCBzZWxlY3QsIHNvY2tldAorCisKK2RlZiB2ZXJpZnlfY2IoY29ubiwgY2VydCwgZXJybnVtLCBkZXB0aCwgb2spOgorICAgICMgVGhpcyBvYnZpb3VzbHkgaGFzIHRvIGJlIHVwZGF0ZWQKKyAgICBwcmludCAnR290IGNlcnRpZmljYXRlOiAlcycgJSBjZXJ0LmdldF9zdWJqZWN0KCkKKyAgICByZXR1cm4gb2sKKworaWYgbGVuKHN5cy5hcmd2KSA8IDI6CisgICAgcHJpbnQgJ1VzYWdlOiBweXRob25bMl0gc2VydmVyLnB5IFBPUlQnCisgICAgc3lzLmV4aXQoMSkKKworZGlyID0gb3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKQoraWYgZGlyID09ICcnOgorICAgIGRpciA9IG9zLmN1cmRpcgorCisjIEluaXRpYWxpemUgY29udGV4dAorY3R4ID0gU1NMLkNvbnRleHQoU1NMLlNTTHYyM19NRVRIT0QpCitjdHguc2V0X29wdGlvbnMoU1NMLk9QX05PX1NTTHYyKQorY3R4LnNldF92ZXJpZnkoU1NMLlZFUklGWV9QRUVSfFNTTC5WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQsIHZlcmlmeV9jYikgIyBEZW1hbmQgYSBjZXJ0aWZpY2F0ZQorY3R4LnVzZV9wcml2YXRla2V5X2ZpbGUgKG9zLnBhdGguam9pbihkaXIsICdzZXJ2ZXIucGtleScpKQorY3R4LnVzZV9jZXJ0aWZpY2F0ZV9maWxlKG9zLnBhdGguam9pbihkaXIsICdzZXJ2ZXIuY2VydCcpKQorY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhvcy5wYXRoLmpvaW4oZGlyLCAnQ0EuY2VydCcpKQorCisjIFNldCB1cCBzZXJ2ZXIKK3NlcnZlciA9IFNTTC5Db25uZWN0aW9uKGN0eCwgc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKSkKK3NlcnZlci5iaW5kKCgnJywgaW50KHN5cy5hcmd2WzFdKSkpCitzZXJ2ZXIubGlzdGVuKDMpIAorc2VydmVyLnNldGJsb2NraW5nKDApCisKK2NsaWVudHMgPSB7fQord3JpdGVycyA9IHt9CisKK2RlZiBkcm9wQ2xpZW50KGNsaSwgZXJyb3JzPU5vbmUpOgorICAgIGlmIGVycm9yczoKKyAgICAgICAgcHJpbnQgJ0NsaWVudCAlcyBsZWZ0IHVuZXhwZWN0ZWRseTonICUgKGNsaWVudHNbY2xpXSwpCisgICAgICAgIHByaW50ICcgICcsIGVycm9ycworICAgIGVsc2U6CisgICAgICAgIHByaW50ICdDbGllbnQgJXMgbGVmdCBwb2xpdGVseScgJSAoY2xpZW50c1tjbGldLCkKKyAgICBkZWwgY2xpZW50c1tjbGldCisgICAgaWYgd3JpdGVycy5oYXNfa2V5KGNsaSk6CisgICAgICAgIGRlbCB3cml0ZXJzW2NsaV0KKyAgICBpZiBub3QgZXJyb3JzOgorICAgICAgICBjbGkuc2h1dGRvd24oKQorICAgIGNsaS5jbG9zZSgpCisKK3doaWxlIDE6CisgICAgdHJ5OgorICAgICAgICByLHcsXyA9IHNlbGVjdC5zZWxlY3QoW3NlcnZlcl0rY2xpZW50cy5rZXlzKCksIHdyaXRlcnMua2V5cygpLCBbXSkKKyAgICBleGNlcHQ6CisgICAgICAgIGJyZWFrCisKKyAgICBmb3IgY2xpIGluIHI6CisgICAgICAgIGlmIGNsaSA9PSBzZXJ2ZXI6CisgICAgICAgICAgICBjbGksYWRkciA9IHNlcnZlci5hY2NlcHQoKQorICAgICAgICAgICAgcHJpbnQgJ0Nvbm5lY3Rpb24gZnJvbSAlcycgJSAoYWRkciwpCisgICAgICAgICAgICBjbGllbnRzW2NsaV0gPSBhZGRyCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXQgPSBjbGkucmVjdigxMDI0KQorICAgICAgICAgICAgZXhjZXB0IChTU0wuV2FudFJlYWRFcnJvciwgU1NMLldhbnRXcml0ZUVycm9yLCBTU0wuV2FudFg1MDlMb29rdXBFcnJvcik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IFNTTC5aZXJvUmV0dXJuRXJyb3I6CisgICAgICAgICAgICAgICAgZHJvcENsaWVudChjbGkpCisgICAgICAgICAgICBleGNlcHQgU1NMLkVycm9yLCBlcnJvcnM6CisgICAgICAgICAgICAgICAgZHJvcENsaWVudChjbGksIGVycm9ycykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgbm90IHdyaXRlcnMuaGFzX2tleShjbGkpOgorICAgICAgICAgICAgICAgICAgICB3cml0ZXJzW2NsaV0gPSAnJworICAgICAgICAgICAgICAgIHdyaXRlcnNbY2xpXSA9IHdyaXRlcnNbY2xpXSArIHJldAorCisgICAgZm9yIGNsaSBpbiB3OgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXQgPSBjbGkuc2VuZCh3cml0ZXJzW2NsaV0pCisgICAgICAgIGV4Y2VwdCAoU1NMLldhbnRSZWFkRXJyb3IsIFNTTC5XYW50V3JpdGVFcnJvciwgU1NMLldhbnRYNTA5TG9va3VwRXJyb3IpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgU1NMLlplcm9SZXR1cm5FcnJvcjoKKyAgICAgICAgICAgIGRyb3BDbGllbnQoY2xpKQorICAgICAgICBleGNlcHQgU1NMLkVycm9yLCBlcnJvcnM6CisgICAgICAgICAgICBkcm9wQ2xpZW50KGNsaSwgZXJyb3JzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd3JpdGVyc1tjbGldID0gd3JpdGVyc1tjbGldW3JldDpdCisgICAgICAgICAgICBpZiB3cml0ZXJzW2NsaV0gPT0gJyc6CisgICAgICAgICAgICAgICAgZGVsIHdyaXRlcnNbY2xpXQorCitmb3IgY2xpIGluIGNsaWVudHMua2V5cygpOgorICAgIGNsaS5jbG9zZSgpCitzZXJ2ZXIuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvcnBtL2J1aWxkX3NjcmlwdCBiL3JwbS9idWlsZF9zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg1ZTVlNwotLS0gL2Rldi9udWxsCisrKyBiL3JwbS9idWlsZF9zY3JpcHQKQEAgLTAsMCArMSBAQAorbWFrZSAtQyBkb2MgdGV4dCBwcyBodG1sCmRpZmYgLS1naXQgYS9zZXR1cC5jZmcgYi9zZXR1cC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ1MDU0NAotLS0gL2Rldi9udWxsCisrKyBiL3NldHVwLmNmZwpAQCAtMCwwICsxLDEwIEBACitbc2Rpc3RdCitmb3JjZV9tYW5pZmVzdD0xCisKKyMgYmRpc3RfcnBtIHNldHRpbmdzIGNvbnRyaWJ1dGVkIGJ5IE1paGFpIEliYW5lc2N1IDxtaXNhQHJlZGhhdC5jb20+CitbYmRpc3RfcnBtXQorcmVsZWFzZSA9IDEKK2J1aWxkLXJlcXVpcmVzID0gbHlueCBvcGVuc3NsLWRldmVsIHB5dGhvbi1kZXZlbCBwZXJsIHRldGV4LWR2aXBzIHRldGV4LWxhdGV4Citncm91cCA9IERldmVsb3BtZW50L0xpYnJhcmllcworYnVpbGRfc2NyaXB0ID0gcnBtL2J1aWxkX3NjcmlwdAorZG9jLWZpbGVzID0gZG9jL3B5T3BlblNTTC50eHQgZG9jL3B5T3BlblNTTC5wcyBkb2MvaHRtbApkaWZmIC0tZ2l0IGEvc2V0dXAucHkgYi9zZXR1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MDljMjhkCi0tLSAvZGV2L251bGwKKysrIGIvc2V0dXAucHkKQEAgLTAsMCArMSw5MCBAQAorIyB2aW06ZmlsZWVuY29kaW5nPVVURi04CisjCisjIHNldHVwLnB5CisjCisjIENvcHlyaWdodCAoQykgQUIgU3RyYWt0IDIwMDEsIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyMKKyMgQCgjKSAkSWQ6IHNldHVwLnB5LHYgMS4yOCAyMDA0LzA4LzEwIDEwOjU5OjAxIG1hcnRpbiBFeHAgJAorIworIiIiCitJbnN0YWxsYXRpb24gc2NyaXB0IGZvciB0aGUgT3BlblNTTCBtb2R1bGUKKyIiIgorCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uCitpbXBvcnQgb3MsIHN5cworCitmcm9tIHZlcnNpb24gaW1wb3J0IF9fdmVyc2lvbl9fCisKKyMgQSBoYWNrIHRvIGRldGVybWluZSBpZiBFeHRlbnNpb24gb2JqZWN0cyBzdXBwb3J0IHRoZSBkZXBlbmRzIGtleXdvcmQgYXJnLgordHJ5OgorICAgIGluaXRfZnVuYyA9IEV4dGVuc2lvbi5fX2luaXRfXy5mdW5jX2NvZGUKKyAgICBoYXNfZGVwID0gJ2RlcGVuZHMnIGluIGluaXRfZnVuYy5jb192YXJuYW1lcworZXhjZXB0OgorICAgIGhhc19kZXAgPSAwCitpZiBub3QgaGFzX2RlcDoKKyAgICAjIElmIGl0IGRvZXNuJ3QsIGNyZWF0ZSBhIGxvY2FsIHJlcGxhY2VtZW50IHRoYXQgcmVtb3ZlcyBkZXBlbmRzCisgICAgIyBmcm9tIHRoZSBrd2FyZ3MgYmVmb3JlIGNhbGxpbmcgdGhlIHJlZ3VsYXIgY29uc3RydWN0b3IuCisgICAgX0V4dGVuc2lvbiA9IEV4dGVuc2lvbgorICAgIGNsYXNzIEV4dGVuc2lvbihfRXh0ZW5zaW9uKToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHNvdXJjZXMsICoqa3dhcmdzKToKKyAgICAgICAgICAgIGlmIGt3YXJncy5oYXNfa2V5KCdkZXBlbmRzJyk6CisgICAgICAgICAgICAgICAgZGVsIGt3YXJnc1snZGVwZW5kcyddCisgICAgICAgICAgICBhcHBseShfRXh0ZW5zaW9uLl9faW5pdF9fLCAoc2VsZiwgbmFtZSwgc291cmNlcyksIGt3YXJncykKKworCitjcnlwdG9fc3JjID0gWydzcmMvY3J5cHRvL2NyeXB0by5jJywgJ3NyYy9jcnlwdG8veDUwOS5jJywKKyAgICAgICAgICAgICAgJ3NyYy9jcnlwdG8veDUwOW5hbWUuYycsICdzcmMvY3J5cHRvL3BrZXkuYycsCisgICAgICAgICAgICAgICdzcmMvY3J5cHRvL3g1MDlzdG9yZS5jJywgJ3NyYy9jcnlwdG8veDUwOXJlcS5jJywKKyAgICAgICAgICAgICAgJ3NyYy9jcnlwdG8veDUwOWV4dC5jJywgJ3NyYy9jcnlwdG8vcGtjczcuYycsCisgICAgICAgICAgICAgICdzcmMvY3J5cHRvL3BrY3MxMi5jJywgJ3NyYy9jcnlwdG8vbmV0c2NhcGVfc3BraS5jJywKKyAgICAgICAgICAgICAgJ3NyYy91dGlsLmMnXQorY3J5cHRvX2RlcCA9IFsnc3JjL2NyeXB0by9jcnlwdG8uaCcsICdzcmMvY3J5cHRvL3g1MDkuaCcsCisgICAgICAgICAgICAgICdzcmMvY3J5cHRvL3g1MDluYW1lLmgnLCAnc3JjL2NyeXB0by9wa2V5LmgnLAorICAgICAgICAgICAgICAnc3JjL2NyeXB0by94NTA5c3RvcmUuaCcsICdzcmMvY3J5cHRvL3g1MDlyZXEuaCcsCisgICAgICAgICAgICAgICdzcmMvY3J5cHRvL3g1MDlleHQuaCcsICdzcmMvY3J5cHRvL3BrY3M3LmgnLAorICAgICAgICAgICAgICAnc3JjL2NyeXB0by9wa2NzMTIuaCcsICdzcmMvY3J5cHRvL25ldHNjYXBlX3Nwa2kuaCcsCisgICAgICAgICAgICAgICdzcmMvdXRpbC5oJ10KK3JhbmRfc3JjID0gWydzcmMvcmFuZC9yYW5kLmMnLCAnc3JjL3V0aWwuYyddCityYW5kX2RlcCA9IFsnc3JjL3V0aWwuaCddCitzc2xfc3JjID0gWydzcmMvc3NsL2Nvbm5lY3Rpb24uYycsICdzcmMvc3NsL2NvbnRleHQuYycsICdzcmMvc3NsL3NzbC5jJywKKyAgICAgICAgICAgJ3NyYy91dGlsLmMnXQorc3NsX2RlcCA9IFsnc3JjL3NzbC9jb25uZWN0aW9uLmgnLCAnc3JjL3NzbC9jb250ZXh0LmgnLCAnc3JjL3NzbC9zc2wuaCcsCisgICAgICAgICAgICdzcmMvdXRpbC5oJ10KKworSW5jbHVkZURpcnMgPSBOb25lCitMaWJyYXJ5RGlycyA9IE5vbmUKKworIyBBZGQgbW9yZSBwbGF0Zm9ybXMgaGVyZSB3aGVuIG5lZWRlZAoraWYgb3MubmFtZSA9PSAnbnQnIG9yIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgIExpYnJhcmllcyA9IFsnbGliZWF5MzInLCAnc3NsZWF5MzInLCAnV3MyXzMyJ10KK2Vsc2U6CisgICAgTGlicmFyaWVzID0gWydzc2wnLCAnY3J5cHRvJ10KKworaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgIEluY2x1ZGVEaXJzID0gWycvc3cvaW5jbHVkZSddCisgICAgTGlicmFyeURpcnMgPSBbJy9zdy9saWInXQorCitkZWYgbWtFeHRlbnNpb24obmFtZSk6CisgICAgaW1wb3J0IHN0cmluZworICAgIG1vZG5hbWUgPSAnT3BlblNTTC4lcycgJSBuYW1lCisgICAgc3JjID0gZ2xvYmFscygpWyclc19zcmMnICUgc3RyaW5nLmxvd2VyKG5hbWUpXQorICAgIGRlcCA9IGdsb2JhbHMoKVsnJXNfZGVwJyAlIHN0cmluZy5sb3dlcihuYW1lKV0KKyAgICByZXR1cm4gRXh0ZW5zaW9uKG1vZG5hbWUsIHNyYywgbGlicmFyaWVzPUxpYnJhcmllcywgZGVwZW5kcz1kZXAsCisgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnM9SW5jbHVkZURpcnMsIGxpYnJhcnlfZGlycz1MaWJyYXJ5RGlycykKKworc2V0dXAobmFtZT0ncHlPcGVuU1NMJywgdmVyc2lvbj1fX3ZlcnNpb25fXywKKyAgICAgIHBhY2thZ2VfZGlyID0geyAnT3BlblNTTCc6ICcuJyB9LAorICAgICAgZXh0X21vZHVsZXMgPSBbbWtFeHRlbnNpb24oJ2NyeXB0bycpLCBta0V4dGVuc2lvbigncmFuZCcpLCBta0V4dGVuc2lvbignU1NMJyldLAorICAgICAgcHlfbW9kdWxlcyAgPSBbJ09wZW5TU0wuX19pbml0X18nLCAnT3BlblNTTC50c2FmZScsICdPcGVuU1NMLnZlcnNpb24nXSwKKyAgICAgIGRlc2NyaXB0aW9uID0gJ1B5dGhvbiB3cmFwcGVyIG1vZHVsZSBhcm91bmQgdGhlIE9wZW5TU0wgbGlicmFyeScsCisgICAgICBhdXRob3IgPSAnTWFydGluIFNqw7ZncmVuLCBBQiBTdHJha3QnLCBhdXRob3JfZW1haWwgPSAnbXNqb2dyZW5AZ21haWwuY29tJywKKyAgICAgIHVybCA9ICdodHRwOi8vcHlvcGVuc3NsLnNvdXJjZWZvcmdlLm5ldC8nLAorICAgICAgbGljZW5zZSA9ICdMR1BMJywKKyAgICAgIGxvbmdfZGVzY3JpcHRpb24gPSAiIiJcCitIaWdoLWxldmVsIHdyYXBwZXIgYXJvdW5kIGEgc3Vic2V0IG9mIHRoZSBPcGVuU1NMIGxpYnJhcnksIGluY2x1ZGVzCisgKiBTU0wuQ29ubmVjdGlvbiBvYmplY3RzLCB3cmFwcGluZyB0aGUgbWV0aG9kcyBvZiBQeXRob24ncyBwb3J0YWJsZQorICAgc29ja2V0cworICogQ2FsbGJhY2tzIHdyaXR0ZW4gaW4gUHl0aG9uCisgKiBFeHRlbnNpdmUgZXJyb3ItaGFuZGxpbmcgbWVjaGFuaXNtLCBtaXJyb3JpbmcgT3BlblNTTCdzIGVycm9yIGNvZGVzCisuLi4gIGFuZCBtdWNoIG1vcmUgOykiIiIKKyAgICAgKQpkaWZmIC0tZ2l0IGEvc3JjL1JBVElPTkFMRSBiL3NyYy9SQVRJT05BTEUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlMzg5YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9SQVRJT05BTEUKQEAgLTAsMCArMSw2MSBAQAorICBSQVRJT05BTEUKKworVGhlIHJlYXNvbiB0aGlzIG1vZHVsZSBleGlzdHMgYXQgYWxsIGlzIHRoYXQgdGhlIFNTTCBzdXBwb3J0IGluIHRoZSBzb2NrZXQKK21vZHVsZSBpbiB0aGUgUHl0aG9uIDIuMSBkaXN0cmlidXRpb24gKHdoaWNoIGlzIHdoYXQgd2UgdXNlZCwgb2YgY291cnNlIEkKK2Nhbm5vdCBzcGVhayBmb3IgbGF0ZXIgdmVyc2lvbnMpIGlzIHNldmVyZWx5IGxpbWl0ZWQuCisKKzxGSVhNRT4gVXBkYXRlIHRoaXMgbGlzdCB3aGVuZXZlciBuZWVkZWQhIFRoZSBjb21tdW5pY2F0aW9ucyBtb2R1bGUgaXNuJ3QKK3dyaXR0ZW4geWV0LCBzbyB3ZSBkb24ndCBrbm93IGV4YWN0bHkgaG93IHRoaXMnbGwgd29yayEgPC9GSVhNRT4KK1RoaXMgaXMgYSBsaXN0IG9mIHRoaW5ncyB3ZSBuZWVkIGZyb20gYW4gT3BlblNTTCBtb2R1bGU6CisgKyBDb250ZXh0IG9iamVjdHMgKGluIE9wZW5TU0wgY2FsbGVkIFNTTF9DVFgpIHRoYXQgY2FuIGJlIG1hbmlwdWxhdGVkIGZyb20KKyAgIFB5dGhvbiBtb2R1bGVzLiAgVGhleSBtdXN0IHN1cHBvcnQgYSBudW1iZXIgb2Ygb3BlcmF0aW9uczoKKyAgICAgLSBMb2FkaW5nIGNlcnRpZmljYXRlcyBmcm9tIGZpbGUgYW5kIG1lbW9yeSwgYm90aCB0aGUgY2xpZW50CisgICAgICAgY2VydGlmaWNhdGUgYW5kIHRoZSBjZXJ0aWZpY2F0ZXMgdXNlZCBmb3IgdGhlIHZlcmlmaWNhdGlvbiBjaGFpbi4KKyAgICAgLSBMb2FkaW5nIHByaXZhdGUga2V5cyBmcm9tIGZpbGUgYW5kIG1lbW9yeS4KKyAgICAgLSBTZXR0aW5nIHRoZSB2ZXJpZmljYXRpb24gbW9kZSAoYmFzaWNhbGx5IFZFUklGWV9OT05FIGFuZAorICAgICAgIFZFUklGWV9QRUVSKS4KKyAgICAgLSBDYWxsYmFja3MgbWVjaGFuaXNtIGZvciBwcm9tcHRpbmcgZm9yIHBhc3MgcGhyYXNlcyBhbmQgdmVyaWZ5aW5nCisgICAgICAgY2VydGlmaWNhdGVzLiAgVGhlIGNhbGxiYWNrcyBoYXZlIHRvIHdvcmsgdW5kZXIgYSBtdWx0aS10aHJlYWRlZAorICAgICAgIGVudmlyb25tZW50IChzZWUgdGhlIGNvbW1lbnQgaW4gc3NsL2NvbnRleHQuYykuICBPZiBjb3Vyc2UgdGhlCisgICAgICAgY2FsbGJhY2tzIHdpbGwgaGF2ZSB0byBiZSB3cml0dGVuIGluIFB5dGhvbiEKKyArIFRoZSBDb25uZWN0aW9uIG9iamVjdHMgKGluIE9wZW5TU0wgY2FsbGVkIFNTTCkgaGF2ZSB0byBzdXBwb3J0IGEgZmV3CisgICB0aGluZ3M6CisgICAgIC0gUmVuZWdvdGlhdGlvbiwgdGhpcyBpcyByZWFsbHkgaW1wb3J0YW50LCBlc3BlY2lhbGx5IGZvciBjb25uZWN0aW9ucworICAgICAgIHRoYXQgYXJlIHVwIGFuZCBydW5uaW5nIGZvciBhIGxvbmcgdGltZSwgc2luY2UgcmVuZWdvdGlhdGlvbgorICAgICAgIGdlbmVyYXRlcyBuZXcgZW5jcnlwdGlvbiBrZXlzLgorICAgICAtIFNlcnZlci1zaWRlIFNTTCBtdXN0IHdvcmshICBBcyBmYXIgYXMgSSBrbm93IHRoaXMgZG9lc24ndCB3b3JrIGluCisgICAgICAgdGhlIFNTTCBzdXBwb3J0IG9mIHRoZSBzb2NrZXQgbW9kdWxlIGFzIG9mIFB5dGhvbiAyLjEuCisgICAgIC0gV3JhcHBpbmcgdGhlIG1ldGhvZHMgb2YgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IG9iamVjdCBpcyBuaWNlLCBzbworICAgICAgIHlvdSBkb24ndCBoYXZlIHRvIGtlZXAgdHJhY2sgb2YgbW9yZSB0aGFuIG9uZSBvYmplY3QgcGVyIGNvbm5lY3Rpb24uCisgICAgICAgVGhpcyBjb3VsZCBvZiBjb3Vyc2UgYmUgZG9uZSBhIGxvdCBiZXR0ZXIgdGhhbiB0aGUgd2F5IGl0IHdvcmtzIG5vdywKKyAgICAgICBzbyBtb3JlIHRyYW5zcG9ydCBsYXllcnMgdGhhbiBzb2NrZXRzIGFyZSBwb3NzaWJsZSEKKyArIEEgd2VsbC1vcmdhbml6ZWQgZXJyb3Igc3lzdGVtIHRoYXQgbWltaWNzIE9wZW5TU0wncyBlcnJvciBzeXN0ZW0gaXMKKyAgIGRlc2lyZWFibGUuICBTcGVjaWZpY2FsbHkgdGhlcmUgaGFzIHRvIGJlIGEgd2F5IHRvIGZpbmQgb3V0IHdldGhlciB0aGUKKyAgIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgb3IgaWYgaXQgZmFpbGVkLCB3aHkgaXQgZmFpbGVkLCBzbyBzb21lIHNvcnQKKyAgIG9mIGludGVyZmFjZSB0byBPcGVuU1NMJ3MgZXJyb3IgcXVldWUgbWVjaGFuaXNtIGlzIG5lZWRlZC4KKyArIENlcnRpZmljYXRlIG9iamVjdHMgKFg1MDkpIGFuZCBjZXJ0aWZpY2F0ZSBuYW1lIG9iamVjdHMgKFg1MDlfTkFNRSkgYXJlCisgICBuZWVkZWQsIGVzcGVjaWFsbHkgZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3Nlcy4gIENlcnRpZmljYXRlcyB3aWxsCisgICBwcm9iYWJseSBhbHNvIGJlIGdlbmVyYXRlZCBieSB0aGUgc2VydmVyIHdoaWNoIGlzIGFub3RoZXIgcmVhc29uIGZvcgorICAgdGhlbSB0byBleGlzdC4gVGhlIHNhbWUgdGhpbmcgZ29lcyBmb3Iga2V5IG9iamVjdHMgKEVWUF9QS0VZKQorICsgU2luY2UgdGhpcyBpcyBhbiBPcGVuU1NMIG1vZHVsZSwgdGhlcmUgaGFzIHRvIGJlIGFuIGludGVyZmFjZSB0byB0aGUKKyAgIE9wZW5TU0wgUFJORywgc28gaXQgY2FuIGJlIHNlZWRlZCBpbiBhIGdvb2Qgd2F5LgorCitXaGVuIGFza2luZyBhYm91dCBTU0wgb24gdGhlIGNvbXAubGFuZy5weXRob24gbmV3c2dyb3VwIChvciBvbgorcHl0aG9uLWxpc3RAcHl0aG9uLm9yZykgcGVvcGxlIHVzdWFsbHkgcG9pbnRlZCB5b3UgdG8gdGhlIE0yQ3J5cHRvIHBhY2thZ2UuCitUaGUgTTJDcnlwdG8uU1NMIG1vZHVsZSBkb2VzIGltcGxlbWVudCBhIGxvdCBvZiBPcGVuU1NMJ3MgZnVuY3Rpb25hbGl0eSBidXQKK3VuZm9ydHVuYXRlbHkgaXRzIGVycm9yIGhhbmRsaW5nIHN5c3RlbSBkb2VzIG5vdCBzZWVtIHRvIGJlIGZpbmlzaGVkLAorZXNwZWNpYWxseSBmb3Igbm9uLWJsb2NraW5nIEkvTy4gIEkgdGhpbmsgdGhhdCBtdWNoIG9mIHRoZSByZWFzb24gZm9yIHRoaXMKK2lzIHRoYXQgTTJDcnlwdG8gaXMgZGV2ZWxvcGVkIHVzaW5nIFNXSUcuICBUaGlzIG1ha2VzIGl0IGF3a3dhcmQgdG8gY3JlYXRlCitmdW5jdGlvbnMgdGhhdCBlLmcuIGNhbiByZXR1cm4gYm90aCBhbiBpbnRlZ2VyIGFuZCBOVUxMIHNpbmNlIChhcyBmYXIgYXMgSQora25vdykgeW91IGJhc2ljYWxseSB3cml0ZSBDIGZ1bmN0aW9ucyBhbmQgU1dJRyBtYWtlcyB3cmFwcGVyIGZ1bmN0aW9ucyB0aGF0CitwYXJzZXMgdGhlIFB5dGhvbiBhcmd1bWVudCBsaXN0IGFuZCBjYWxscyB5b3VyIEMgZnVuY3Rpb24sIGFuZCBmaW5hbGx5Cit0cmFuc2Zvcm1zIHlvdXIgcmV0dXJuIHZhbHVlIHRvIGEgUHl0aG9uIG9iamVjdC4KKworRmluYWxseSwgYSBnb29kIGJvb2sgb24gdGhlIHRvcGljIG9mIFNTTCAodGhhdCBJIHJlYWQgYW5kIGxlYXJuZWQgYSBsb3QKK2Zyb20pIGlzICJTU0wgYW5kIFRMUyAtIERlc2lnbmluZyBhbmQgQnVpbGRpbmcgU2VjdXJlIFN5c3RlbXMiIChJU0JOCiswMjAxNjE1OTgzKSBieSBFcmljIFJlc2NvcmxhLiBBIGdvb2QgbWFpbGluZ2xpc3QgdG8gc3Vic2NyaWJlIHRvIGlzIHRoZQorb3BlbnNzbC11c2Vyc0BvcGVuc3NsLm9yZyBsaXN0LgorCitUaGlzIGNvbW1lbnQgd2FzIHdyaXR0ZW4gSnVseSAyMDAxLCBkaXNjdXNzaW5nIFB5dGhvbiAyLjEuICBGZWVsIGZyZWUgdG8KK21vZGlmeSBpdCBhcyB0aGUgU1NMIHN1cHBvcnQgaW4gdGhlIHNvY2tldCBtb2R1bGUgY2hhbmdlcy4KKwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9jcnlwdG8uYyBiL3NyYy9jcnlwdG8vY3J5cHRvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlZDViYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jcnlwdG8vY3J5cHRvLmMKQEAgLTAsMCArMSw3MzggQEAKKy8qCisgKiBjcnlwdG8uYworICoKKyAqIENvcHlyaWdodCAoQykgQUIgU3RyYWt0IDIwMDEsIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBNYWluIGZpbGUgb2YgY3J5cHRvIHN1YiBtb2R1bGUuCisgKiBTZWUgdGhlIGZpbGUgUkFUSU9OQUxFIGZvciBhIHNob3J0IGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIG1vZHVsZSB3YXMgd3JpdHRlbi4KKyAqCisgKiBSZXZpZXdlZCAyMDAxLTA3LTIzCisgKi8KKyNpbmNsdWRlIDxQeXRob24uaD4KKyNkZWZpbmUgY3J5cHRvX01PRFVMRQorI2luY2x1ZGUgImNyeXB0by5oIgorCitzdGF0aWMgY2hhciBjcnlwdG9fZG9jW10gPSAiXG5cCitNYWluIGZpbGUgb2YgY3J5cHRvIHN1YiBtb2R1bGUuXG5cCitTZWUgdGhlIGZpbGUgUkFUSU9OQUxFIGZvciBhIHNob3J0IGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIG1vZHVsZSB3YXMgd3JpdHRlbi5cblwKKyI7CisKK3N0YXRpYyBjaGFyICpDVlNpZCA9ICJAKCMpICRJZDogY3J5cHRvLmMsdiAxLjI4IDIwMDQvMDgvMDkgMTQ6NTY6MDUgbWFydGluIEV4cCAkIjsKKwordm9pZCAqKnNzbF9BUEk7CisKK1B5T2JqZWN0ICpjcnlwdG9fRXJyb3I7CisKK3N0YXRpYyBpbnQKK2dsb2JhbF9wYXNzcGhyYXNlX2NhbGxiYWNrKGNoYXIgKmJ1ZiwgaW50IGxlbiwgaW50IHJ3ZmxhZywgdm9pZCAqY2JfYXJnKQoreworICAgIFB5T2JqZWN0ICpmdW5jLCAqYXJndiwgKnJldDsKKyAgICBpbnQgbmNoYXJzOworCisgICAgZnVuYyA9IChQeU9iamVjdCAqKWNiX2FyZzsKKyAgICBhcmd2ID0gUHlfQnVpbGRWYWx1ZSgiKGkpIiwgcndmbGFnKTsKKyAgICByZXQgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmd2KTsKKyAgICBQeV9ERUNSRUYoYXJndik7CisgICAgaWYgKHJldCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHJldCkpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIlN0cmluZyBleHBlY3RlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbmNoYXJzID0gUHlTdHJpbmdfU2l6ZShyZXQpOworICAgIGlmIChuY2hhcnMgPiBsZW4pCisgICAgICAgIG5jaGFycyA9IGxlbjsKKyAgICBzdHJuY3B5KGJ1ZiwgUHlTdHJpbmdfQXNTdHJpbmcocmV0KSwgbmNoYXJzKTsKKyAgICByZXR1cm4gbmNoYXJzOworfQorCitzdGF0aWMgY2hhciBjcnlwdG9fbG9hZF9wcml2YXRla2V5X2RvY1tdID0gIlxuXAorTG9hZCBhIHByaXZhdGUga2V5IGZyb20gYSBidWZmZXJcblwKK1xuXAorQXJndW1lbnRzOiBzcGFtIC0gQWx3YXlzIE5VTExcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZTpcblwKKyAgICAgICAgICAgICB0eXBlICAgICAgIC0gVGhlIGZpbGUgdHlwZSAob25lIG9mIEZJTEVUWVBFX1BFTSwgRklMRVRZUEVfQVNOMSlcblwKKyAgICAgICAgICAgICBidWZmZXIgICAgIC0gVGhlIGJ1ZmZlciB0aGUga2V5IGlzIHN0b3JlZCBpblxuXAorICAgICAgICAgICAgIHBhc3NwaHJhc2UgLSAob3B0aW9uYWwpIGlmIGVuY3J5cHRlZCBQRU0gZm9ybWF0LCB0aGlzIGNhbiBiZVxuXAorICAgICAgICAgICAgICAgICAgICAgICAgICBlaXRoZXIgdGhlIHBhc3NwaHJhc2UgdG8gdXNlLCBvciBhIGNhbGxiYWNrIGZvclxuXAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRpbmcgdGhlIHBhc3NwaHJhc2UuXG5cCitSZXR1cm5zOiAgIFRoZSBQS2V5IG9iamVjdFxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK2NyeXB0b19sb2FkX3ByaXZhdGVrZXkoUHlPYmplY3QgKnNwYW0sIFB5T2JqZWN0ICphcmdzKQoreworICAgIGNyeXB0b19QS2V5T2JqICpjcnlwdG9fUEtleV9OZXcoRVZQX1BLRVkgKiwgaW50KTsKKyAgICBpbnQgdHlwZSwgbGVuOworICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICBQeU9iamVjdCAqcHcgPSBOVUxMOworICAgIHBlbV9wYXNzd29yZF9jYiAqY2IgPSBOVUxMOworICAgIHZvaWQgKmNiX2FyZyA9IE5VTEw7CisgICAgQklPICpiaW87CisgICAgRVZQX1BLRVkgKnBrZXk7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzI3xPOmxvYWRfcHJpdmF0ZWtleSIsICZ0eXBlLCAmYnVmZmVyLCAmbGVuLCAmcHcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChwdyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHB3KSkKKyAgICAgICAgeworICAgICAgICAgICAgY2IgPSBOVUxMOworICAgICAgICAgICAgY2JfYXJnID0gUHlTdHJpbmdfQXNTdHJpbmcocHcpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFB5Q2FsbGFibGVfQ2hlY2socHcpKQorICAgICAgICB7CisgICAgICAgICAgICBjYiA9IGdsb2JhbF9wYXNzcGhyYXNlX2NhbGxiYWNrOworICAgICAgICAgICAgY2JfYXJnID0gcHc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTGFzdCBhcmd1bWVudCBtdXN0IGJlIHN0cmluZyBvciBjYWxsYWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiaW8gPSBCSU9fbmV3X21lbV9idWYoYnVmZmVyLCBsZW4pOworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgWDUwOV9GSUxFVFlQRV9QRU06CisgICAgICAgICAgICBwa2V5ID0gUEVNX3JlYWRfYmlvX1ByaXZhdGVLZXkoYmlvLCBOVUxMLCBjYiwgY2JfYXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWDUwOV9GSUxFVFlQRV9BU04xOgorICAgICAgICAgICAgcGtleSA9IGQyaV9Qcml2YXRlS2V5X2JpbyhiaW8sIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAidHlwZSBhcmd1bWVudCBtdXN0IGJlIEZJTEVUWVBFX1BFTSBvciBGSUxFVFlQRV9BU04xIik7CisgICAgICAgICAgICBCSU9fZnJlZShiaW8pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIEJJT19mcmVlKGJpbyk7CisKKyAgICBpZiAocGtleSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNyeXB0b19QS2V5X05ldyhwa2V5LCAxKTsKK30KKworc3RhdGljIGNoYXIgY3J5cHRvX2R1bXBfcHJpdmF0ZWtleV9kb2NbXSA9ICJcblwKK0R1bXAgYSBwcml2YXRlIGtleSB0byBhIGJ1ZmZlclxuXAorXG5cCitBcmd1bWVudHM6IHNwYW0gLSBBbHdheXMgTlVMTFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlOlxuXAorICAgICAgICAgICAgIHR5cGUgICAgICAgLSBUaGUgZmlsZSB0eXBlIChvbmUgb2YgRklMRVRZUEVfUEVNLCBGSUxFVFlQRV9BU04xKVxuXAorICAgICAgICAgICAgIHBrZXkgICAgICAgLSBUaGUgUEtleSB0byBkdW1wXG5cCisgICAgICAgICAgICAgY2lwaGVyICAgICAtIChvcHRpb25hbCkgaWYgZW5jcnlwdGVkIFBFTSBmb3JtYXQsIHRoZSBjaXBoZXIgdG9cblwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlXG5cCisgICAgICAgICAgICAgcGFzc3BocmFzZSAtIChvcHRpb25hbCkgaWYgZW5jcnlwdGVkIFBFTSBmb3JtYXQsIHRoaXMgY2FuIGJlIGVpdGhlclxuXAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFzc3BocmFzZSB0byB1c2UsIG9yIGEgY2FsbGJhY2sgZm9yIHByb3ZpZGluZyB0aGVcblwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3BocmFzZS5cblwKK1JldHVybnM6ICAgVGhlIGJ1ZmZlciB3aXRoIHRoZSBkdW1wZWQga2V5IGluXG5cCisiOworCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX2R1bXBfcHJpdmF0ZWtleShQeU9iamVjdCAqc3BhbSwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaW50IHR5cGUsIHJldCwgYnVmX2xlbjsKKyAgICBjaGFyICp0ZW1wOworICAgIFB5T2JqZWN0ICpidWZmZXI7CisgICAgY2hhciAqY2lwaGVyX25hbWUgPSBOVUxMOworICAgIGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciA9IE5VTEw7CisgICAgUHlPYmplY3QgKnB3ID0gTlVMTDsKKyAgICBwZW1fcGFzc3dvcmRfY2IgKmNiID0gTlVMTDsKKyAgICB2b2lkICpjYl9hcmcgPSBOVUxMOworICAgIEJJTyAqYmlvOworICAgIGNyeXB0b19QS2V5T2JqICpwa2V5OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTyF8c086ZHVtcF9wcml2YXRla2V5IiwgJnR5cGUsCisJCQkgICZjcnlwdG9fUEtleV9UeXBlLCAmcGtleSwgJmNpcGhlcl9uYW1lLCAmcHcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChjaXBoZXJfbmFtZSAhPSBOVUxMICYmIHB3ID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIklsbGVnYWwgbnVtYmVyIG9mIGFyZ3VtZW50cyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGNpcGhlcl9uYW1lICE9IE5VTEwpCisgICAgeworICAgICAgICBjaXBoZXIgPSBFVlBfZ2V0X2NpcGhlcmJ5bmFtZShjaXBoZXJfbmFtZSk7CisgICAgICAgIGlmIChjaXBoZXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJJbnZhbGlkIGNpcGhlciBuYW1lIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2socHcpKQorICAgICAgICB7CisgICAgICAgICAgICBjYiA9IE5VTEw7CisgICAgICAgICAgICBjYl9hcmcgPSBQeVN0cmluZ19Bc1N0cmluZyhwdyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoUHlDYWxsYWJsZV9DaGVjayhwdykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNiID0gZ2xvYmFsX3Bhc3NwaHJhc2VfY2FsbGJhY2s7CisgICAgICAgICAgICBjYl9hcmcgPSBwdzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJMYXN0IGFyZ3VtZW50IG11c3QgYmUgc3RyaW5nIG9yIGNhbGxhYmxlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJpbyA9IEJJT19uZXcoQklPX3NfbWVtKCkpOworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgWDUwOV9GSUxFVFlQRV9QRU06CisgICAgICAgICAgICByZXQgPSBQRU1fd3JpdGVfYmlvX1ByaXZhdGVLZXkoYmlvLCBwa2V5LT5wa2V5LCBjaXBoZXIsIE5VTEwsIDAsIGNiLCBjYl9hcmcpOworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQklPX2ZyZWUoYmlvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWDUwOV9GSUxFVFlQRV9BU04xOgorICAgICAgICAgICAgcmV0ID0gaTJkX1ByaXZhdGVLZXlfYmlvKGJpbywgcGtleS0+cGtleSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJ0eXBlIGFyZ3VtZW50IG11c3QgYmUgRklMRVRZUEVfUEVNIG9yIEZJTEVUWVBFX0FTTjEiKTsKKyAgICAgICAgICAgIEJJT19mcmVlKGJpbyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAocmV0ID09IDApCisgICAgeworICAgICAgICBCSU9fZnJlZShiaW8pOworICAgICAgICBleGNlcHRpb25fZnJvbV9lcnJvcl9xdWV1ZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBidWZfbGVuID0gQklPX2dldF9tZW1fZGF0YShiaW8sICZ0ZW1wKTsKKyAgICBidWZmZXIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh0ZW1wLCBidWZfbGVuKTsKKyAgICBCSU9fZnJlZShiaW8pOworCisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIGNoYXIgY3J5cHRvX2xvYWRfY2VydGlmaWNhdGVfZG9jW10gPSAiXG5cCitMb2FkIGEgY2VydGlmaWNhdGUgZnJvbSBhIGJ1ZmZlclxuXAorXG5cCitBcmd1bWVudHM6IHNwYW0gLSBBbHdheXMgTlVMTFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlOlxuXAorICAgICAgICAgICAgIHR5cGUgICAtIFRoZSBmaWxlIHR5cGUgKG9uZSBvZiBGSUxFVFlQRV9QRU0sIEZJTEVUWVBFX0FTTjEpXG5cCisgICAgICAgICAgICAgYnVmZmVyIC0gVGhlIGJ1ZmZlciB0aGUgY2VydGlmaWNhdGUgaXMgc3RvcmVkIGluXG5cCitSZXR1cm5zOiAgIFRoZSBYNTA5IG9iamVjdFxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK2NyeXB0b19sb2FkX2NlcnRpZmljYXRlKFB5T2JqZWN0ICpzcGFtLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjcnlwdG9fWDUwOU9iaiAqY3J5cHRvX1g1MDlfTmV3KFg1MDkgKiwgaW50KTsKKyAgICBpbnQgdHlwZSwgbGVuOworICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICBCSU8gKmJpbzsKKyAgICBYNTA5ICpjZXJ0OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpcyM6bG9hZF9jZXJ0aWZpY2F0ZSIsICZ0eXBlLCAmYnVmZmVyLCAmbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBiaW8gPSBCSU9fbmV3X21lbV9idWYoYnVmZmVyLCBsZW4pOworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgWDUwOV9GSUxFVFlQRV9QRU06CisgICAgICAgICAgICBjZXJ0ID0gUEVNX3JlYWRfYmlvX1g1MDkoYmlvLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWDUwOV9GSUxFVFlQRV9BU04xOgorICAgICAgICAgICAgY2VydCA9IGQyaV9YNTA5X2JpbyhiaW8sIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAidHlwZSBhcmd1bWVudCBtdXN0IGJlIEZJTEVUWVBFX1BFTSBvciBGSUxFVFlQRV9BU04xIik7CisgICAgICAgICAgICBCSU9fZnJlZShiaW8pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIEJJT19mcmVlKGJpbyk7CisKKyAgICBpZiAoY2VydCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNyeXB0b19YNTA5X05ldyhjZXJ0LCAxKTsKK30KKworc3RhdGljIGNoYXIgY3J5cHRvX2R1bXBfY2VydGlmaWNhdGVfZG9jW10gPSAiXG5cCitEdW1wIGEgY2VydGlmaWNhdGUgdG8gYSBidWZmZXJcblwKK1xuXAorQXJndW1lbnRzOiBzcGFtIC0gQWx3YXlzIE5VTExcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZTpcblwKKyAgICAgICAgICAgICB0eXBlIC0gVGhlIGZpbGUgdHlwZSAob25lIG9mIEZJTEVUWVBFX1BFTSwgRklMRVRZUEVfQVNOMSlcblwKKyAgICAgICAgICAgICBjZXJ0IC0gVGhlIGNlcnRpZmljYXRlIHRvIGR1bXBcblwKK1JldHVybnM6ICAgVGhlIGJ1ZmZlciB3aXRoIHRoZSBkdW1wZWQgY2VydGlmaWNhdGUgaW5cblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fZHVtcF9jZXJ0aWZpY2F0ZShQeU9iamVjdCAqc3BhbSwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaW50IHR5cGUsIHJldCwgYnVmX2xlbjsKKyAgICBjaGFyICp0ZW1wOworICAgIFB5T2JqZWN0ICpidWZmZXI7CisgICAgQklPICpiaW87CisgICAgY3J5cHRvX1g1MDlPYmogKmNlcnQ7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPITpkdW1wX2NlcnRpZmljYXRlIiwgJnR5cGUsCisJCQkgICZjcnlwdG9fWDUwOV9UeXBlLCAmY2VydCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgYmlvID0gQklPX25ldyhCSU9fc19tZW0oKSk7CisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBYNTA5X0ZJTEVUWVBFX1BFTToKKyAgICAgICAgICAgIHJldCA9IFBFTV93cml0ZV9iaW9fWDUwOShiaW8sIGNlcnQtPng1MDkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBYNTA5X0ZJTEVUWVBFX0FTTjE6CisgICAgICAgICAgICByZXQgPSBpMmRfWDUwOV9iaW8oYmlvLCBjZXJ0LT54NTA5KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInR5cGUgYXJndW1lbnQgbXVzdCBiZSBGSUxFVFlQRV9QRU0gb3IgRklMRVRZUEVfQVNOMSIpOworICAgICAgICAgICAgQklPX2ZyZWUoYmlvKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChyZXQgPT0gMCkKKyAgICB7CisgICAgICAgIEJJT19mcmVlKGJpbyk7CisgICAgICAgIGV4Y2VwdGlvbl9mcm9tX2Vycm9yX3F1ZXVlKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGJ1Zl9sZW4gPSBCSU9fZ2V0X21lbV9kYXRhKGJpbywgJnRlbXApOworICAgIGJ1ZmZlciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHRlbXAsIGJ1Zl9sZW4pOworICAgIEJJT19mcmVlKGJpbyk7CisKKyAgICByZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgY2hhciBjcnlwdG9fbG9hZF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0X2RvY1tdID0gIlxuXAorTG9hZCBhIGNlcnRpZmljYXRlIHJlcXVlc3QgZnJvbSBhIGJ1ZmZlclxuXAorXG5cCitBcmd1bWVudHM6IHNwYW0gLSBBbHdheXMgTlVMTFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlOlxuXAorICAgICAgICAgICAgIHR5cGUgICAtIFRoZSBmaWxlIHR5cGUgKG9uZSBvZiBGSUxFVFlQRV9QRU0sIEZJTEVUWVBFX0FTTjEpXG5cCisgICAgICAgICAgICAgYnVmZmVyIC0gVGhlIGJ1ZmZlciB0aGUgY2VydGlmaWNhdGUgcmVxdWVzdCBpcyBzdG9yZWQgaW5cblwKK1JldHVybnM6ICAgVGhlIFg1MDlSZXEgb2JqZWN0XG5cCisiOworCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX2xvYWRfY2VydGlmaWNhdGVfcmVxdWVzdChQeU9iamVjdCAqc3BhbSwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY3J5cHRvX1g1MDlSZXFPYmogKmNyeXB0b19YNTA5UmVxX05ldyhYNTA5X1JFUSAqLCBpbnQpOworICAgIGludCB0eXBlLCBsZW47CisgICAgY2hhciAqYnVmZmVyOworICAgIEJJTyAqYmlvOworICAgIFg1MDlfUkVRICpyZXE7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzIzpsb2FkX2NlcnRpZmljYXRlX3JlcXVlc3QiLCAmdHlwZSwgJmJ1ZmZlciwgJmxlbikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgYmlvID0gQklPX25ld19tZW1fYnVmKGJ1ZmZlciwgbGVuKTsKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgICBjYXNlIFg1MDlfRklMRVRZUEVfUEVNOgorICAgICAgICAgICAgcmVxID0gUEVNX3JlYWRfYmlvX1g1MDlfUkVRKGJpbywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFg1MDlfRklMRVRZUEVfQVNOMToKKyAgICAgICAgICAgIHJlcSA9IGQyaV9YNTA5X1JFUV9iaW8oYmlvLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInR5cGUgYXJndW1lbnQgbXVzdCBiZSBGSUxFVFlQRV9QRU0gb3IgRklMRVRZUEVfQVNOMSIpOworICAgICAgICAgICAgQklPX2ZyZWUoYmlvKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBCSU9fZnJlZShiaW8pOworCisgICAgaWYgKHJlcSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNyeXB0b19YNTA5UmVxX05ldyhyZXEsIDEpOworfQorCitzdGF0aWMgY2hhciBjcnlwdG9fZHVtcF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0X2RvY1tdID0gIlxuXAorRHVtcCBhIGNlcnRpZmljYXRlIHJlcXVlc3QgdG8gYSBidWZmZXJcblwKK1xuXAorQXJndW1lbnRzOiBzcGFtIC0gQWx3YXlzIE5VTExcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZTpcblwKKyAgICAgICAgICAgICB0eXBlIC0gVGhlIGZpbGUgdHlwZSAob25lIG9mIEZJTEVUWVBFX1BFTSwgRklMRVRZUEVfQVNOMSlcblwKKyAgICAgICAgICAgICByZXEgIC0gVGhlIGNlcnRpZmljYXRlIHJlcXVlc3QgdG8gZHVtcFxuXAorUmV0dXJuczogICBUaGUgYnVmZmVyIHdpdGggdGhlIGR1bXBlZCBjZXJ0aWZpY2F0ZSByZXF1ZXN0IGluXG5cCisiOworCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX2R1bXBfY2VydGlmaWNhdGVfcmVxdWVzdChQeU9iamVjdCAqc3BhbSwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaW50IHR5cGUsIHJldCwgYnVmX2xlbjsKKyAgICBjaGFyICp0ZW1wOworICAgIFB5T2JqZWN0ICpidWZmZXI7CisgICAgQklPICpiaW87CisgICAgY3J5cHRvX1g1MDlSZXFPYmogKnJlcTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU8hOmR1bXBfY2VydGlmaWNhdGVfcmVxdWVzdCIsICZ0eXBlLAorCQkJICAmY3J5cHRvX1g1MDlSZXFfVHlwZSwgJnJlcSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgYmlvID0gQklPX25ldyhCSU9fc19tZW0oKSk7CisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBYNTA5X0ZJTEVUWVBFX1BFTToKKyAgICAgICAgICAgIHJldCA9IFBFTV93cml0ZV9iaW9fWDUwOV9SRVEoYmlvLCByZXEtPng1MDlfcmVxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWDUwOV9GSUxFVFlQRV9BU04xOgorICAgICAgICAgICAgcmV0ID0gaTJkX1g1MDlfUkVRX2JpbyhiaW8sIHJlcS0+eDUwOV9yZXEpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAidHlwZSBhcmd1bWVudCBtdXN0IGJlIEZJTEVUWVBFX1BFTSBvciBGSUxFVFlQRV9BU04xIik7CisgICAgICAgICAgICBCSU9fZnJlZShiaW8pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKHJldCA9PSAwKQorICAgIHsKKyAgICAgICAgQklPX2ZyZWUoYmlvKTsKKyAgICAgICAgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgYnVmX2xlbiA9IEJJT19nZXRfbWVtX2RhdGEoYmlvLCAmdGVtcCk7CisgICAgYnVmZmVyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodGVtcCwgYnVmX2xlbik7CisgICAgQklPX2ZyZWUoYmlvKTsKKworICAgIHJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyBjaGFyIGNyeXB0b19sb2FkX3BrY3M3X2RhdGFfZG9jW10gPSAiXG5cCitMb2FkIHBrY3M3IGRhdGEgZnJvbSBhIGJ1ZmZlclxuXAorXG5cCitBcmd1bWVudHM6IHNwYW0gLSBBbHdheXMgTlVMTFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAgdHlwZSAtIFRoZSBmaWxlIHR5cGUgKG9uZSBvZiBGSUxFVFlQRV9QRU0gb3IgRklMRVRZUEVfQVNOMSlcblwKKyAgICAgICAgICAgICBidWZmZXIgLSBUaGUgYnVmZmVyIHdpdGggdGhlIHBrY3M3IGRhdGEuXG5cCitSZXR1cm5zOiBUaGUgUEtDUzcgb2JqZWN0XG5cCisiOworCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX2xvYWRfcGtjczdfZGF0YShQeU9iamVjdCAqc3BhbSwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaW50IHR5cGUsIGxlbjsKKyAgICBjaGFyICpidWZmZXI7CisgICAgQklPICpiaW87CisgICAgUEtDUzcgKnBrY3M3ID0gTlVMTDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXMjOmxvYWRfcGtjczdfZGF0YSIsICZ0eXBlLCAmYnVmZmVyLCAmbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiAKKyAgICAgKiBUcnkgdG8gcmVhZCB0aGUgcGtjczcgZGF0YSBmcm9tIHRoZSBiaW8gCisgICAgICovCisgICAgYmlvID0gQklPX25ld19tZW1fYnVmKGJ1ZmZlciwgbGVuKTsKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgICBjYXNlIFg1MDlfRklMRVRZUEVfUEVNOgorICAgICAgICAgICAgcGtjczcgPSBQRU1fcmVhZF9iaW9fUEtDUzcoYmlvLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgWDUwOV9GSUxFVFlQRV9BU04xOgorICAgICAgICAgICAgcGtjczcgPSBkMmlfUEtDUzdfYmlvKGJpbywgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIGFyZ3VtZW50IG11c3QgYmUgRklMRVRZUEVfUEVNIG9yIEZJTEVUWVBFX0FTTjEiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBCSU9fZnJlZShiaW8pOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB3ZSBnb3QgYSBQS0NTNyBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBpZiAocGtjczcgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGV4Y2VwdGlvbl9mcm9tX2Vycm9yX3F1ZXVlKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiAoUHlPYmplY3QgKiljcnlwdG9fUEtDUzdfTmV3KHBrY3M3LCAxKTsKK30KKworc3RhdGljIGNoYXIgY3J5cHRvX2xvYWRfcGtjczEyX2RvY1tdID0gIlxuXAorTG9hZCBhIFBLQ1MxMiBvYmplY3QgZnJvbSBhIGJ1ZmZlclxuXAorXG5cCitBcmd1bWVudHM6IHNwYW0gLSBBbHdheXMgTlVMTFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlOlxuXAorICAgICAgICAgICAgIGJ1ZmZlciAtIFRoZSBidWZmZXIgdGhlIGNlcnRpZmljYXRlIGlzIHN0b3JlZCBpblxuXAorICAgICAgICAgICAgIHBhc3NwaHJhc2UgKE9wdGlvbmFsKSAtIFRoZSBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSBQS0NTMTIgbHVtcFxuXAorUmV0dXJuczogICBUaGUgUEtDUzEyIG9iamVjdFxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK2NyeXB0b19sb2FkX3BrY3MxMihQeU9iamVjdCAqc3BhbSwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY3J5cHRvX1BLQ1MxMk9iaiAqY3J5cHRvX1BLQ1MxMl9OZXcoUEtDUzEyICosIGNoYXIgKik7CisgICAgaW50IGxlbjsKKyAgICBjaGFyICpidWZmZXIsICpwYXNzcGhyYXNlID0gTlVMTDsKKyAgICBCSU8gKmJpbzsKKyAgICBQS0NTMTIgKnAxMjsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8czpsb2FkX3BrY3MxMiIsICZidWZmZXIsICZsZW4sICZwYXNzcGhyYXNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBiaW8gPSBCSU9fbmV3X21lbV9idWYoYnVmZmVyLCBsZW4pOworICAgIGlmICgocDEyID0gZDJpX1BLQ1MxMl9iaW8oYmlvLCBOVUxMKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICBCSU9fZnJlZShiaW8pOworICAgICAgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUoKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBCSU9fZnJlZShiaW8pOworCisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNyeXB0b19QS0NTMTJfTmV3KHAxMiwgcGFzc3BocmFzZSk7Cit9CisKKworc3RhdGljIGNoYXIgY3J5cHRvX1g1MDlfZG9jW10gPSAiXG5cCitUaGUgZmFjdG9yeSBmdW5jdGlvbiBpbnNlcnRlZCBpbiB0aGUgbW9kdWxlIGRpY3Rpb25hcnkgdG8gY3JlYXRlIFg1MDlcblwKK29iamVjdHNcblwKK1xuXAorQXJndW1lbnRzOiBzcGFtIC0gQWx3YXlzIE5VTExcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZSBlbXB0eVxuXAorUmV0dXJuczogICBUaGUgWDUwOSBvYmplY3RcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fWDUwOShQeU9iamVjdCAqc3BhbSwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6WDUwOSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiAoUHlPYmplY3QgKiljcnlwdG9fWDUwOV9OZXcoWDUwOV9uZXcoKSwgMSk7Cit9CisKK3N0YXRpYyBjaGFyIGNyeXB0b19YNTA5TmFtZV9kb2NbXSA9ICJcblwKK1RoZSBmYWN0b3J5IGZ1bmN0aW9uIGluc2VydGVkIGluIHRoZSBtb2R1bGUgZGljdGlvbmFyeSBhcyBhIGNvcHlcblwKK2NvbnN0cnVjdG9yIGZvciBYNTA5TmFtZSBvYmplY3RzLlxuXAorXG5cCitBcmd1bWVudHM6IHNwYW0gLSBBbHdheXMgTlVMTFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlOlxuXAorICAgICAgICAgICAgIG5hbWUgLSBBbiBYNTA5TmFtZSBvYmplY3QgdG8gY29weVxuXAorUmV0dXJuczogICBUaGUgWDUwOU5hbWUgb2JqZWN0XG5cCisiOworCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX1g1MDlOYW1lKFB5T2JqZWN0ICpzcGFtLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjcnlwdG9fWDUwOU5hbWVPYmogKm5hbWU7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOlg1MDlOYW1lIiwgJmNyeXB0b19YNTA5TmFtZV9UeXBlLCAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNyeXB0b19YNTA5TmFtZV9OZXcoWDUwOV9OQU1FX2R1cChuYW1lLT54NTA5X25hbWUpLCAxKTsKK30KKworc3RhdGljIGNoYXIgY3J5cHRvX1g1MDlSZXFfZG9jW10gPSAiXG5cCitUaGUgZmFjdG9yeSBmdW5jdGlvbiBpbnNlcnRlZCBpbiB0aGUgbW9kdWxlIGRpY3Rpb25hcnkgdG8gY3JlYXRlIFg1MDlSZXFcblwKK29iamVjdHNcblwKK1xuXAorQXJndW1lbnRzOiBzcGFtIC0gQWx3YXlzIE5VTExcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZSBlbXB0eVxuXAorUmV0dXJuczogICBUaGUgWDUwOVJlcSBvYmplY3RcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fWDUwOVJlcShQeU9iamVjdCAqc3BhbSwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6WDUwOVJlcSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiAoUHlPYmplY3QgKiljcnlwdG9fWDUwOVJlcV9OZXcoWDUwOV9SRVFfbmV3KCksIDEpOworfQorCitzdGF0aWMgY2hhciBjcnlwdG9fUEtleV9kb2NbXSA9ICJcblwKK1RoZSBmYWN0b3J5IGZ1bmN0aW9uIGluc2VydGVkIGluIHRoZSBtb2R1bGUgZGljdGlvbmFyeSB0byBjcmVhdGUgUEtleVxuXAorb2JqZWN0c1xuXAorXG5cCitBcmd1bWVudHM6IHNwYW0gLSBBbHdheXMgTlVMTFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlIGVtcHR5XG5cCitSZXR1cm5zOiAgIFRoZSBQS2V5IG9iamVjdFxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK2NyeXB0b19QS2V5KFB5T2JqZWN0ICpzcGFtLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpQS2V5IikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNyeXB0b19QS2V5X05ldyhFVlBfUEtFWV9uZXcoKSwgMSk7Cit9CisKK3N0YXRpYyBjaGFyIGNyeXB0b19YNTA5RXh0ZW5zaW9uX2RvY1tdID0gIlxuXAorVGhlIGZhY3RvcnkgZnVuY3Rpb24gaW5zZXJ0ZWQgaW4gdGhlIG1vZHVsZSBkaWN0aW9uYXJ5IHRvIGNyZWF0ZVxuXAorWDUwOUV4dGVuc2lvbiBvYmplY3RzLlxuXAorXG5cCitBcmd1bWVudHM6IHNwYW0gLSBBbHdheXMgTlVMTFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlXG5cCisgICAgICAgICAgICAgdHlwZW5hbWUgLSA/Pz9cblwKKyAgICAgICAgICAgICBjcml0aWNhbCAtID8/P1xuXAorICAgICAgICAgICAgIHZhbHVlICAgIC0gPz8/XG5cCitSZXR1cm5zOiAgIFRoZSBYNTA5RXh0ZW5zaW9uIG9iamVjdFxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK2NyeXB0b19YNTA5RXh0ZW5zaW9uKFB5T2JqZWN0ICpzcGFtLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjaGFyICp0eXBlX25hbWUsICp2YWx1ZTsKKyAgICBpbnQgY3JpdGljYWw7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpczpYNTA5RXh0ZW5zaW9uIiwgJnR5cGVfbmFtZSwgJmNyaXRpY2FsLAorICAgICAgICAgICAgICAgICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNyeXB0b19YNTA5RXh0ZW5zaW9uX05ldyh0eXBlX25hbWUsIGNyaXRpY2FsLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBjaGFyIGNyeXB0b19OZXRzY2FwZVNQS0lfZG9jW10gPSAiXG5cCitUaGUgZmFjdG9yeSBmdW5jdGlvbiBpbnNlcnRlZCBpbiB0aGUgbW9kdWxlIGRpY3Rpb25hcnkgdG8gY3JlYXRlIE5ldHNjYXBlU1BLSVxuXAorb2JqZWN0c1xuXAorXG5cCitBcmd1bWVudHM6IHNwYW0gLSBBbHdheXMgTlVMTFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlIGVtcHR5IG9yLCBvcHRpb25hbGx5XG5cCisgICAgICAgICAgICAgZW5jIC0gQmFzZTY0IGVuY29kZWQgTmV0c2NhcGVTUEtJIG9iamVjdC5cblwKK1JldHVybnM6ICAgVGhlIE5ldHNjYXBlU1BLSSBvYmplY3RcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fTmV0c2NhcGVTUEtJKFB5T2JqZWN0ICpzcGFtLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjaGFyICplbmMgPSBOVUxMOworICAgIGludCBlbmNfbGVuID0gLTE7CisgICAgTkVUU0NBUEVfU1BLSSAqc3BraTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHMjOk5ldHNjYXBlU1BLSSIsICZlbmMsICZlbmNfbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoZW5jX2xlbiA+PSAwKQorICAgICAgICBzcGtpID0gTkVUU0NBUEVfU1BLSV9iNjRfZGVjb2RlKGVuYywgZW5jX2xlbik7CisgICAgZWxzZQorICAgICAgICBzcGtpID0gTkVUU0NBUEVfU1BLSV9uZXcoKTsKKyAgICBpZiAoc3BraSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKiljcnlwdG9fTmV0c2NhcGVTUEtJX05ldyhzcGtpLCAxKTsKK30KKworLyogTWV0aG9kcyBpbiB0aGUgT3BlblNTTC5jcnlwdG8gbW9kdWxlIChpLmUuIG5vbmUpICovCitzdGF0aWMgUHlNZXRob2REZWYgY3J5cHRvX21ldGhvZHNbXSA9IHsKKyAgICAvKiBNb2R1bGUgZnVuY3Rpb25zICovCisgICAgeyAibG9hZF9wcml2YXRla2V5IiwgIChQeUNGdW5jdGlvbiljcnlwdG9fbG9hZF9wcml2YXRla2V5LCAgTUVUSF9WQVJBUkdTLCBjcnlwdG9fbG9hZF9wcml2YXRla2V5X2RvYyB9LAorICAgIHsgImR1bXBfcHJpdmF0ZWtleSIsICAoUHlDRnVuY3Rpb24pY3J5cHRvX2R1bXBfcHJpdmF0ZWtleSwgIE1FVEhfVkFSQVJHUywgY3J5cHRvX2R1bXBfcHJpdmF0ZWtleV9kb2MgfSwKKyAgICB7ICJsb2FkX2NlcnRpZmljYXRlIiwgKFB5Q0Z1bmN0aW9uKWNyeXB0b19sb2FkX2NlcnRpZmljYXRlLCBNRVRIX1ZBUkFSR1MsIGNyeXB0b19sb2FkX2NlcnRpZmljYXRlX2RvYyB9LAorICAgIHsgImR1bXBfY2VydGlmaWNhdGUiLCAoUHlDRnVuY3Rpb24pY3J5cHRvX2R1bXBfY2VydGlmaWNhdGUsIE1FVEhfVkFSQVJHUywgY3J5cHRvX2R1bXBfY2VydGlmaWNhdGVfZG9jIH0sCisgICAgeyAibG9hZF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0IiwgKFB5Q0Z1bmN0aW9uKWNyeXB0b19sb2FkX2NlcnRpZmljYXRlX3JlcXVlc3QsIE1FVEhfVkFSQVJHUywgY3J5cHRvX2xvYWRfY2VydGlmaWNhdGVfcmVxdWVzdF9kb2MgfSwKKyAgICB7ICJkdW1wX2NlcnRpZmljYXRlX3JlcXVlc3QiLCAoUHlDRnVuY3Rpb24pY3J5cHRvX2R1bXBfY2VydGlmaWNhdGVfcmVxdWVzdCwgTUVUSF9WQVJBUkdTLCBjcnlwdG9fZHVtcF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0X2RvYyB9LAorICAgIHsgImxvYWRfcGtjczdfZGF0YSIsIChQeUNGdW5jdGlvbiljcnlwdG9fbG9hZF9wa2NzN19kYXRhLCBNRVRIX1ZBUkFSR1MsIGNyeXB0b19sb2FkX3BrY3M3X2RhdGFfZG9jIH0sCisgICAgeyAibG9hZF9wa2NzMTIiLCAoUHlDRnVuY3Rpb24pY3J5cHRvX2xvYWRfcGtjczEyLCBNRVRIX1ZBUkFSR1MsIGNyeXB0b19sb2FkX3BrY3MxMl9kb2MgfSwKKyAgICAvKiBGYWN0b3J5IGZ1bmN0aW9ucyAqLworICAgIHsgIlg1MDkiLCAgICAoUHlDRnVuY3Rpb24pY3J5cHRvX1g1MDksICAgIE1FVEhfVkFSQVJHUywgY3J5cHRvX1g1MDlfZG9jIH0sCisgICAgeyAiWDUwOU5hbWUiLChQeUNGdW5jdGlvbiljcnlwdG9fWDUwOU5hbWUsTUVUSF9WQVJBUkdTLCBjcnlwdG9fWDUwOU5hbWVfZG9jIH0sCisgICAgeyAiWDUwOVJlcSIsIChQeUNGdW5jdGlvbiljcnlwdG9fWDUwOVJlcSwgTUVUSF9WQVJBUkdTLCBjcnlwdG9fWDUwOVJlcV9kb2MgfSwKKyAgICB7ICJQS2V5IiwgICAgKFB5Q0Z1bmN0aW9uKWNyeXB0b19QS2V5LCAgICBNRVRIX1ZBUkFSR1MsIGNyeXB0b19QS2V5X2RvYyB9LAorICAgIHsgIlg1MDlFeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pY3J5cHRvX1g1MDlFeHRlbnNpb24sIE1FVEhfVkFSQVJHUywgY3J5cHRvX1g1MDlFeHRlbnNpb25fZG9jIH0sCisgICAgeyAiTmV0c2NhcGVTUEtJIiwgKFB5Q0Z1bmN0aW9uKWNyeXB0b19OZXRzY2FwZVNQS0ksIE1FVEhfVkFSQVJHUywgY3J5cHRvX05ldHNjYXBlU1BLSV9kb2MgfSwKKyAgICB7IE5VTEwsIE5VTEwgfQorfTsKKworLyoKKyAqIEluaXRpYWxpemUgY3J5cHRvIHN1YiBtb2R1bGUKKyAqCisgKiBBcmd1bWVudHM6IE5vbmUKKyAqIFJldHVybnM6ICAgTm9uZQorICovCit2b2lkCitpbml0Y3J5cHRvKHZvaWQpCit7CisgICAgc3RhdGljIHZvaWQgKmNyeXB0b19BUElbY3J5cHRvX0FQSV9wb2ludGVyc107CisgICAgUHlPYmplY3QgKmNfYXBpX29iamVjdDsKKyAgICBQeU9iamVjdCAqbW9kdWxlLCAqZGljdDsKKworICAgIEVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisgICAgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKTsKKworICAgIGlmICgobW9kdWxlID0gUHlfSW5pdE1vZHVsZTMoImNyeXB0byIsIGNyeXB0b19tZXRob2RzLCBjcnlwdG9fZG9jKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgQyBBUEkgcG9pbnRlciBhcnJheSAqLworICAgIGNyeXB0b19BUElbY3J5cHRvX1g1MDlfTmV3X05VTV0gICAgICA9ICh2b2lkICopY3J5cHRvX1g1MDlfTmV3OworICAgIGNyeXB0b19BUElbY3J5cHRvX1g1MDlOYW1lX05ld19OVU1dICA9ICh2b2lkICopY3J5cHRvX1g1MDlOYW1lX05ldzsKKyAgICBjcnlwdG9fQVBJW2NyeXB0b19YNTA5UmVxX05ld19OVU1dICAgPSAodm9pZCAqKWNyeXB0b19YNTA5UmVxX05ldzsKKyAgICBjcnlwdG9fQVBJW2NyeXB0b19YNTA5U3RvcmVfTmV3X05VTV0gPSAodm9pZCAqKWNyeXB0b19YNTA5U3RvcmVfTmV3OworICAgIGNyeXB0b19BUElbY3J5cHRvX1BLZXlfTmV3X05VTV0gICAgICA9ICh2b2lkICopY3J5cHRvX1BLZXlfTmV3OworICAgIGNyeXB0b19BUElbY3J5cHRvX1g1MDlFeHRlbnNpb25fTmV3X05VTV0gPSAodm9pZCAqKWNyeXB0b19YNTA5RXh0ZW5zaW9uX05ldzsKKyAgICBjcnlwdG9fQVBJW2NyeXB0b19QS0NTN19OZXdfTlVNXSAgICAgPSAodm9pZCAqKWNyeXB0b19QS0NTN19OZXc7CisgICAgY3J5cHRvX0FQSVtjcnlwdG9fTmV0c2NhcGVTUEtJX05ld19OVU1dICAgICA9ICh2b2lkICopY3J5cHRvX05ldHNjYXBlU1BLSV9OZXc7CisgICAgY19hcGlfb2JqZWN0ID0gUHlDT2JqZWN0X0Zyb21Wb2lkUHRyKCh2b2lkICopY3J5cHRvX0FQSSwgTlVMTCk7CisgICAgaWYgKGNfYXBpX29iamVjdCAhPSBOVUxMKQorICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiX0NfQVBJIiwgY19hcGlfb2JqZWN0KTsKKworICAgIGNyeXB0b19FcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiT3BlblNTTC5jcnlwdG8uRXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoY3J5cHRvX0Vycm9yID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJFcnJvciIsIGNyeXB0b19FcnJvcikgIT0gMCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG1vZHVsZSwgIkZJTEVUWVBFX1BFTSIsICBYNTA5X0ZJTEVUWVBFX1BFTSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiRklMRVRZUEVfQVNOMSIsIFg1MDlfRklMRVRZUEVfQVNOMSk7CisKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2R1bGUsICJUWVBFX1JTQSIsIGNyeXB0b19UWVBFX1JTQSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiVFlQRV9EU0EiLCBjcnlwdG9fVFlQRV9EU0EpOworCisgICAgZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kdWxlKTsKKyAgICBpZiAoIWluaXRfY3J5cHRvX3g1MDkoZGljdCkpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKCFpbml0X2NyeXB0b194NTA5bmFtZShkaWN0KSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBpZiAoIWluaXRfY3J5cHRvX3g1MDlzdG9yZShkaWN0KSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBpZiAoIWluaXRfY3J5cHRvX3g1MDlyZXEoZGljdCkpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKCFpbml0X2NyeXB0b19wa2V5KGRpY3QpKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGlmICghaW5pdF9jcnlwdG9feDUwOWV4dGVuc2lvbihkaWN0KSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBpZiAoIWluaXRfY3J5cHRvX3BrY3M3KGRpY3QpKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGlmICghaW5pdF9jcnlwdG9fcGtjczEyKGRpY3QpKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGlmICghaW5pdF9jcnlwdG9fbmV0c2NhcGVfc3BraShkaWN0KSkKKyAgICAgICAgZ290byBlcnJvcjsKKworZXJyb3I6CisgICAgOworfQorCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NyeXB0by5oIGIvc3JjL2NyeXB0by9jcnlwdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTcxZDJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NyeXB0by9jcnlwdG8uaApAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIGNyeXB0by5oCisgKgorICogQ29weXJpZ2h0IChDKSBBQiBTdHJha3QgMjAwMSwgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIEV4cG9ydHMgZnJvbSBjcnlwdG8uYy4KKyAqIFNlZSB0aGUgZmlsZSBSQVRJT05BTEUgZm9yIGEgc2hvcnQgZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgbW9kdWxlIHdhcyB3cml0dGVuLgorICoKKyAqIFJldmlld2VkIDIwMDEtMDctMjMKKyAqCisgKiBAKCMpICRJZDogY3J5cHRvLmgsdiAxLjE0IDIwMDQvMDgvMDkgMTM6NDE6MjUgbWFydGluIEV4cCAkCisgKi8KKyNpZm5kZWYgUHlPcGVuU1NMX0NSWVBUT19IXworI2RlZmluZSBQeU9wZW5TU0xfQ1JZUFRPX0hfCisKKyNpbmNsdWRlIDxQeXRob24uaD4KKyNpbmNsdWRlICJ4NTA5LmgiCisjaW5jbHVkZSAieDUwOW5hbWUuaCIKKyNpbmNsdWRlICJuZXRzY2FwZV9zcGtpLmgiCisjaW5jbHVkZSAieDUwOXN0b3JlLmgiCisjaW5jbHVkZSAieDUwOXJlcS5oIgorI2luY2x1ZGUgInBrZXkuaCIKKyNpbmNsdWRlICJ4NTA5ZXh0LmgiCisjaW5jbHVkZSAicGtjczcuaCIKKyNpbmNsdWRlICJwa2NzMTIuaCIKKyNpbmNsdWRlICIuLi91dGlsLmgiCisKK2V4dGVybiBQeU9iamVjdCAqY3J5cHRvX0Vycm9yOworCisjaWZkZWYgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUKKyMgIHVuZGVmIGV4Y2VwdGlvbl9mcm9tX2Vycm9yX3F1ZXVlCisjZW5kaWYKKyNkZWZpbmUgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUoKSAgICBkbyB7IFwKKyAgICBQeU9iamVjdCAqZXJybGlzdCA9IGVycm9yX3F1ZXVlX3RvX2xpc3QoKTsgXAorICAgIFB5RXJyX1NldE9iamVjdChjcnlwdG9fRXJyb3IsIGVycmxpc3QpOyBcCisgICAgUHlfREVDUkVGKGVycmxpc3QpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGNyeXB0b19YNTA5X05ld19OVU0gICAgICAgICAgICAgMAorI2RlZmluZSBjcnlwdG9fWDUwOV9OZXdfUkVUVVJOICAgICAgICAgIGNyeXB0b19YNTA5T2JqICoKKyNkZWZpbmUgY3J5cHRvX1g1MDlfTmV3X1BST1RPICAgICAgICAgICAoWDUwOSAqLCBpbnQpCisKKyNkZWZpbmUgY3J5cHRvX1g1MDlSZXFfTmV3X05VTSAgICAgICAgICAxCisjZGVmaW5lIGNyeXB0b19YNTA5UmVxX05ld19SRVRVUk4gICAgICAgY3J5cHRvX1g1MDlSZXFPYmogKgorI2RlZmluZSBjcnlwdG9fWDUwOVJlcV9OZXdfUFJPVE8gICAgICAgIChYNTA5X1JFUSAqLCBpbnQpCisKKyNkZWZpbmUgY3J5cHRvX1g1MDlTdG9yZV9OZXdfTlVNICAgICAgICAyCisjZGVmaW5lIGNyeXB0b19YNTA5U3RvcmVfTmV3X1JFVFVSTiAgICAgY3J5cHRvX1g1MDlTdG9yZU9iaiAqCisjZGVmaW5lIGNyeXB0b19YNTA5U3RvcmVfTmV3X1BST1RPICAgICAgKFg1MDlfU1RPUkUgKiwgaW50KQorCisjZGVmaW5lIGNyeXB0b19QS2V5X05ld19OVU0gICAgICAgICAgICAgMworI2RlZmluZSBjcnlwdG9fUEtleV9OZXdfUkVUVVJOICAgICAgICAgIGNyeXB0b19QS2V5T2JqICoKKyNkZWZpbmUgY3J5cHRvX1BLZXlfTmV3X1BST1RPICAgICAgICAgICAoRVZQX1BLRVkgKiwgaW50KQorCisjZGVmaW5lIGNyeXB0b19YNTA5TmFtZV9OZXdfTlVNICAgICAgICAgNAorI2RlZmluZSBjcnlwdG9fWDUwOU5hbWVfTmV3X1JFVFVSTiAgICAgIGNyeXB0b19YNTA5TmFtZU9iaiAqCisjZGVmaW5lIGNyeXB0b19YNTA5TmFtZV9OZXdfUFJPVE8gICAgICAgKFg1MDlfTkFNRSAqLCBpbnQpCisKKyNkZWZpbmUgY3J5cHRvX1g1MDlFeHRlbnNpb25fTmV3X05VTSAgICA1CisjZGVmaW5lIGNyeXB0b19YNTA5RXh0ZW5zaW9uX05ld19SRVRVUk4gY3J5cHRvX1g1MDlFeHRlbnNpb25PYmogKgorI2RlZmluZSBjcnlwdG9fWDUwOUV4dGVuc2lvbl9OZXdfUFJPVE8gIChjaGFyICosIGludCwgY2hhciAqKQorCisjZGVmaW5lIGNyeXB0b19QS0NTN19OZXdfTlVNICAgICAgICAgICAgNgorI2RlZmluZSBjcnlwdG9fUEtDUzdfTmV3X1JFVFVSTiAgICAgICAgIGNyeXB0b19QS0NTN09iaiAqCisjZGVmaW5lIGNyeXB0b19QS0NTN19OZXdfUFJPVE8gICAgICAgICAgKFBLQ1M3ICosIGludCkKKworI2RlZmluZSBjcnlwdG9fTmV0c2NhcGVTUEtJX05ld19OVU0gICAgICAgICA3CisjZGVmaW5lIGNyeXB0b19OZXRzY2FwZVNQS0lfTmV3X1JFVFVSTiAgICAgIGNyeXB0b19OZXRzY2FwZVNQS0lPYmogKgorI2RlZmluZSBjcnlwdG9fTmV0c2NhcGVTUEtJX05ld19QUk9UTyAgICAgICAoTkVUU0NBUEVfU1BLSSAqLCBpbnQpCisKKyNkZWZpbmUgY3J5cHRvX0FQSV9wb2ludGVycyAgICAgICAgICAgICA4CisKKyNpZmRlZiBjcnlwdG9fTU9EVUxFCisKK2V4dGVybiBjcnlwdG9fWDUwOV9OZXdfUkVUVVJOICAgICAgY3J5cHRvX1g1MDlfTmV3ICAgICAgY3J5cHRvX1g1MDlfTmV3X1BST1RPOworZXh0ZXJuIGNyeXB0b19YNTA5TmFtZV9OZXdfUkVUVVJOICBjcnlwdG9fWDUwOU5hbWVfTmV3ICBjcnlwdG9fWDUwOU5hbWVfTmV3X1BST1RPOworZXh0ZXJuIGNyeXB0b19YNTA5UmVxX05ld19SRVRVUk4gICBjcnlwdG9fWDUwOVJlcV9OZXcgICBjcnlwdG9fWDUwOVJlcV9OZXdfUFJPVE87CitleHRlcm4gY3J5cHRvX1g1MDlTdG9yZV9OZXdfUkVUVVJOIGNyeXB0b19YNTA5U3RvcmVfTmV3IGNyeXB0b19YNTA5U3RvcmVfTmV3X1BST1RPOworZXh0ZXJuIGNyeXB0b19QS2V5X05ld19SRVRVUk4gICAgICBjcnlwdG9fUEtleV9OZXcgICAgICBjcnlwdG9fUEtleV9OZXdfUFJPVE87CitleHRlcm4gY3J5cHRvX1g1MDlFeHRlbnNpb25fTmV3X1JFVFVSTiBjcnlwdG9fWDUwOUV4dGVuc2lvbl9OZXcgY3J5cHRvX1g1MDlFeHRlbnNpb25fTmV3X1BST1RPOworZXh0ZXJuIGNyeXB0b19QS0NTN19OZXdfUkVUVVJOICAgICBjcnlwdG9fUEtDUzdfTmV3ICAgICBjcnlwdG9fUEtDUzdfTmV3X1BST1RPOworZXh0ZXJuIGNyeXB0b19OZXRzY2FwZVNQS0lfTmV3X1JFVFVSTiAgY3J5cHRvX05ldHNjYXBlU1BLSV9OZXcgIGNyeXB0b19OZXRzY2FwZVNQS0lfTmV3X1BST1RPOworCisjZWxzZSAvKiBjcnlwdG9fTU9EVUxFICovCisKK2V4dGVybiB2b2lkICoqY3J5cHRvX0FQSTsKKworI2RlZmluZSBjcnlwdG9fWDUwOV9OZXcgICAgICAgICBcCisgKCooY3J5cHRvX1g1MDlfTmV3X1JFVFVSTiAoKiljcnlwdG9fWDUwOV9OZXdfUFJPVE8pIGNyeXB0b19BUElbY3J5cHRvX1g1MDlfTmV3X05VTV0pCisjZGVmaW5lIGNyeXB0b19YNTA5TmFtZV9OZXcgICAgIFwKKyAoKihjcnlwdG9fWDUwOU5hbWVfTmV3X1JFVFVSTiAoKiljcnlwdG9fWDUwOU5hbWVfTmV3X1BST1RPKSBjcnlwdG9fQVBJW2NyeXB0b19YNTA5TmFtZV9OZXdfTlVNXSkKKyNkZWZpbmUgY3J5cHRvX1g1MDlSZXFfTmV3ICAgICAgXAorICgqKGNyeXB0b19YNTA5UmVxX05ld19SRVRVUk4gKCopY3J5cHRvX1g1MDlSZXFfTmV3X1BST1RPKSBjcnlwdG9fQVBJW2NyeXB0b19YNTA5UmVxX05ld19OVU1dKQorI2RlZmluZSBjcnlwdG9fWDUwOVN0b3JlX05ldyAgICBcCisgKCooY3J5cHRvX1g1MDlTdG9yZV9OZXdfUkVUVVJOICgqKWNyeXB0b19YNTA5U3RvcmVfTmV3X1BST1RPKSBjcnlwdG9fQVBJW2NyeXB0b19YNTA5U3RvcmVfTmV3X05VTV0pCisjZGVmaW5lIGNyeXB0b19QS2V5X05ldyAgICAgICAgIFwKKyAoKihjcnlwdG9fUEtleV9OZXdfUkVUVVJOICgqKWNyeXB0b19QS2V5X05ld19QUk9UTykgY3J5cHRvX0FQSVtjcnlwdG9fUEtleV9OZXdfTlVNXSkKKyNkZWZpbmUgY3J5cHRvX1g1MDlFeHRlbnNpb25fTmV3XAorICgqKGNyeXB0b19YNTA5RXh0ZW5zaW9uX05ld19SRVRVUk4gKCopY3J5cHRvX1g1MDlFeHRlbnNpb25fTmV3X1BST1RPKSBjcnlwdG9fQVBJW2NyeXB0b19YNTA5RXh0ZW5zaW9uX05ld19OVU1dKQorI2RlZmluZSBjcnlwdG9fUEtDUzdfTmV3ICAgICAgICBcCisgKCooY3J5cHRvX1BLQ1M3X05ld19SRVRVUk4gKCopY3J5cHRvX1BLQ1M3X05ld19QUk9UTykgY3J5cHRvX0FQSVtjcnlwdG9fUEtDUzdfTmV3X05VTV0pCisjZGVmaW5lIGNyeXB0b19OZXRzY2FwZVNQS0lfTmV3ICAgICBcCisgKCooY3J5cHRvX05ldHNjYXBlU1BLSV9OZXdfUkVUVVJOICgqKWNyeXB0b19OZXRzY2FwZVNQS0lfTmV3X1BST1RPKSBjcnlwdG9fQVBJW2NyeXB0b19OZXRzY2FwZVNQS0lfTmV3X05VTV0pCisKKyNkZWZpbmUgaW1wb3J0X2NyeXB0bygpIFwKK3sgXAorICBQeU9iamVjdCAqY3J5cHRvX21vZHVsZSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiT3BlblNTTC5jcnlwdG8iKTsgXAorICBpZiAoY3J5cHRvX21vZHVsZSAhPSBOVUxMKSB7IFwKKyAgICBQeU9iamVjdCAqY3J5cHRvX2RpY3QsICpjcnlwdG9fYXBpX29iamVjdDsgXAorICAgIGNyeXB0b19kaWN0ID0gUHlNb2R1bGVfR2V0RGljdChjcnlwdG9fbW9kdWxlKTsgXAorICAgIGNyeXB0b19hcGlfb2JqZWN0ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoY3J5cHRvX2RpY3QsICJfQ19BUEkiKTsgXAorICAgIGlmIChQeUNPYmplY3RfQ2hlY2soY3J5cHRvX2FwaV9vYmplY3QpKSB7IFwKKyAgICAgIGNyeXB0b19BUEkgPSAodm9pZCAqKilQeUNPYmplY3RfQXNWb2lkUHRyKGNyeXB0b19hcGlfb2JqZWN0KTsgXAorICAgIH0gXAorICB9IFwKK30KKworI2VuZGlmIC8qIGNyeXB0b19NT0RVTEUgKi8KKworI2VuZGlmIC8qIFB5T3BlblNTTF9DUllQVE9fSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vbmV0c2NhcGVfc3BraS5jIGIvc3JjL2NyeXB0by9uZXRzY2FwZV9zcGtpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M1NDc4MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jcnlwdG8vbmV0c2NhcGVfc3BraS5jCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogbmV0c2NhcGVfc3BraS5jCisgKgorICogQ29weXJpZ2h0IChDKSBUb2xsZWYgRm9nIEhlZW4gMjAwMworICoKKyAqIE5ldHNjYXBlIFNQS0kgaGFuZGxpbmcsIHRoaW4gd3JhcHBlcgorICovCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjZGVmaW5lIGNyeXB0b19NT0RVTEUKKyNpbmNsdWRlICJjcnlwdG8uaCIKKworc3RhdGljIGNoYXIgKkNWU2lkID0gIkAoIykgJElkOiBuZXRzY2FwZV9zcGtpLmMsdiAxLjEgMjAwNC8wOC8wOSAxMzo0MToyNSBtYXJ0aW4gRXhwICQiOworCisKKy8qCisgKiBDb25zdHJ1Y3RvciBmb3IgTmVzdGNhcGVfU1BLSSwgbmV2ZXIgY2FsbGVkIGJ5IFB5dGhvbiBjb2RlIGRpcmVjdGx5CisgKgorICogQXJndW1lbnRzOiBuYW1lICAgIC0gQSAicmVhbCIgTmV0c2NhcGVTUEtJIG9iamVjdAorICogICAgICAgICAgICBkZWFsbG9jIC0gQm9vbGVhbiB2YWx1ZSB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIGRlc3RydWN0b3Igc2hvdWxkCisgKiAgICAgICAgICAgICAgICAgICAgICBmcmVlIHRoZSAicmVhbCIgTmV0c2NhcGVTUEtJIG9iamVjdAorICogUmV0dXJuczogICBUaGUgbmV3bHkgY3JlYXRlZCBOZXRzY2FwZVNQS0kgb2JqZWN0CisgKi8KK2NyeXB0b19OZXRzY2FwZVNQS0lPYmogKgorY3J5cHRvX05ldHNjYXBlU1BLSV9OZXcoTkVUU0NBUEVfU1BLSSAqbmFtZSwgaW50IGRlYWxsb2MpCit7CisgICAgY3J5cHRvX05ldHNjYXBlU1BLSU9iaiAqc2VsZjsKKworICAgIHNlbGYgPSBQeU9iamVjdF9OZXcoY3J5cHRvX05ldHNjYXBlU1BLSU9iaiwgJmNyeXB0b19OZXRzY2FwZVNQS0lfVHlwZSk7CisKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHNlbGYtPm5ldHNjYXBlX3Nwa2kgPSBuYW1lOworICAgIHNlbGYtPmRlYWxsb2MgPSBkZWFsbG9jOworCisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qCisgKiBEZWFsbG9jYXRlIHRoZSBtZW1vcnkgdXNlZCBieSB0aGUgTmV0c2NhcGVTUEtJIG9iamVjdAorICoKKyAqIEFyZ3VtZW50czogc2VsZiAtIFRoZSBOZXRzY2FwZVNQS0kgb2JqZWN0CisgKiBSZXR1cm5zOiAgIE5vbmUKKyAqLworc3RhdGljIHZvaWQKK2NyeXB0b19OZXRzY2FwZVNQS0lfZGVhbGxvYyhjcnlwdG9fTmV0c2NhcGVTUEtJT2JqICpzZWxmKQoreworICAgIC8qIFNvbWV0aW1lcyB3ZSBkb24ndCBoYXZlIHRvIGRlYWxsb2MgdGhpcyAqLworICAgIGlmIChzZWxmLT5kZWFsbG9jKQorICAgICAgICBORVRTQ0FQRV9TUEtJX2ZyZWUoc2VsZi0+bmV0c2NhcGVfc3BraSk7CisKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7Cit9CisKK3N0YXRpYyBjaGFyIGNyeXB0b19OZXRzY2FwZVNQS0lfc2lnbl9kb2NbXSA9ICJcblwKK1NpZ24gdGhlIGNlcnRpZmljYXRlIHJlcXVlc3QgdXNpbmcgdGhlIHN1cHBsaWVkIGtleSBhbmQgZGlnZXN0XG5cCitcblwKK0FyZ3VtZW50czogc2VsZiAtIFRoZSBOZXRzY2FwZVNQS0kgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAgcGtleSAgIC0gVGhlIGtleSB0byBzaWduIHdpdGhcblwKKyAgICAgICAgICAgICBkaWdlc3QgLSBUaGUgbWVzc2FnZSBkaWdlc3QgdG8gdXNlXG5cCitSZXR1cm5zOiAgIE5vbmVcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fTmV0c2NhcGVTUEtJX3NpZ24oY3J5cHRvX05ldHNjYXBlU1BLSU9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY3J5cHRvX1BLZXlPYmogKnBrZXk7CisgICAgY2hhciAqZGlnZXN0X25hbWU7CisgICAgY29uc3QgRVZQX01EICpkaWdlc3Q7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hczpzaWduIiwgJmNyeXB0b19QS2V5X1R5cGUsICZwa2V5LAorCQkJICAmZGlnZXN0X25hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICgoZGlnZXN0ID0gRVZQX2dldF9kaWdlc3RieW5hbWUoZGlnZXN0X25hbWUpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJObyBzdWNoIGRpZ2VzdCBtZXRob2QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKCFORVRTQ0FQRV9TUEtJX3NpZ24oc2VsZi0+bmV0c2NhcGVfc3BraSwgcGtleS0+cGtleSwgZGlnZXN0KSkKKyAgICB7CisgICAgICAgIGV4Y2VwdGlvbl9mcm9tX2Vycm9yX3F1ZXVlKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KKworc3RhdGljIGNoYXIgY3J5cHRvX05ldHNjYXBlU1BLSV92ZXJpZnlfZG9jW10gPSAiXG5cCitWZXJpZmllcyBhIGNlcnRpZmljYXRlIHJlcXVlc3QgdXNpbmcgdGhlIHN1cHBsaWVkIHB1YmxpYyBrZXlcblwKKyBcblwKK0FyZ3VtZW50czogc2VsZiAtIE5ldHNjYXBlU1BLSSBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZTpcblwKKyAgICAgICAgICAgICBrZXkgLSBhIHB1YmxpYyBrZXlcblwKK1JldHVybnM6ICAgVHJ1ZSwgaWYgdGhlIHNpZ25hdHVyZSBpcyBjb3JyZWN0LCAwIG90aGVyd2lzZS5cblwKKyI7CisKK1B5T2JqZWN0ICoKK2NyeXB0b19OZXRzY2FwZVNQS0lfdmVyaWZ5KGNyeXB0b19OZXRzY2FwZVNQS0lPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGNyeXB0b19QS2V5T2JqICpwa2V5OworICAgIGludCBhbnN3ZXI7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOnZlcmlmeSIsICZjcnlwdG9fUEtleV9UeXBlLCAmcGtleSkpIAorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICgoYW5zd2VyID0gTkVUU0NBUEVfU1BLSV92ZXJpZnkoc2VsZi0+bmV0c2NhcGVfc3BraSwgcGtleS0+cGtleSkpIDwgMCkKKyAgICB7CisgICAgICAgIGV4Y2VwdGlvbl9mcm9tX2Vycm9yX3F1ZXVlKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylhbnN3ZXIpOworfQorCitzdGF0aWMgY2hhciBjcnlwdG9fTmV0c2NhcGVTUEtJX2I2NF9lbmNvZGVfZG9jW10gPSAiXG5cCitHZW5lcmF0ZSBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZyBmcm9tIGFuIFNQS0lcblwKKyBcblwKK0FyZ3VtZW50czogc2VsZiAtIE5ldHNjYXBlU1BLSSBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZSBlbXB0eVxuXAorUmV0dXJuczogICBUaGUgYmFzZTY0IGVuY29kZWQgc3RyaW5nXG5cCisiOworCitQeU9iamVjdCAqCitjcnlwdG9fTmV0c2NhcGVTUEtJX2I2NF9lbmNvZGUoY3J5cHRvX05ldHNjYXBlU1BLSU9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY2hhciAqc3RyOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6YjY0X2VuY29kZSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHN0ciA9IE5FVFNDQVBFX1NQS0lfYjY0X2VuY29kZShzZWxmLT5uZXRzY2FwZV9zcGtpKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHIpOworfQorCisKK3N0YXRpYyBjaGFyIGNyeXB0b19OZXRzY2FwZVNQS0lfZ2V0X3B1YmtleV9kb2NbXSA9ICJcblwKK0dldCB0aGUgcHVibGljIGtleSBvZiB0aGUgY2VydGlmaWNhdGVcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIE5FVFNDQVBFX1NQS0kgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmUgZW1wdHlcblwKK1JldHVybnM6ICAgVGhlIHB1YmxpYyBrZXlcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fTmV0c2NhcGVTUEtJX2dldF9wdWJrZXkoY3J5cHRvX05ldHNjYXBlU1BLSU9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY3J5cHRvX1BLZXlPYmogKmNyeXB0b19QS2V5X05ldyhFVlBfUEtFWSAqLCBpbnQpOworICAgIEVWUF9QS0VZICpwa2V5OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0X3B1YmtleSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICgocGtleSA9IE5FVFNDQVBFX1NQS0lfZ2V0X3B1YmtleShzZWxmLT5uZXRzY2FwZV9zcGtpKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGV4Y2VwdGlvbl9mcm9tX2Vycm9yX3F1ZXVlKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiAoUHlPYmplY3QgKiljcnlwdG9fUEtleV9OZXcocGtleSwgMCk7Cit9CisKK3N0YXRpYyBjaGFyIGNyeXB0b19OZXRzY2FwZVNQS0lfc2V0X3B1YmtleV9kb2NbXSA9ICJcblwKK1NldCB0aGUgcHVibGljIGtleSBvZiB0aGUgY2VydGlmaWNhdGVcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIE5ldHNjYXBlIFNQS0kgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAgcGtleSAtIFRoZSBwdWJsaWMga2V5XG5cCitSZXR1cm5zOiAgIE5vbmVcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fTmV0c2NhcGVTUEtJX3NldF9wdWJrZXkoY3J5cHRvX05ldHNjYXBlU1BLSU9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY3J5cHRvX1BLZXlPYmogKnBrZXk7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOnNldF9wdWJrZXkiLCAmY3J5cHRvX1BLZXlfVHlwZSwgJnBrZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghTkVUU0NBUEVfU1BLSV9zZXRfcHVia2V5KHNlbGYtPm5ldHNjYXBlX3Nwa2ksIHBrZXktPnBrZXkpKQorICAgIHsKKyAgICAgICAgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCisvKgorICogQUREX01FVEhPRChuYW1lKSBleHBhbmRzIHRvIGEgY29ycmVjdCBQeU1ldGhvZERlZiBkZWNsYXJhdGlvbgorICogICB7ICAnbmFtZScsIChQeUNGdW5jdGlvbiljcnlwdG9fTmV0c2NhcGVTUEtJX25hbWUsIE1FVEhfVkFSQVJHUyB9CisgKiBmb3IgY29udmVuaWVuY2UKKyAqLworI2RlZmluZSBBRERfTUVUSE9EKG5hbWUpICAgICAgICBcCisgICAgeyAjbmFtZSwgKFB5Q0Z1bmN0aW9uKWNyeXB0b19OZXRzY2FwZVNQS0lfIyNuYW1lLCBNRVRIX1ZBUkFSR1MsIGNyeXB0b19OZXRzY2FwZVNQS0lfIyNuYW1lIyNfZG9jIH0KK3N0YXRpYyBQeU1ldGhvZERlZiBjcnlwdG9fTmV0c2NhcGVTUEtJX21ldGhvZHNbXSA9Cit7CisgICAgQUREX01FVEhPRChnZXRfcHVia2V5KSwKKyAgICBBRERfTUVUSE9EKHNldF9wdWJrZXkpLAorICAgIEFERF9NRVRIT0QoYjY0X2VuY29kZSksCisgICAgQUREX01FVEhPRChzaWduKSwKKyAgICBBRERfTUVUSE9EKHZlcmlmeSksCisgICAgeyBOVUxMLCBOVUxMIH0KK307CisjdW5kZWYgQUREX01FVEhPRAorCisvKgorICogRmluZCBhdHRyaWJ1dGUKKyAqCisgKiBBcmd1bWVudHM6IHNlbGYgLSBUaGUgTmV0c2NhcGVTUEtJIG9iamVjdAorICogICAgICAgICAgICBuYW1lIC0gVGhlIGF0dHJpYnV0ZSBuYW1lCisgKiBSZXR1cm5zOiAgIEEgUHl0aG9uIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSwgb3IgTlVMTCBpZiBzb21ldGhpbmcgd2VudAorICogICAgICAgICAgICB3cm9uZworICovCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX05ldHNjYXBlU1BLSV9nZXRhdHRyKGNyeXB0b19OZXRzY2FwZVNQS0lPYmogKnNlbGYsIGNoYXIgKm5hbWUpCit7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QoY3J5cHRvX05ldHNjYXBlU1BLSV9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKK30KKworUHlUeXBlT2JqZWN0IGNyeXB0b19OZXRzY2FwZVNQS0lfVHlwZSA9IHsKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLAorICAgICJOZXRzY2FwZVNQS0kiLAorICAgIHNpemVvZihjcnlwdG9fTmV0c2NhcGVTUEtJT2JqKSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWNyeXB0b19OZXRzY2FwZVNQS0lfZGVhbGxvYywKKyAgICBOVUxMLCAvKiBwcmludCAqLworICAgIChnZXRhdHRyZnVuYyljcnlwdG9fTmV0c2NhcGVTUEtJX2dldGF0dHIsCisgICAgTlVMTCwgLyogc2V0YXR0ciAqLworICAgIE5VTEwsIC8qIGNvbXBhcmUgKi8KKyAgICBOVUxMLCAvKiByZXByICovCisgICAgTlVMTCwgLyogYXNfbnVtYmVyICovCisgICAgTlVMTCwgLyogYXNfc2VxdWVuY2UgKi8KKyAgICBOVUxMLCAvKiBhc19tYXBwaW5nICovCisgICAgTlVMTCAgLyogaGFzaCAqLworfTsKKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgWDUwOU5hbWUgcGFydCBvZiB0aGUgY3J5cHRvIG1vZHVsZQorICoKKyAqIEFyZ3VtZW50czogZGljdCAtIFRoZSBjcnlwdG8gbW9kdWxlIGRpY3Rpb25hcnkKKyAqIFJldHVybnM6ICAgTm9uZQorICovCitpbnQKK2luaXRfY3J5cHRvX25ldHNjYXBlX3Nwa2koUHlPYmplY3QgKmRpY3QpCit7CisgICAgY3J5cHRvX05ldHNjYXBlU1BLSV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlfSU5DUkVGKCZjcnlwdG9fTmV0c2NhcGVTUEtJX1R5cGUpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJOZXRzY2FwZVNQS0lUeXBlIiwgKFB5T2JqZWN0ICopJmNyeXB0b19OZXRzY2FwZVNQS0lfVHlwZSk7CisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL25ldHNjYXBlX3Nwa2kuaCBiL3NyYy9jcnlwdG8vbmV0c2NhcGVfc3BraS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5Mzg5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY3J5cHRvL25ldHNjYXBlX3Nwa2kuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogbmV0c2NhcGVfc3BraS5oCisgKgorICogQ29weXJpZ2h0IChDKSBUb2xsZWYgRm9nIEhlZW4gMjAwMywgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIEhhbmRsZSBOZXRzY2FwZSBTUEtJIChjaGFsbGVuZ2UgcmVzcG9uc2UpIGNlcnRpZmljYXRlIHJlcXVlc3RzLgorICoKKyAqCisgKi8KKyNpZm5kZWYgUHlPcGVuU1NMX2NyeXB0b19OZXRzY2FwZV9TUEtJX0hfCisjZGVmaW5lIFB5T3BlblNTTF9jcnlwdG9fTmV0c2NhcGVfU1BLSV9IXworCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKworZXh0ZXJuICBpbnQgICAgIGluaXRfY3J5cHRvX25ldHNjYXBlX3Nwa2kgICAgICAgKFB5T2JqZWN0ICopOworCitleHRlcm4gIFB5VHlwZU9iamVjdCAgICAgIGNyeXB0b19OZXRzY2FwZVNQS0lfVHlwZTsKKworI2RlZmluZSBjcnlwdG9fTmV0c2NhcGVTUEtJX0NoZWNrKHYpICgodiktPm9iX3R5cGUgPT0gJmNyeXB0b19OZXRzY2FwZVNQS0lfVHlwZSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBORVRTQ0FQRV9TUEtJICAgICAgICAgICAqbmV0c2NhcGVfc3BraTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBkZWFsbG9jOworfSBjcnlwdG9fTmV0c2NhcGVTUEtJT2JqOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9wa2NzMTIuYyBiL3NyYy9jcnlwdG8vcGtjczEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI3NTYyZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jcnlwdG8vcGtjczEyLmMKQEAgLTAsMCArMSwyNzUgQEAKKy8qCisgKiBwa2NzMTIuYworICoKKyAqIENvcHlyaWdodCAoQykgQUIgU3RyYWt0IDIwMDEsIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBDZXJ0aWZpY2F0ZSB0cmFuc3BvcnQgKFBLQ1MxMikgaGFuZGxpbmcgY29kZSwgCisgKiBtb3N0bHkgdGhpbiB3cmFwcGVycyBhcm91bmQgT3BlblNTTC4KKyAqIFNlZSB0aGUgZmlsZSBSQVRJT05BTEUgZm9yIGEgc2hvcnQgZXhwbGFuYXRpb24gb2Ygd2h5IAorICogdGhpcyBtb2R1bGUgd2FzIHdyaXR0ZW4uCisgKgorICogUmV2aWV3ZWQgMjAwMS0wNy0yMworICovCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjZGVmaW5lIGNyeXB0b19NT0RVTEUKKyNpbmNsdWRlICJjcnlwdG8uaCIKKworc3RhdGljIGNoYXIgKkNWU2lkID0gIkAoIykgJElkOiBwa2NzMTIuYyx2IDEuMyAyMDAzLzAxLzA5IDE3OjA4OjMyIG1hcnRpbiBFeHAgJCI7CisKKy8qIAorICogUEtDUzEyIGlzIGEgc3RhbmRhcmQgZXhjaGFuZ2UgZm9ybWF0IGZvciBkaWdpdGFsIGNlcnRpZmljYXRlcy4gIAorICogU2VlIGUuZy4gdGhlIE9wZW5TU0wgaG9tZXBhZ2UgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8gZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqLworCitzdGF0aWMgdm9pZCBjcnlwdG9fUEtDUzEyX2RlYWxsb2MoY3J5cHRvX1BLQ1MxMk9iaiAqc2VsZik7CisKK3N0YXRpYyBjaGFyIGNyeXB0b19QS0NTMTJfZ2V0X2NlcnRpZmljYXRlX2RvY1tdID0gIlxuXAorUmV0dXJuIGNlcnRpZmljYXRlIHBvcnRpb24gb2YgdGhlIFBLQ1MxMiBzdHJ1Y3R1cmVcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIFBLQ1MxMiBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZSBlbXB0eVxuXAorUmV0dXJuczogICBYNTA5IG9iamVjdCBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZVxuXAorIjsKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fUEtDUzEyX2dldF9jZXJ0aWZpY2F0ZShjcnlwdG9fUEtDUzEyT2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXRfY2VydGlmaWNhdGUiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBQeV9JTkNSRUYoc2VsZi0+Y2VydCk7CisgICAgcmV0dXJuIHNlbGYtPmNlcnQ7Cit9CisKK3N0YXRpYyBjaGFyIGNyeXB0b19QS0NTMTJfZ2V0X3ByaXZhdGVrZXlfZG9jW10gPSAiXG5cCitSZXR1cm4gcHJpdmF0ZSBrZXkgcG9ydGlvbiBvZiB0aGUgUEtDUzEyIHN0cnVjdHVyZVxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgUEtDUzEyIG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlIGVtcHR5XG5cCitSZXR1cm5zOiAgIFBLZXkgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHByaXZhdGUga2V5XG5cCisiOworc3RhdGljIFB5T2JqZWN0ICoKK2NyeXB0b19QS0NTMTJfZ2V0X3ByaXZhdGVrZXkoY3J5cHRvX1BLQ1MxMk9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0X3ByaXZhdGVrZXkiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBQeV9JTkNSRUYoc2VsZi0+a2V5KTsKKyAgICByZXR1cm4gc2VsZi0+a2V5OworfQorCitzdGF0aWMgY2hhciBjcnlwdG9fUEtDUzEyX2dldF9jYV9jZXJ0aWZpY2F0ZXNfZG9jW10gPSAiXG5cCitSZXR1cm4gQ0EgY2VydGlmaWNhdGVzIHdpdGhpbiBvZiB0aGUgUEtDUzEyIG9iamVjdFxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgUEtDUzEyIG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlIGVtcHR5XG5cCitSZXR1cm5zOiAgIEEgbmV3bHkgY3JlYXRlZCB0dXBsZSBjb250YWluaW5nIHRoZSBDQSBjZXJ0aWZpY2F0ZXMgaW4gdGhlIGNoYWluLFxuXAorICAgICAgICAgICBpZiBhbnkgYXJlIHByZXNlbnQsIG9yIE5vbmUgaWYgbm8gQ0EgY2VydGlmaWNhdGVzIGFyZSBwcmVzZW50LlxuXAorIjsKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fUEtDUzEyX2dldF9jYV9jZXJ0aWZpY2F0ZXMoY3J5cHRvX1BLQ1MxMk9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0X2NhX2NlcnRpZmljYXRlcyIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIFB5X0lOQ1JFRihzZWxmLT5jYWNlcnRzKTsKKyAgICByZXR1cm4gc2VsZi0+Y2FjZXJ0czsKK30KKworLyoKKyAqIEFERF9NRVRIT0QobmFtZSkgZXhwYW5kcyB0byBhIGNvcnJlY3QgUHlNZXRob2REZWYgZGVjbGFyYXRpb24KKyAqICAgeyAgJ25hbWUnLCAoUHlDRnVuY3Rpb24pY3J5cHRvX1BLQ1MxMl9uYW1lLCBNRVRIX1ZBUkFSR1MsIGNyeXB0b19QS0NTMTJfbmFtZV9kb2MgfQorICogZm9yIGNvbnZlbmllbmNlCisgKi8KKyNkZWZpbmUgQUREX01FVEhPRChuYW1lKSAgICAgICAgXAorICAgIHsgI25hbWUsIChQeUNGdW5jdGlvbiljcnlwdG9fUEtDUzEyXyMjbmFtZSwgTUVUSF9WQVJBUkdTLCBjcnlwdG9fUEtDUzEyXyMjbmFtZSMjX2RvYyB9CitzdGF0aWMgUHlNZXRob2REZWYgY3J5cHRvX1BLQ1MxMl9tZXRob2RzW10gPQoreworICAgIEFERF9NRVRIT0QoZ2V0X2NlcnRpZmljYXRlKSwKKyAgICBBRERfTUVUSE9EKGdldF9wcml2YXRla2V5KSwKKyAgICBBRERfTUVUSE9EKGdldF9jYV9jZXJ0aWZpY2F0ZXMpLAorICAgIHsgTlVMTCwgTlVMTCB9Cit9OworI3VuZGVmIEFERF9NRVRIT0QKKworLyoKKyAqIENvbnN0cnVjdG9yIGZvciBQS0NTMTIgb2JqZWN0cywgbmV2ZXIgY2FsbGVkIGJ5IFB5dGhvbiBjb2RlIGRpcmVjdGx5LgorICogVGhlIHN0cmF0ZWd5IGZvciB0aGlzIG9iamVjdCBpcyB0byBjcmVhdGUgYWxsIHRoZSBQeXRob24gb2JqZWN0cworICogY29ycmVzcG9uZGluZyB0byB0aGUgY2VydC9rZXkvQ0EgY2VydHMgcmlnaHQgYXdheQorICoKKyAqIEFyZ3VtZW50czogcDEyICAgICAgICAtIEEgInJlYWwiIFBLQ1MxMiBvYmplY3QKKyAqICAgICAgICAgICAgcGFzc3BocmFzZSAtIFBhc3NwaHJhc2UgdG8gdXNlIHdoZW4gZGVjcnlwdGluZyB0aGUgUEtDUzEyIG9iamVjdAorICogUmV0dXJuczogICBUaGUgbmV3bHkgY3JlYXRlZCBQS0NTMTIgb2JqZWN0CisgKi8KK2NyeXB0b19QS0NTMTJPYmogKgorY3J5cHRvX1BLQ1MxMl9OZXcoUEtDUzEyICpwMTIsIGNoYXIgKnBhc3NwaHJhc2UpCit7CisgICAgY3J5cHRvX1BLQ1MxMk9iaiAqc2VsZjsKKyAgICBQeU9iamVjdCAqY2FjZXJ0b2JqID0gTlVMTDsKKworICAgIFg1MDkgKmNlcnQgPSBOVUxMOworICAgIEVWUF9QS0VZICpwa2V5ID0gTlVMTDsKKyAgICBTVEFDS19PRihYNTA5KSAqY2FjZXJ0cyA9IE5VTEw7CisKKyAgICBpbnQgaSwgY2FjZXJ0X2NvdW50ID0gMDsKKworICAgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgQ0EgY2VydCBzdGFjayAqLworICAgIGNhY2VydHMgPSBza19YNTA5X25ld19udWxsKCk7CisKKyAgICAvKiBwYXJzZSB0aGUgUEtDUzEyIGx1bXAgKi8KKyAgICBpZiAoIShjYWNlcnRzICYmIFBLQ1MxMl9wYXJzZShwMTIsIHBhc3NwaHJhc2UsICZwa2V5LCAmY2VydCwgJmNhY2VydHMpKSkKKyAgICB7CisgICAgICAgIGV4Y2VwdGlvbl9mcm9tX2Vycm9yX3F1ZXVlKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghKHNlbGYgPSBQeU9iamVjdF9HQ19OZXcoY3J5cHRvX1BLQ1MxMk9iaiwgJmNyeXB0b19QS0NTMTJfVHlwZSkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHNlbGYtPmNlcnQgPSBOVUxMOworICAgIHNlbGYtPmtleSA9IE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHNlbGYtPmNhY2VydHMgPSBQeV9Ob25lOworCisgICAgaWYgKChzZWxmLT5jZXJ0ID0gKFB5T2JqZWN0ICopY3J5cHRvX1g1MDlfTmV3KGNlcnQsIDEpKSA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgaWYgKChzZWxmLT5rZXkgPSAoUHlPYmplY3QgKiljcnlwdG9fUEtleV9OZXcocGtleSwgMSkpID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAvKiBNYWtlIGEgdHVwbGUgZm9yIHRoZSBDQSBjZXJ0cyAqLworICAgIGNhY2VydF9jb3VudCA9IHNrX1g1MDlfbnVtKGNhY2VydHMpOworICAgIGlmIChjYWNlcnRfY291bnQgPiAwKQorICAgIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPmNhY2VydHMpOworICAgICAgICBpZiAoKHNlbGYtPmNhY2VydHMgPSBQeVR1cGxlX05ldyhjYWNlcnRfY291bnQpKSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2FjZXJ0X2NvdW50OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNlcnQgPSBza19YNTA5X3ZhbHVlKGNhY2VydHMsIGkpOworICAgICAgICAgICAgaWYgKChjYWNlcnRvYmogPSAoUHlPYmplY3QgKiljcnlwdG9fWDUwOV9OZXcoY2VydCwgMSkpID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oc2VsZi0+Y2FjZXJ0cywgaSwgY2FjZXJ0b2JqKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNrX1g1MDlfZnJlZShjYWNlcnRzKTsgLyogZG9uJ3QgZnJlZSB0aGUgY2VydHMsIGp1c3QgdGhlIHN0YWNrICovCisgICAgUHlPYmplY3RfR0NfVHJhY2soc2VsZik7CisKKyAgICByZXR1cm4gc2VsZjsKK2Vycm9yOgorICAgIGNyeXB0b19QS0NTMTJfZGVhbGxvYyhzZWxmKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEZpbmQgYXR0cmlidXRlCisgKgorICogQXJndW1lbnRzOiBzZWxmIC0gVGhlIFBLQ1MxMiBvYmplY3QKKyAqICAgICAgICAgICAgbmFtZSAtIFRoZSBhdHRyaWJ1dGUgbmFtZQorICogUmV0dXJuczogICBBIFB5dGhvbiBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUsIG9yIE5VTEwgaWYgc29tZXRoaW5nIHdlbnQKKyAqICAgICAgICAgICAgd3JvbmcKKyAqLworc3RhdGljIFB5T2JqZWN0ICoKK2NyeXB0b19QS0NTMTJfZ2V0YXR0cihjcnlwdG9fUEtDUzEyT2JqICpzZWxmLCBjaGFyICpuYW1lKQoreworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKGNyeXB0b19QS0NTMTJfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7Cit9CisKKy8qCisgKiBDYWxsIHRoZSB2aXNpdHByb2Mgb24gYWxsIGNvbnRhaW5lZCBvYmplY3RzLgorICoKKyAqIEFyZ3VtZW50czogc2VsZiAtIFRoZSBQS0NTMTIgb2JqZWN0CisgKiAgICAgICAgICAgIHZpc2l0IC0gRnVuY3Rpb24gdG8gY2FsbAorICogICAgICAgICAgICBhcmcgLSBFeHRyYSBhcmd1bWVudCB0byB2aXNpdAorICogUmV0dXJuczogICAwIGlmIGFsbCBnb2VzIHdlbGwsIG90aGVyd2lzZSB0aGUgcmV0dXJuIGNvZGUgZnJvbSB0aGUgZmlyc3QKKyAqICAgICAgICAgICAgY2FsbCB0aGF0IGdhdmUgbm9uLXplcm8gcmVzdWx0LgorICovCitzdGF0aWMgaW50CitjcnlwdG9fUEtDUzEyX3RyYXZlcnNlKGNyeXB0b19QS0NTMTJPYmogKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQoreworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKHJldCA9PSAwICYmIHNlbGYtPmNlcnQgIT0gTlVMTCkKKyAgICAgICAgcmV0ID0gdmlzaXQoc2VsZi0+Y2VydCwgYXJnKTsKKyAgICBpZiAocmV0ID09IDAgJiYgc2VsZi0+a2V5ICE9IE5VTEwpCisgICAgICAgIHJldCA9IHZpc2l0KHNlbGYtPmtleSwgYXJnKTsKKyAgICBpZiAocmV0ID09IDAgJiYgc2VsZi0+Y2FjZXJ0cyAhPSBOVUxMKQorICAgICAgICByZXQgPSB2aXNpdChzZWxmLT5jYWNlcnRzLCBhcmcpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBEZWNyZWYgYWxsIGNvbnRhaW5lZCBvYmplY3RzIGFuZCB6ZXJvIHRoZSBwb2ludGVycy4KKyAqCisgKiBBcmd1bWVudHM6IHNlbGYgLSBUaGUgUEtDUzEyIG9iamVjdAorICogUmV0dXJuczogICBBbHdheXMgMC4KKyAqLworc3RhdGljIGludAorY3J5cHRvX1BLQ1MxMl9jbGVhcihjcnlwdG9fUEtDUzEyT2JqICpzZWxmKQoreworICAgIFB5X1hERUNSRUYoc2VsZi0+Y2VydCk7CisgICAgc2VsZi0+Y2VydCA9IE5VTEw7CisgICAgUHlfWERFQ1JFRihzZWxmLT5rZXkpOworICAgIHNlbGYtPmtleSA9IE5VTEw7CisgICAgUHlfWERFQ1JFRihzZWxmLT5jYWNlcnRzKTsKKyAgICBzZWxmLT5jYWNlcnRzID0gTlVMTDsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIERlYWxsb2NhdGUgdGhlIG1lbW9yeSB1c2VkIGJ5IHRoZSBQS0NTMTIgb2JqZWN0CisgKgorICogQXJndW1lbnRzOiBzZWxmIC0gVGhlIFBLQ1MxMiBvYmplY3QKKyAqIFJldHVybnM6ICAgTm9uZQorICovCitzdGF0aWMgdm9pZAorY3J5cHRvX1BLQ1MxMl9kZWFsbG9jKGNyeXB0b19QS0NTMTJPYmogKnNlbGYpCit7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKKyAgICBjcnlwdG9fUEtDUzEyX2NsZWFyKHNlbGYpOworICAgIFB5T2JqZWN0X0dDX0RlbChzZWxmKTsKK30KKworUHlUeXBlT2JqZWN0IGNyeXB0b19QS0NTMTJfVHlwZSA9IHsKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLAorICAgICJQS0NTMTIiLAorICAgIHNpemVvZihjcnlwdG9fUEtDUzEyT2JqKSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWNyeXB0b19QS0NTMTJfZGVhbGxvYywKKyAgICBOVUxMLCAvKiBwcmludCAqLworICAgIChnZXRhdHRyZnVuYyljcnlwdG9fUEtDUzEyX2dldGF0dHIsCisgICAgTlVMTCwgLyogc2V0YXR0ciAqLworICAgIE5VTEwsIC8qIGNvbXBhcmUgKi8KKyAgICBOVUxMLCAvKiByZXByICovCisgICAgTlVMTCwgLyogYXNfbnVtYmVyICovCisgICAgTlVMTCwgLyogYXNfc2VxdWVuY2UgKi8KKyAgICBOVUxMLCAvKiBhc19tYXBwaW5nICovCisgICAgTlVMTCwgLyogaGFzaCAqLworICAgIE5VTEwsIC8qIGNhbGwgKi8KKyAgICBOVUxMLCAvKiBzdHIgKi8KKyAgICBOVUxMLCAvKiBnZXRhdHRybyAqLworICAgIE5VTEwsIC8qIHNldGF0dHJvICovCisgICAgTlVMTCwgLyogYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLAorICAgIE5VTEwsIC8qIGRvYyAqLworICAgICh0cmF2ZXJzZXByb2MpY3J5cHRvX1BLQ1MxMl90cmF2ZXJzZSwKKyAgICAoaW5xdWlyeSljcnlwdG9fUEtDUzEyX2NsZWFyLAorfTsKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIFBLQ1MxMiBwYXJ0IG9mIHRoZSBjcnlwdG8gc3ViIG1vZHVsZQorICoKKyAqIEFyZ3VtZW50czogZGljdCAtIFRoZSBjcnlwdG8gbW9kdWxlIGRpY3Rpb25hcnkKKyAqIFJldHVybnM6ICAgTm9uZQorICovCitpbnQKK2luaXRfY3J5cHRvX3BrY3MxMihQeU9iamVjdCAqZGljdCkKK3sKKyAgICBjcnlwdG9fUEtDUzEyX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBQeV9JTkNSRUYoJmNyeXB0b19QS0NTMTJfVHlwZSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIlBLQ1MxMlR5cGUiLCAoUHlPYmplY3QgKikmY3J5cHRvX1BLQ1MxMl9UeXBlKTsKKyAgICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9wa2NzMTIuaCBiL3NyYy9jcnlwdG8vcGtjczEyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjOWVjNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jcnlwdG8vcGtjczEyLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIHBrY3MxMi5oCisgKgorICogQ29weXJpZ2h0IChDKSBBQiBTdHJha3QgMjAwMSwgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIEV4cG9ydCBQS0NTMTIgZnVuY3Rpb25zIGFuZCBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBAKCMpICQkCisgKi8KKyNpZm5kZWYgUHlPcGVuU1NMX2NyeXB0b19QS0NTMTJfSF8KKyNkZWZpbmUgUHlPcGVuU1NMX2NyeXB0b19QS0NTMTJfSF8KKworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGtjczEyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisKK2V4dGVybiAgaW50ICAgICAgIGluaXRfY3J5cHRvX3BrY3MxMiAgIChQeU9iamVjdCAqKTsKKworZXh0ZXJuICBQeVR5cGVPYmplY3QgICAgICBjcnlwdG9fUEtDUzEyX1R5cGU7CisKKyNkZWZpbmUgY3J5cHRvX1BLQ1MxMl9DaGVjayh2KSAoKHYpLT5vYl90eXBlID09ICZjcnlwdG9fUEtDUzEyX1R5cGUpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgICAgICAgICAgICAqY2VydDsKKyAgICBQeU9iamVjdCAgICAgICAgICAgICprZXk7CisgICAgUHlPYmplY3QgICAgICAgICAgICAqY2FjZXJ0czsKK30gY3J5cHRvX1BLQ1MxMk9iajsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3BrY3M3LmMgYi9zcmMvY3J5cHRvL3BrY3M3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiMjBhOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jcnlwdG8vcGtjczcuYwpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIHBrY3M3LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIEFCIFN0cmFrdCAyMDAyLCBBbGwgcmlnaHRzIHJlc2VydmVkCisgKgorICogUEtDUzcgaGFuZGxpbmcgY29kZSwgbW9zdGx5IHRoaW4gd3JhcHBlcnMgYXJvdW5kIE9wZW5TU0wuCisgKiBTZWUgdGhlIGZpbGUgUkFUSU9OQUxFIGZvciBhIHNob3J0IGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIG1vZHVsZSB3YXMgd3JpdHRlbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxQeXRob24uaD4KKyNkZWZpbmUgY3J5cHRvX01PRFVMRQorI2luY2x1ZGUgImNyeXB0by5oIgorCitzdGF0aWMgY2hhciAqQ1ZTaWQgPSAiQCgjKSAkSWQ6IHBrY3M3LmMsdiAxLjIgMjAwMi8wNy8wOSAxMjo1NToxMyBtYXJ0aW4gRXhwICQiOworCitzdGF0aWMgY2hhciBjcnlwdG9fUEtDUzdfdHlwZV9pc19zaWduZWRfZG9jW10gPSAiXG5cCitDaGVjayBpZiB0aGlzIE5JRF9wa2NzN19zaWduZWQgb2JqZWN0XG5cCitcblwKK0FyZ3VtZW50czogc2VsZiAtIFRoZSBQS0NTNyBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIEFuIGVtcHR5IGFyZ3VtZW50IHR1cGxlXG5cCitSZXR1cm5zOiAgIFRydWUgaWYgdGhlIFBLQ1M3IGlzIG9mIHR5cGUgc2lnbmVkXG5cCisiOworCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX1BLQ1M3X3R5cGVfaXNfc2lnbmVkKGNyeXB0b19QS0NTN09iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6dHlwZV9pc19zaWduZWQiKSkgCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKFBLQ1M3X3R5cGVfaXNfc2lnbmVkKHNlbGYtPnBrY3M3KSkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKDFMKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygwTCk7Cit9CisKK3N0YXRpYyBjaGFyIGNyeXB0b19QS0NTN190eXBlX2lzX2VudmVsb3BlZF9kb2NbXSA9ICJcblwKK0NoZWNrIGlmIHRoaXMgTklEX3BrY3M3X2VudmVsb3BlZCBvYmplY3RcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIFBLQ1M3IG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gQW4gZW1wdHkgYXJndW1lbnQgdHVwbGVcblwKK1JldHVybnM6ICAgVHJ1ZSBpZiB0aGUgUEtDUzcgaXMgb2YgdHlwZSBlbnZlbG9wZWRcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fUEtDUzdfdHlwZV9pc19lbnZlbG9wZWQoY3J5cHRvX1BLQ1M3T2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjp0eXBlX2lzX2VudmVsb3BlZCIpKSAKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoUEtDUzdfdHlwZV9pc19lbnZlbG9wZWQoc2VsZi0+cGtjczcpKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoMUwpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKDBMKTsKK30KKworc3RhdGljIGNoYXIgY3J5cHRvX1BLQ1M3X3R5cGVfaXNfc2lnbmVkQW5kRW52ZWxvcGVkX2RvY1tdID0gIlxuXAorQ2hlY2sgaWYgdGhpcyBOSURfcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkIG9iamVjdFxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgUEtDUzcgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBBbiBlbXB0eSBhcmd1bWVudCB0dXBsZVxuXAorUmV0dXJuczogICBUcnVlIGlmIHRoZSBQS0NTNyBpcyBvZiB0eXBlIHNpZ25lZEFuZEVudmVsb3BlZFxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK2NyeXB0b19QS0NTN190eXBlX2lzX3NpZ25lZEFuZEVudmVsb3BlZChjcnlwdG9fUEtDUzdPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOnR5cGVfaXNfc2lnbmVkQW5kRW52ZWxvcGVkIikpIAorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChQS0NTN190eXBlX2lzX3NpZ25lZEFuZEVudmVsb3BlZChzZWxmLT5wa2NzNykpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygxTCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoMEwpOworfQorCitzdGF0aWMgY2hhciBjcnlwdG9fUEtDUzdfdHlwZV9pc19kYXRhX2RvY1tdID0gIlxuXAorQ2hlY2sgaWYgdGhpcyBOSURfcGtjczdfZGF0YSBvYmplY3RcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIFBLQ1M3IG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gQW4gZW1wdHkgYXJndW1lbnQgdHVwbGVcblwKK1JldHVybnM6ICAgVHJ1ZSBpZiB0aGUgUEtDUzcgaXMgb2YgdHlwZSBkYXRhXG5cCisiOworCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX1BLQ1M3X3R5cGVfaXNfZGF0YShjcnlwdG9fUEtDUzdPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOnR5cGVfaXNfZGF0YSIpKSAKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoUEtDUzdfdHlwZV9pc19kYXRhKHNlbGYtPnBrY3M3KSkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKDFMKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygwTCk7Cit9CisKK3N0YXRpYyBjaGFyIGNyeXB0b19QS0NTN19nZXRfdHlwZV9uYW1lX2RvY1tdID0gIlxuXAorUmV0dXJucyB0aGUgdHlwZSBuYW1lIG9mIHRoZSBQS0NTNyBzdHJ1Y3R1cmVcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIFBLQ1M3IG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gQW4gZW1wdHkgYXJndW1lbnQgdHVwbGVcblwKK1JldHVybnM6ICAgQSBzdHJpbmcgd2l0aCB0aGUgdHlwZW5hbWVcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fUEtDUzdfZ2V0X3R5cGVfbmFtZShjcnlwdG9fUEtDUzdPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldF90eXBlX25hbWUiKSkgCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogCisgICAgICogcmV0dXJuIGEgc3RyaW5nIHdpdGggdGhlIHR5cGVuYW1lCisgICAgICovCisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoT0JKX25pZDJzbihPQkpfb2JqMm5pZChzZWxmLT5wa2NzNy0+dHlwZSkpKTsKK30KKworLyoKKyAqIEFERF9NRVRIT0QobmFtZSkgZXhwYW5kcyB0byBhIGNvcnJlY3QgUHlNZXRob2REZWYgZGVjbGFyYXRpb24KKyAqICAgeyAgJ25hbWUnLCAoUHlDRnVuY3Rpb24pY3J5cHRvX1BLQ1M3X25hbWUsIE1FVEhfVkFSQVJHUyB9CisgKiBmb3IgY29udmVuaWVuY2UKKyAqLworI2RlZmluZSBBRERfTUVUSE9EKG5hbWUpICAgICAgICBcCisgICAgeyAjbmFtZSwgKFB5Q0Z1bmN0aW9uKWNyeXB0b19QS0NTN18jI25hbWUsIE1FVEhfVkFSQVJHUywgY3J5cHRvX1BLQ1M3XyMjbmFtZSMjX2RvYyB9CitzdGF0aWMgUHlNZXRob2REZWYgY3J5cHRvX1BLQ1M3X21ldGhvZHNbXSA9Cit7CisgICAgQUREX01FVEhPRCh0eXBlX2lzX3NpZ25lZCksCisgICAgQUREX01FVEhPRCh0eXBlX2lzX2VudmVsb3BlZCksCisgICAgQUREX01FVEhPRCh0eXBlX2lzX3NpZ25lZEFuZEVudmVsb3BlZCksCisgICAgQUREX01FVEhPRCh0eXBlX2lzX2RhdGEpLAorICAgIEFERF9NRVRIT0QoZ2V0X3R5cGVfbmFtZSksCisgICAgeyBOVUxMLCBOVUxMIH0KK307CisjdW5kZWYgQUREX01FVEhPRAorCisKKy8qCisgKiBDb25zdHJ1Y3RvciBmb3IgUEtDUzcgb2JqZWN0cywgbmV2ZXIgY2FsbGVkIGJ5IFB5dGhvbiBjb2RlIGRpcmVjdGx5CisgKgorICogQXJndW1lbnRzOiBwa2NzNyAgICAtIEEgInJlYWwiIHBrY3M3IGNlcnRpZmljYXRlIG9iamVjdAorICogICAgICAgICAgICBkZWFsbG9jIC0gQm9vbGVhbiB2YWx1ZSB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIGRlc3RydWN0b3Igc2hvdWxkCisgKiAgICAgICAgICAgICAgICAgICAgICBmcmVlIHRoZSAicmVhbCIgcGtjczcgb2JqZWN0CisgKiBSZXR1cm5zOiAgIFRoZSBuZXdseSBjcmVhdGVkIHBrY3M3IG9iamVjdAorICovCitjcnlwdG9fUEtDUzdPYmogKgorY3J5cHRvX1BLQ1M3X05ldyhQS0NTNyAqcGtjczcsIGludCBkZWFsbG9jKQoreworICAgIGNyeXB0b19QS0NTN09iaiAqc2VsZjsKKworICAgIHNlbGYgPSBQeU9iamVjdF9OZXcoY3J5cHRvX1BLQ1M3T2JqLCAmY3J5cHRvX1BLQ1M3X1R5cGUpOworCisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzZWxmLT5wa2NzNyA9IHBrY3M3OworICAgIHNlbGYtPmRlYWxsb2MgPSBkZWFsbG9jOworCisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qCisgKiBEZWFsbG9jYXRlIHRoZSBtZW1vcnkgdXNlZCBieSB0aGUgUEtDUzcgb2JqZWN0CisgKgorICogQXJndW1lbnRzOiBzZWxmIC0gVGhlIFBLQ1M3IG9iamVjdAorICogUmV0dXJuczogICBOb25lCisgKi8KK3N0YXRpYyB2b2lkCitjcnlwdG9fUEtDUzdfZGVhbGxvYyhjcnlwdG9fUEtDUzdPYmogKnNlbGYpCit7CisgICAgLyogU29tZXRpbWVzIHdlIGRvbid0IGhhdmUgdG8gZGVhbGxvYyB0aGUgInJlYWwiIFBLQ1M3IHBvaW50ZXIgb3Vyc2VsdmVzICovCisgICAgaWYgKHNlbGYtPmRlYWxsb2MpCisgICAgICAgIFBLQ1M3X2ZyZWUoc2VsZi0+cGtjczcpOworCisgICAgUHlPYmplY3RfRGVsKHNlbGYpOworfQorCisvKgorICogRmluZCBhdHRyaWJ1dGUKKyAqCisgKiBBcmd1bWVudHM6IHNlbGYgLSBUaGUgUEtDUzcgb2JqZWN0CisgKiAgICAgICAgICAgIG5hbWUgLSBUaGUgYXR0cmlidXRlIG5hbWUKKyAqIFJldHVybnM6ICAgQSBQeXRob24gb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlLCBvciBOVUxMIGlmIHNvbWV0aGluZyB3ZW50CisgKiAgICAgICAgICAgIHdyb25nCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fUEtDUzdfZ2V0YXR0cihjcnlwdG9fUEtDUzdPYmogKnNlbGYsIGNoYXIgKm5hbWUpCit7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QoY3J5cHRvX1BLQ1M3X21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworfQorCitQeVR5cGVPYmplY3QgY3J5cHRvX1BLQ1M3X1R5cGUgPSB7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwKKyAgICAiUEtDUzciLAorICAgIHNpemVvZihjcnlwdG9fUEtDUzdPYmopLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpY3J5cHRvX1BLQ1M3X2RlYWxsb2MsCisgICAgTlVMTCwgLyogcHJpbnQgKi8KKyAgICAoZ2V0YXR0cmZ1bmMpY3J5cHRvX1BLQ1M3X2dldGF0dHIsCisgICAgTlVMTCwgLyogc2V0YXR0ciAqLworICAgIE5VTEwsIC8qIGNvbXBhcmUgKi8KKyAgICBOVUxMLCAvKiByZXByICovCisgICAgTlVMTCwgLyogYXNfbnVtYmVyICovCisgICAgTlVMTCwgLyogYXNfc2VxdWVuY2UgKi8KKyAgICBOVUxMLCAvKiBhc19tYXBwaW5nICovCisgICAgTlVMTCwgLyogaGFzaCAqLworICAgIE5VTEwsIC8qIGNhbGwgKi8KKyAgICBOVUxMICAvKiBzdHIgKi8KK307CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBQS0NTNyBwYXJ0IG9mIHRoZSBjcnlwdG8gc3ViIG1vZHVsZQorICoKKyAqIEFyZ3VtZW50czogZGljdCAtIFRoZSBjcnlwdG8gbW9kdWxlIGRpY3Rpb25hcnkKKyAqIFJldHVybnM6ICAgTm9uZQorICovCitpbnQKK2luaXRfY3J5cHRvX3BrY3M3KFB5T2JqZWN0ICpkaWN0KQoreworICAgIGNyeXB0b19QS0NTN19UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlfSU5DUkVGKCZjcnlwdG9fUEtDUzdfVHlwZSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIlBLQ1M3VHlwZSIsIChQeU9iamVjdCAqKSZjcnlwdG9fUEtDUzdfVHlwZSk7CisgICAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcGtjczcuaCBiL3NyYy9jcnlwdG8vcGtjczcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGJiNDI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NyeXB0by9wa2NzNy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBwa2NzNy5oCisgKgorICogQ29weXJpZ2h0IChDKSBBQiBTdHJha3QgMjAwMiwgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIEV4cG9ydCBwa2NzNyBmdW5jdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlLgorICogU2VlIHRoZSBmaWxlIFJBVElPTkFMRSBmb3IgYSBzaG9ydCBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBtb2R1bGUgd2FzIHdyaXR0ZW4uCisgKgorICogQCgjKSAkSWQ6IHBrY3M3LmgsdiAxLjIgMjAwMi8wOS8wNCAyMjoyNDo1OSBpa28gRXhwICQKKyAqLworI2lmbmRlZiBQeU9wZW5TU0xfY3J5cHRvX1BLQ1M3X0hfCisjZGVmaW5lIFB5T3BlblNTTF9jcnlwdG9fUEtDUzdfSF8KKworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGtjczcuaD4KKworZXh0ZXJuICBpbnQgICAgICAgaW5pdF9jcnlwdG9fcGtjczcgICAoUHlPYmplY3QgKik7CisKK2V4dGVybiAgUHlUeXBlT2JqZWN0ICAgICAgY3J5cHRvX1BLQ1M3X1R5cGU7CisKKyNkZWZpbmUgY3J5cHRvX1BLQ1M3X0NoZWNrKHYpICgodiktPm9iX3R5cGUgPT0gJmNyeXB0b19QS0NTN19UeXBlKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFBLQ1M3ICAgICAgICAgICAgICAgICpwa2NzNzsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBkZWFsbG9jOworfSBjcnlwdG9fUEtDUzdPYmo7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3BrZXkuYyBiL3NyYy9jcnlwdG8vcGtleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMTk2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY3J5cHRvL3BrZXkuYwpAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIHBrZXkuYworICoKKyAqIENvcHlyaWdodCAoQykgQUIgU3RyYWt0IDIwMDEsIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBQdWJsaWMvcml2YXRlIGtleSBoYW5kbGluZyBjb2RlLCBtb3N0bHkgdGhpbiB3cmFwcGVycyBhcm91bmQgT3BlblNTTC4KKyAqIFNlZSB0aGUgZmlsZSBSQVRJT05BTEUgZm9yIGEgc2hvcnQgZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgbW9kdWxlIHdhcyB3cml0dGVuLgorICoKKyAqLworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2RlZmluZSBjcnlwdG9fTU9EVUxFCisjaW5jbHVkZSAiY3J5cHRvLmgiCisKK3N0YXRpYyBjaGFyICpDVlNpZCA9ICJAKCMpICRJZDogcGtleS5jLHYgMS45IDIwMDIvMDcvMDkgMTM6NDc6MjEgbWFydGluIEV4cCAkIjsKKworLyoKKyAqIFRoaXMgaXMgZG9uZSBldmVyeSB0aW1lIHNvbWV0aGluZyBmYWlscywgc28gdHVybmluZyBpdCBpbnRvIGEgbWFjcm8gaXMKKyAqIHJlYWxseSBuaWNlLgorICoKKyAqIEFyZ3VtZW50czogICBOb25lCisgKiBSZXR1cm5zOiAgICAgRG9lc24ndCByZXR1cm4KKyAqLworI2RlZmluZSBGQUlMKCkgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBleGNlcHRpb25fZnJvbV9lcnJvcl9xdWV1ZSgpOyAgICAgICBcCisgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyAgICAKKworc3RhdGljIGNoYXIgY3J5cHRvX1BLZXlfZ2VuZXJhdGVfa2V5X2RvY1tdID0gIlxuXAorR2VuZXJhdGUgYSBrZXkgb2YgYSBnaXZlbiB0eXBlLCB3aXRoIGEgZ2l2ZW4gbnVtYmVyIG9mIGEgYml0c1xuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgUEtleSBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZTpcblwKKyAgICAgICAgICAgICB0eXBlIC0gVGhlIGtleSB0eXBlIChUWVBFX1JTQSBvciBUWVBFX0RTQSlcblwKKyAgICAgICAgICAgICBiaXRzIC0gVGhlIG51bWJlciBvZiBiaXRzXG5cCitSZXR1cm5zOiAgIE5vbmVcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fUEtleV9nZW5lcmF0ZV9rZXkoY3J5cHRvX1BLZXlPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGludCB0eXBlLCBiaXRzOworICAgIFJTQSAqcnNhOworICAgIERTQSAqZHNhOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpnZW5lcmF0ZV9rZXkiLCAmdHlwZSwgJmJpdHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgY3J5cHRvX1RZUEVfUlNBOgorICAgICAgICAgICAgaWYgKChyc2EgPSBSU0FfZ2VuZXJhdGVfa2V5KGJpdHMsIDB4MTAwMDEsIE5VTEwsIE5VTEwpKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIEZBSUwoKTsKKyAgICAgICAgICAgIGlmICghRVZQX1BLRVlfYXNzaWduX1JTQShzZWxmLT5wa2V5LCByc2EpKQorICAgICAgICAgICAgICAgIEZBSUwoKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgIHJldHVybiBQeV9Ob25lOworCisgICAgICAgIGNhc2UgY3J5cHRvX1RZUEVfRFNBOgorICAgICAgICAgICAgaWYgKChkc2EgPSBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVycyhiaXRzLCBOVUxMLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBGQUlMKCk7CisgICAgICAgICAgICBpZiAoIURTQV9nZW5lcmF0ZV9rZXkoZHNhKSkKKyAgICAgICAgICAgICAgICBGQUlMKCk7CisgICAgICAgICAgICBpZiAoIUVWUF9QS0VZX2Fzc2lnbl9EU0Eoc2VsZi0+cGtleSwgZHNhKSkKKyAgICAgICAgICAgICAgICBGQUlMKCk7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisKKyAgICBQeUVycl9TZXRTdHJpbmcoY3J5cHRvX0Vycm9yLCAiTm8gc3VjaCBrZXkgdHlwZSIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KKworc3RhdGljIGNoYXIgY3J5cHRvX1BLZXlfYml0c19kb2NbXSA9ICJcblwKK1JldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIG9mIHRoZSBrZXlcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIFBLZXkgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmUgZW1wdHlcblwKK1JldHVybnM6IFRoZSBudW1iZXIgb2YgYml0cyBvZiB0aGUga2V5LlxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK2NyeXB0b19QS2V5X2JpdHMoY3J5cHRvX1BLZXlPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmJpdHMiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoRVZQX1BLRVlfYml0cyhzZWxmLT5wa2V5KSk7Cit9CisKK3N0YXRpYyBjaGFyIGNyeXB0b19QS2V5X3R5cGVfZG9jW10gPSAiXG5cCitSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBrZXlcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIFBLZXkgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmUgZW1wdHlcblwKK1JldHVybnM6IFRoZSB0eXBlIG9mIHRoZSBrZXkuXG5cCisiOworCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX1BLZXlfdHlwZShjcnlwdG9fUEtleU9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6dHlwZSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT5wa2V5LT50eXBlKTsKK30KKworCisvKgorICogQUREX01FVEhPRChuYW1lKSBleHBhbmRzIHRvIGEgY29ycmVjdCBQeU1ldGhvZERlZiBkZWNsYXJhdGlvbgorICogICB7ICAnbmFtZScsIChQeUNGdW5jdGlvbiljcnlwdG9fUEtleV9uYW1lLCBNRVRIX1ZBUkFSR1MgfQorICogZm9yIGNvbnZlbmllbmNlCisgKi8KKyNkZWZpbmUgQUREX01FVEhPRChuYW1lKSAgICAgICAgXAorICAgIHsgI25hbWUsIChQeUNGdW5jdGlvbiljcnlwdG9fUEtleV8jI25hbWUsIE1FVEhfVkFSQVJHUywgY3J5cHRvX1BLZXlfIyNuYW1lIyNfZG9jIH0KK3N0YXRpYyBQeU1ldGhvZERlZiBjcnlwdG9fUEtleV9tZXRob2RzW10gPQoreworICAgIEFERF9NRVRIT0QoZ2VuZXJhdGVfa2V5KSwKKyAgICBBRERfTUVUSE9EKGJpdHMpLAorICAgIEFERF9NRVRIT0QodHlwZSksCisgICAgeyBOVUxMLCBOVUxMIH0KK307CisjdW5kZWYgQUREX01FVEhPRAorCisKKy8qCisgKiBDb25zdHJ1Y3RvciBmb3IgUEtleSBvYmplY3RzLCBuZXZlciBjYWxsZWQgYnkgUHl0aG9uIGNvZGUgZGlyZWN0bHkKKyAqCisgKiBBcmd1bWVudHM6IHBrZXkgICAgLSBBICJyZWFsIiBFVlBfUEtFWSBvYmplY3QKKyAqICAgICAgICAgICAgZGVhbGxvYyAtIEJvb2xlYW4gdmFsdWUgdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSBkZXN0cnVjdG9yIHNob3VsZAorICogICAgICAgICAgICAgICAgICAgICAgZnJlZSB0aGUgInJlYWwiIEVWUF9QS0VZIG9iamVjdAorICogUmV0dXJuczogICBUaGUgbmV3bHkgY3JlYXRlZCBQS2V5IG9iamVjdAorICovCitjcnlwdG9fUEtleU9iaiAqCitjcnlwdG9fUEtleV9OZXcoRVZQX1BLRVkgKnBrZXksIGludCBkZWFsbG9jKQoreworICAgIGNyeXB0b19QS2V5T2JqICpzZWxmOworCisgICAgc2VsZiA9IFB5T2JqZWN0X05ldyhjcnlwdG9fUEtleU9iaiwgJmNyeXB0b19QS2V5X1R5cGUpOworCisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzZWxmLT5wa2V5ID0gcGtleTsKKyAgICBzZWxmLT5kZWFsbG9jID0gZGVhbGxvYzsKKworICAgIHJldHVybiBzZWxmOworfQorCisvKgorICogRGVhbGxvY2F0ZSB0aGUgbWVtb3J5IHVzZWQgYnkgdGhlIFBLZXkgb2JqZWN0CisgKgorICogQXJndW1lbnRzOiBzZWxmIC0gVGhlIFBLZXkgb2JqZWN0CisgKiBSZXR1cm5zOiAgIE5vbmUKKyAqLworc3RhdGljIHZvaWQKK2NyeXB0b19QS2V5X2RlYWxsb2MoY3J5cHRvX1BLZXlPYmogKnNlbGYpCit7CisgICAgLyogU29tZXRpbWVzIHdlIGRvbid0IGhhdmUgdG8gZGVhbGxvYyB0aGUgInJlYWwiIEVWUF9QS0VZIHBvaW50ZXIgb3Vyc2VsdmVzICovCisgICAgaWYgKHNlbGYtPmRlYWxsb2MpCisgICAgICAgIEVWUF9QS0VZX2ZyZWUoc2VsZi0+cGtleSk7CisKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7Cit9CisKKy8qCisgKiBGaW5kIGF0dHJpYnV0ZQorICoKKyAqIEFyZ3VtZW50czogc2VsZiAtIFRoZSBQS2V5IG9iamVjdAorICogICAgICAgICAgICBuYW1lIC0gVGhlIGF0dHJpYnV0ZSBuYW1lCisgKiBSZXR1cm5zOiAgIEEgUHl0aG9uIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSwgb3IgTlVMTCBpZiBzb21ldGhpbmcgd2VudAorICogICAgICAgICAgICB3cm9uZworICovCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX1BLZXlfZ2V0YXR0cihjcnlwdG9fUEtleU9iaiAqc2VsZiwgY2hhciAqbmFtZSkKK3sKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChjcnlwdG9fUEtleV9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKK30KKworUHlUeXBlT2JqZWN0IGNyeXB0b19QS2V5X1R5cGUgPSB7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwKKyAgICAiUEtleSIsCisgICAgc2l6ZW9mKGNyeXB0b19QS2V5T2JqKSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWNyeXB0b19QS2V5X2RlYWxsb2MsCisgICAgTlVMTCwgLyogcHJpbnQgKi8KKyAgICAoZ2V0YXR0cmZ1bmMpY3J5cHRvX1BLZXlfZ2V0YXR0ciwKKyAgICBOVUxMLCAvKiBzZXRhdHRyICovCisgICAgTlVMTCwgLyogY29tcGFyZSAqLworICAgIE5VTEwsIC8qIHJlcHIgKi8KKyAgICBOVUxMLCAvKiBhc19udW1iZXIgKi8KKyAgICBOVUxMLCAvKiBhc19zZXF1ZW5jZSAqLworICAgIE5VTEwsIC8qIGFzX21hcHBpbmcgKi8KKyAgICBOVUxMLCAvKiBoYXNoICovCit9OworCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBQS2V5IHBhcnQgb2YgdGhlIGNyeXB0byBzdWIgbW9kdWxlCisgKgorICogQXJndW1lbnRzOiBkaWN0IC0gVGhlIGNyeXB0byBtb2R1bGUgZGljdGlvbmFyeQorICogUmV0dXJuczogICBOb25lCisgKi8KK2ludAoraW5pdF9jcnlwdG9fcGtleShQeU9iamVjdCAqZGljdCkKK3sKKyAgICBjcnlwdG9fUEtleV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlfSU5DUkVGKCZjcnlwdG9fUEtleV9UeXBlKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiUEtleVR5cGUiLCAoUHlPYmplY3QgKikmY3J5cHRvX1BLZXlfVHlwZSk7CisgICAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcGtleS5oIGIvc3JjL2NyeXB0by9wa2V5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ2ZTM2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jcnlwdG8vcGtleS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBwa2V5LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIEFCIFN0cmFrdCAyMDAxLCBBbGwgcmlnaHRzIHJlc2VydmVkCisgKgorICogRXhwb3J0IHBrZXkgZnVuY3Rpb25zIGFuZCBkYXRhIHN0cnVjdHVyZS4KKyAqIFNlZSB0aGUgZmlsZSBSQVRJT05BTEUgZm9yIGEgc2hvcnQgZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgbW9kdWxlIHdhcyB3cml0dGVuLgorICoKKyAqIEAoIykgJElkOiBwa2V5LmgsdiAxLjUgMjAwMi8wOS8wNCAyMjoyNDo1OSBpa28gRXhwICQKKyAqLworI2lmbmRlZiBQeU9wZW5TU0xfY3J5cHRvX1BLRVlfSF8KKyNkZWZpbmUgUHlPcGVuU1NMX2NyeXB0b19QS0VZX0hfCisKK2V4dGVybiAgaW50ICAgICAgIGluaXRfY3J5cHRvX3BrZXkgICAoUHlPYmplY3QgKik7CisKK2V4dGVybiAgUHlUeXBlT2JqZWN0ICAgIGNyeXB0b19QS2V5X1R5cGU7CisKKyNkZWZpbmUgY3J5cHRvX1BLZXlfQ2hlY2sodikgKCh2KS0+b2JfdHlwZSA9PSAmY3J5cHRvX1BLZXlfVHlwZSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBFVlBfUEtFWSAgICAgICAgICAgICpwa2V5OworICAgIGludCAgICAgICAgICAgICAgICAgIGRlYWxsb2M7Cit9IGNyeXB0b19QS2V5T2JqOworCisjZGVmaW5lIGNyeXB0b19UWVBFX1JTQSAgICAgICAgICAgRVZQX1BLRVlfUlNBCisjZGVmaW5lIGNyeXB0b19UWVBFX0RTQSAgICAgICAgICAgRVZQX1BLRVlfRFNBCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5LmMgYi9zcmMvY3J5cHRvL3g1MDkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2FlNWY2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NyeXB0by94NTA5LmMKQEAgLTAsMCArMSw1OTEgQEAKKy8qCisgKiB4NTA5LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIEFCIFN0cmFrdCAyMDAxLCBBbGwgcmlnaHRzIHJlc2VydmVkCisgKgorICogQ2VydGlmaWNhdGUgKFguNTA5KSBoYW5kbGluZyBjb2RlLCBtb3N0bHkgdGhpbiB3cmFwcGVycyBhcm91bmQgT3BlblNTTC4KKyAqIFNlZSB0aGUgZmlsZSBSQVRJT05BTEUgZm9yIGEgc2hvcnQgZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgbW9kdWxlIHdhcyB3cml0dGVuLgorICoKKyAqIFJldmlld2VkIDIwMDEtMDctMjMKKyAqLworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2RlZmluZSBjcnlwdG9fTU9EVUxFCisjaW5jbHVkZSAiY3J5cHRvLmgiCisKK3N0YXRpYyBjaGFyICpDVlNpZCA9ICJAKCMpICRJZDogeDUwOS5jLHYgMS4yMCAyMDA0LzA4LzEwIDEwOjM3OjMxIG1hcnRpbiBFeHAgJCI7CisKKy8qIAorICogWC41MDkgaXMgYSBzdGFuZGFyZCBmb3IgZGlnaXRhbCBjZXJ0aWZpY2F0ZXMuICBTZWUgZS5nLiB0aGUgT3BlblNTTCBob21lcGFnZQorICogaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8gZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqLworCitzdGF0aWMgY2hhciBjcnlwdG9fWDUwOV9nZXRfdmVyc2lvbl9kb2NbXSA9ICJcblwKK1JldHVybiB2ZXJzaW9uIG51bWJlciBvZiB0aGUgY2VydGlmaWNhdGVcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIFg1MDkgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmUgZW1wdHlcblwKK1JldHVybnM6ICAgVmVyc2lvbiBudW1iZXIgYXMgYSBQeXRob24gaW50ZWdlclxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK2NyeXB0b19YNTA5X2dldF92ZXJzaW9uKGNyeXB0b19YNTA5T2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXRfdmVyc2lvbiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylYNTA5X2dldF92ZXJzaW9uKHNlbGYtPng1MDkpKTsKK30KKworc3RhdGljIGNoYXIgY3J5cHRvX1g1MDlfc2V0X3ZlcnNpb25fZG9jW10gPSAiXG5cCitTZXQgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGNlcnRpZmljYXRlXG5cCitcblwKK0FyZ3VtZW50czogc2VsZiAtIFRoZSBYNTA5IG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlOlxuXAorICAgICAgICAgICAgIHZlcnNpb24gLSBUaGUgdmVyc2lvbiBudW1iZXJcblwKK1JldHVybnM6ICAgTm9uZVxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK2NyeXB0b19YNTA5X3NldF92ZXJzaW9uKGNyeXB0b19YNTA5T2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBpbnQgdmVyc2lvbjsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRfdmVyc2lvbiIsICZ2ZXJzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBYNTA5X3NldF92ZXJzaW9uKHNlbGYtPng1MDksIHZlcnNpb24pOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCitzdGF0aWMgY2hhciBjcnlwdG9fWDUwOV9nZXRfc2VyaWFsX251bWJlcl9kb2NbXSA9ICJcblwKK1JldHVybiBzZXJpYWwgbnVtYmVyIG9mIHRoZSBjZXJ0aWZpY2F0ZVxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgWDUwOSBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZSBlbXB0eVxuXAorUmV0dXJuczogICBTZXJpYWwgbnVtYmVyIGFzIGEgUHl0aG9uIGludGVnZXJcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fWDUwOV9nZXRfc2VyaWFsX251bWJlcihjcnlwdG9fWDUwOU9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgQVNOMV9JTlRFR0VSICphc24xX2k7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXRfc2VyaWFsX251bWJlciIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGFzbjFfaSA9IFg1MDlfZ2V0X3NlcmlhbE51bWJlcihzZWxmLT54NTA5KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoQVNOMV9JTlRFR0VSX2dldChhc24xX2kpKTsKK30KKworc3RhdGljIGNoYXIgY3J5cHRvX1g1MDlfc2V0X3NlcmlhbF9udW1iZXJfZG9jW10gPSAiXG5cCitTZXQgc2VyaWFsIG51bWJlciBvZiB0aGUgY2VydGlmaWNhdGVcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIFg1MDkgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAgc2VyaWFsIC0gVGhlIHNlcmlhbCBudW1iZXJcblwKK1JldHVybnM6ICAgTm9uZVxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK2NyeXB0b19YNTA5X3NldF9zZXJpYWxfbnVtYmVyKGNyeXB0b19YNTA5T2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBsb25nIHNlcmlhbDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibDpzZXRfc2VyaWFsX251bWJlciIsICZzZXJpYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIEFTTjFfSU5URUdFUl9zZXQoWDUwOV9nZXRfc2VyaWFsTnVtYmVyKHNlbGYtPng1MDkpLCBzZXJpYWwpOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCitzdGF0aWMgY2hhciBjcnlwdG9fWDUwOV9nZXRfaXNzdWVyX2RvY1tdID0gIlxuXAorQ3JlYXRlIGFuIFg1MDlOYW1lIG9iamVjdCBmb3IgdGhlIGlzc3VlciBvZiB0aGUgY2VydGlmaWNhdGVcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIFg1MDkgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmUgZW1wdHlcblwKK1JldHVybnM6ICAgQW4gWDUwOU5hbWUgb2JqZWN0XG5cCisiOworCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX1g1MDlfZ2V0X2lzc3VlcihjcnlwdG9fWDUwOU9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY3J5cHRvX1g1MDlOYW1lT2JqICpweW5hbWU7CisgICAgWDUwOV9OQU1FICpuYW1lOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0X2lzc3VlciIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG5hbWUgPSBYNTA5X2dldF9pc3N1ZXJfbmFtZShzZWxmLT54NTA5KTsKKyAgICBweW5hbWUgPSBjcnlwdG9fWDUwOU5hbWVfTmV3KG5hbWUsIDApOworICAgIGlmIChweW5hbWUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHB5bmFtZS0+cGFyZW50X2NlcnQgPSAoUHlPYmplY3QgKilzZWxmOworICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilweW5hbWU7Cit9CisKK3N0YXRpYyBjaGFyIGNyeXB0b19YNTA5X3NldF9pc3N1ZXJfZG9jW10gPSAiXG5cCitTZXQgdGhlIGlzc3VlciBvZiB0aGUgY2VydGlmaWNhdGVcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIFg1MDkgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAgaXNzdWVyIC0gVGhlIGlzc3VlciBuYW1lXG5cCitSZXR1cm5zOiAgIE5vbmVcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fWDUwOV9zZXRfaXNzdWVyKGNyeXB0b19YNTA5T2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjcnlwdG9fWDUwOU5hbWVPYmogKmlzc3VlcjsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6c2V0X2lzc3VlciIsICZjcnlwdG9fWDUwOU5hbWVfVHlwZSwKKwkJCSAgJmlzc3VlcikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKCFYNTA5X3NldF9pc3N1ZXJfbmFtZShzZWxmLT54NTA5LCBpc3N1ZXItPng1MDlfbmFtZSkpCisgICAgeworICAgICAgICBleGNlcHRpb25fZnJvbV9lcnJvcl9xdWV1ZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBjaGFyIGNyeXB0b19YNTA5X2dldF9zdWJqZWN0X2RvY1tdID0gIlxuXAorQ3JlYXRlIGFuIFg1MDlOYW1lIG9iamVjdCBmb3IgdGhlIHN1YmplY3Qgb2YgdGhlIGNlcnRpZmljYXRlXG5cCitcblwKK0FyZ3VtZW50czogc2VsZiAtIFRoZSBYNTA5IG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlIGVtcHR5XG5cCitSZXR1cm5zOiAgIEFuIFg1MDlOYW1lIG9iamVjdFxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK2NyeXB0b19YNTA5X2dldF9zdWJqZWN0KGNyeXB0b19YNTA5T2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjcnlwdG9fWDUwOU5hbWVPYmogKnB5bmFtZTsKKyAgICBYNTA5X05BTUUgKm5hbWU7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXRfc3ViamVjdCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG5hbWUgPSBYNTA5X2dldF9zdWJqZWN0X25hbWUoc2VsZi0+eDUwOSk7CisgICAgcHluYW1lID0gY3J5cHRvX1g1MDlOYW1lX05ldyhuYW1lLCAwKTsKKyAgICBpZiAocHluYW1lICE9IE5VTEwpCisgICAgeworICAgICAgICBweW5hbWUtPnBhcmVudF9jZXJ0ID0gKFB5T2JqZWN0ICopc2VsZjsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcHluYW1lOworfQorCitzdGF0aWMgY2hhciBjcnlwdG9fWDUwOV9zZXRfc3ViamVjdF9kb2NbXSA9ICJcblwKK1NldCB0aGUgc3ViamVjdCBvZiB0aGUgY2VydGlmaWNhdGVcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIFg1MDkgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAgc3ViamVjdCAtIFRoZSBzdWJqZWN0IG5hbWVcblwKK1JldHVybnM6ICAgTm9uZVxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK2NyeXB0b19YNTA5X3NldF9zdWJqZWN0KGNyeXB0b19YNTA5T2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjcnlwdG9fWDUwOU5hbWVPYmogKnN1YmplY3Q7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOnNldF9zdWJqZWN0IiwgJmNyeXB0b19YNTA5TmFtZV9UeXBlLAorCQkJICAmc3ViamVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKCFYNTA5X3NldF9zdWJqZWN0X25hbWUoc2VsZi0+eDUwOSwgc3ViamVjdC0+eDUwOV9uYW1lKSkKKyAgICB7CisgICAgICAgIGV4Y2VwdGlvbl9mcm9tX2Vycm9yX3F1ZXVlKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KKworc3RhdGljIGNoYXIgY3J5cHRvX1g1MDlfZ2V0X3B1YmtleV9kb2NbXSA9ICJcblwKK0dldCB0aGUgcHVibGljIGtleSBvZiB0aGUgY2VydGlmaWNhdGVcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIFg1MDkgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmUgZW1wdHlcblwKK1JldHVybnM6ICAgVGhlIHB1YmxpYyBrZXlcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fWDUwOV9nZXRfcHVia2V5KGNyeXB0b19YNTA5T2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjcnlwdG9fUEtleU9iaiAqY3J5cHRvX1BLZXlfTmV3KEVWUF9QS0VZICosIGludCk7CisgICAgRVZQX1BLRVkgKnBrZXk7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXRfcHVia2V5IikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKChwa2V5ID0gWDUwOV9nZXRfcHVia2V5KHNlbGYtPng1MDkpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNyeXB0b19QS2V5X05ldyhwa2V5LCAwKTsKK30KKworc3RhdGljIGNoYXIgY3J5cHRvX1g1MDlfc2V0X3B1YmtleV9kb2NbXSA9ICJcblwKK1NldCB0aGUgcHVibGljIGtleSBvZiB0aGUgY2VydGlmaWNhdGVcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIFg1MDkgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAgcGtleSAtIFRoZSBwdWJsaWMga2V5XG5cCitSZXR1cm5zOiAgIE5vbmVcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fWDUwOV9zZXRfcHVia2V5KGNyeXB0b19YNTA5T2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjcnlwdG9fUEtleU9iaiAqcGtleTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6c2V0X3B1YmtleSIsICZjcnlwdG9fUEtleV9UeXBlLCAmcGtleSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKCFYNTA5X3NldF9wdWJrZXkoc2VsZi0+eDUwOSwgcGtleS0+cGtleSkpCisgICAgeworICAgICAgICBleGNlcHRpb25fZnJvbV9lcnJvcl9xdWV1ZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBjaGFyIGNyeXB0b19YNTA5X2dtdGltZV9hZGpfbm90QmVmb3JlX2RvY1tdID0gIlxuXAorQWRqdXN0IHRoZSB0aW1lIHN0YW1wIGZvciB3aGVuIHRoZSBjZXJ0aWZpY2F0ZSBzdGFydHMgYmVpbmcgdmFsaWRcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIFg1MDkgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAgaSAtIFRoZSBhZGp1c3RtZW50XG5cCitSZXR1cm5zOiAgIE5vbmVcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fWDUwOV9nbXRpbWVfYWRqX25vdEJlZm9yZShjcnlwdG9fWDUwOU9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgbG9uZyBpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOmdtdGltZV9hZGpfbm90QmVmb3JlIiwgJmkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIFg1MDlfZ210aW1lX2FkaihYNTA5X2dldF9ub3RCZWZvcmUoc2VsZi0+eDUwOSksIGkpOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCitzdGF0aWMgY2hhciBjcnlwdG9fWDUwOV9nbXRpbWVfYWRqX25vdEFmdGVyX2RvY1tdID0gIlxuXAorQWRqdXN0IHRoZSB0aW1lIHN0YW1wIGZvciB3aGVuIHRoZSBjZXJ0aWZpY2F0ZSBzdG9wcyBiZWluZyB2YWxpZFxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgWDUwOSBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZTpcblwKKyAgICAgICAgICAgICBpIC0gVGhlIGFkanVzdG1lbnRcblwKK1JldHVybnM6ICAgTm9uZVxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK2NyeXB0b19YNTA5X2dtdGltZV9hZGpfbm90QWZ0ZXIoY3J5cHRvX1g1MDlPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGxvbmcgaTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibDpnbXRpbWVfYWRqX25vdEFmdGVyIiwgJmkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIFg1MDlfZ210aW1lX2FkaihYNTA5X2dldF9ub3RBZnRlcihzZWxmLT54NTA5KSwgaSk7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBjaGFyIGNyeXB0b19YNTA5X3NpZ25fZG9jW10gPSAiXG5cCitTaWduIHRoZSBjZXJ0aWZpY2F0ZSB1c2luZyB0aGUgc3VwcGxpZWQga2V5IGFuZCBkaWdlc3RcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIFg1MDkgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAgcGtleSAgIC0gVGhlIGtleSB0byBzaWduIHdpdGhcblwKKyAgICAgICAgICAgICBkaWdlc3QgLSBUaGUgbWVzc2FnZSBkaWdlc3QgdG8gdXNlXG5cCitSZXR1cm5zOiAgIE5vbmVcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fWDUwOV9zaWduKGNyeXB0b19YNTA5T2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjcnlwdG9fUEtleU9iaiAqcGtleTsKKyAgICBjaGFyICpkaWdlc3RfbmFtZTsKKyAgICBjb25zdCBFVlBfTUQgKmRpZ2VzdDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyFzOnNpZ24iLCAmY3J5cHRvX1BLZXlfVHlwZSwgJnBrZXksCisJCQkgICZkaWdlc3RfbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKChkaWdlc3QgPSBFVlBfZ2V0X2RpZ2VzdGJ5bmFtZShkaWdlc3RfbmFtZSkpID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIk5vIHN1Y2ggZGlnZXN0IG1ldGhvZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIVg1MDlfc2lnbihzZWxmLT54NTA5LCBwa2V5LT5wa2V5LCBkaWdlc3QpKQorICAgIHsKKyAgICAgICAgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCitzdGF0aWMgY2hhciBjcnlwdG9fWDUwOV9oYXNfZXhwaXJlZF9kb2NbXSA9ICJcblwKK0NoZWNrIHdoZXRoZXIgdGhlIGNlcnRpZmljYXRlIGhhcyBleHBpcmVkLlxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgWDUwOSBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZSBlbXB0eVxuXAorUmV0dXJuczogICBUcnVlIGlmIHRoZSBjZXJ0aWZpY2F0ZSBoYXMgZXhwaXJlZCwgZmFsc2Ugb3RoZXJ3aXNlXG5cCisiOworCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX1g1MDlfaGFzX2V4cGlyZWQoY3J5cHRvX1g1MDlPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIHRpbWVfdCB0bm93OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6aGFzX2V4cGlyZWQiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICB0bm93ID0gdGltZShOVUxMKTsKKyAgICBpZiAoQVNOMV9VVENUSU1FX2NtcF90aW1lX3QoWDUwOV9nZXRfbm90QWZ0ZXIoc2VsZi0+eDUwOSksIHRub3cpIDwgMCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKDFMKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygwTCk7Cit9CisKK3N0YXRpYyBjaGFyIGNyeXB0b19YNTA5X3N1YmplY3RfbmFtZV9oYXNoX2RvY1tdID0gIlxuXAorUmV0dXJuIHRoZSBoYXNoIG9mIHRoZSBYNTA5IHN1YmplY3QuXG5cCitcblwKK0FyZ3VtZW50czogc2VsZiAtIFRoZSBYNTA5IG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlIGVtcHR5XG5cCitSZXR1cm5zOiAgIFRoZSBoYXNoIG9mIHRoZSBzdWJqZWN0XG5cCisiOworCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX1g1MDlfc3ViamVjdF9uYW1lX2hhc2goY3J5cHRvX1g1MDlPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOnN1YmplY3RfbmFtZV9oYXNoIikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhYNTA5X3N1YmplY3RfbmFtZV9oYXNoKHNlbGYtPng1MDkpKTsKK30KKworc3RhdGljIGNoYXIgY3J5cHRvX1g1MDlfZGlnZXN0X2RvY1tdID0gIlxuXAorUmV0dXJuIHRoZSBkaWdlc3Qgb2YgdGhlIFg1MDkgb2JqZWN0LlxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgWDUwOSBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZSBlbXB0eVxuXAorUmV0dXJuczogICBUaGUgZGlnZXN0IG9mIHRoZSBvYmplY3RcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fWDUwOV9kaWdlc3QoY3J5cHRvX1g1MDlPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIHVuc2lnbmVkIGNoYXIgZnBbRVZQX01BWF9NRF9TSVpFXTsKKyAgICBjaGFyICp0bXA7CisgICAgY2hhciAqZGlnZXN0X25hbWU7CisgICAgaW50IGxlbixpOworICAgIFB5T2JqZWN0ICpyZXQ7CisgICAgY29uc3QgRVZQX01EICpkaWdlc3Q7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZGlnZXN0IiwgJmRpZ2VzdF9uYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoKGRpZ2VzdCA9IEVWUF9nZXRfZGlnZXN0YnluYW1lKGRpZ2VzdF9uYW1lKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiTm8gc3VjaCBkaWdlc3QgbWV0aG9kIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghWDUwOV9kaWdlc3Qoc2VsZi0+eDUwOSxkaWdlc3QsZnAsJmxlbikpCisgICAgeworICAgICAgICBleGNlcHRpb25fZnJvbV9lcnJvcl9xdWV1ZSgpOworICAgIH0KKyAgICB0bXAgPSBtYWxsb2MoMypsZW4rMSk7CisgICAgbWVtc2V0KHRtcCwgMCwgMypsZW4rMSk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIHNwcmludGYodG1wK2kqMywiJTAyWDoiLGZwW2ldKTsKKyAgICB9CisgICAgdG1wWzMqbGVuLTFdID0gMDsKKyAgICByZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh0bXAsMypsZW4tMSk7CisgICAgZnJlZSh0bXApOworICAgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGNoYXIgY3J5cHRvX1g1MDlfYWRkX2V4dGVuc2lvbnNfZG9jW10gPSAiXG5cCitBZGQgZXh0ZW5zaW9ucyB0byB0aGUgY2VydGlmaWNhdGUuXG5cCitcblwKK0FyZ3VtZW50czogc2VsZiAtIFg1MDkgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAgZXh0ZW5zaW9ucyAtIGEgc2VxdWVuY2Ugb2YgWDUwOUV4dGVuc2lvbiBvYmplY3RzXG5cCitSZXR1cm5zOiAgIE5vbmVcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fWDUwOV9hZGRfZXh0ZW5zaW9ucyhjcnlwdG9fWDUwOU9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7ICAgCisgICAgUHlPYmplY3QgKmV4dGVuc2lvbnMsICpzZXE7CisgICAgY3J5cHRvX1g1MDlFeHRlbnNpb25PYmogKmV4dDsKKyAgICBpbnQgbnJfb2ZfZXh0ZW5zaW9ucywgaTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzphZGRfZXh0ZW5zaW9ucyIsICZleHRlbnNpb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzZXEgPSBQeVNlcXVlbmNlX0Zhc3QoZXh0ZW5zaW9ucywgIkV4cGVjdGVkIGEgc2VxdWVuY2UiKTsKKyAgICBpZiAoc2VxID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgbnJfb2ZfZXh0ZW5zaW9ucyA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShzZXEpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5yX29mX2V4dGVuc2lvbnM7IGkrKykKKyAgICB7IAorICAgICAgICBleHQgPSAoY3J5cHRvX1g1MDlFeHRlbnNpb25PYmogKilQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oc2VxLCBpKTsKKyAgICAgICAgaWYgKCFjcnlwdG9fWDUwOUV4dGVuc2lvbl9DaGVjayhleHQpKQorICAgICAgICB7ICAgCisgICAgICAgICAgICBQeV9ERUNSRUYoc2VxKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPbmUgb2YgdGhlIGVsZW1lbnRzIGlzIG5vdCBhbiBYNTA5RXh0ZW5zaW9uIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVg1MDlfYWRkX2V4dChzZWxmLT54NTA5LCBleHQtPng1MDlfZXh0ZW5zaW9uLCAtMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZXEpOworICAgICAgICAgICAgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCisvKgorICogQUREX01FVEhPRChuYW1lKSBleHBhbmRzIHRvIGEgY29ycmVjdCBQeU1ldGhvZERlZiBkZWNsYXJhdGlvbgorICogICB7ICAnbmFtZScsIChQeUNGdW5jdGlvbiljcnlwdG9fWDUwOV9uYW1lLCBNRVRIX1ZBUkFSR1MgfQorICogZm9yIGNvbnZlbmllbmNlCisgKi8KKyNkZWZpbmUgQUREX01FVEhPRChuYW1lKSAgICAgICAgXAorICAgIHsgI25hbWUsIChQeUNGdW5jdGlvbiljcnlwdG9fWDUwOV8jI25hbWUsIE1FVEhfVkFSQVJHUywgY3J5cHRvX1g1MDlfIyNuYW1lIyNfZG9jIH0KK3N0YXRpYyBQeU1ldGhvZERlZiBjcnlwdG9fWDUwOV9tZXRob2RzW10gPQoreworICAgIEFERF9NRVRIT0QoZ2V0X3ZlcnNpb24pLAorICAgIEFERF9NRVRIT0Qoc2V0X3ZlcnNpb24pLAorICAgIEFERF9NRVRIT0QoZ2V0X3NlcmlhbF9udW1iZXIpLAorICAgIEFERF9NRVRIT0Qoc2V0X3NlcmlhbF9udW1iZXIpLAorICAgIEFERF9NRVRIT0QoZ2V0X2lzc3VlciksCisgICAgQUREX01FVEhPRChzZXRfaXNzdWVyKSwKKyAgICBBRERfTUVUSE9EKGdldF9zdWJqZWN0KSwKKyAgICBBRERfTUVUSE9EKHNldF9zdWJqZWN0KSwKKyAgICBBRERfTUVUSE9EKGdldF9wdWJrZXkpLAorICAgIEFERF9NRVRIT0Qoc2V0X3B1YmtleSksCisgICAgQUREX01FVEhPRChnbXRpbWVfYWRqX25vdEJlZm9yZSksCisgICAgQUREX01FVEhPRChnbXRpbWVfYWRqX25vdEFmdGVyKSwKKyAgICBBRERfTUVUSE9EKHNpZ24pLAorICAgIEFERF9NRVRIT0QoaGFzX2V4cGlyZWQpLAorICAgIEFERF9NRVRIT0Qoc3ViamVjdF9uYW1lX2hhc2gpLAorICAgIEFERF9NRVRIT0QoZGlnZXN0KSwKKyAgICBBRERfTUVUSE9EKGFkZF9leHRlbnNpb25zKSwKKyAgICB7IE5VTEwsIE5VTEwgfQorfTsKKyN1bmRlZiBBRERfTUVUSE9ECisKKworLyoKKyAqIENvbnN0cnVjdG9yIGZvciBYNTA5IG9iamVjdHMsIG5ldmVyIGNhbGxlZCBieSBQeXRob24gY29kZSBkaXJlY3RseQorICoKKyAqIEFyZ3VtZW50czogY2VydCAgICAtIEEgInJlYWwiIFg1MDkgY2VydGlmaWNhdGUgb2JqZWN0CisgKiAgICAgICAgICAgIGRlYWxsb2MgLSBCb29sZWFuIHZhbHVlIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgZGVzdHJ1Y3RvciBzaG91bGQKKyAqICAgICAgICAgICAgICAgICAgICAgIGZyZWUgdGhlICJyZWFsIiBYNTA5IG9iamVjdAorICogUmV0dXJuczogICBUaGUgbmV3bHkgY3JlYXRlZCBYNTA5IG9iamVjdAorICovCitjcnlwdG9fWDUwOU9iaiAqCitjcnlwdG9fWDUwOV9OZXcoWDUwOSAqY2VydCwgaW50IGRlYWxsb2MpCit7CisgICAgY3J5cHRvX1g1MDlPYmogKnNlbGY7CisKKyAgICBzZWxmID0gUHlPYmplY3RfTmV3KGNyeXB0b19YNTA5T2JqLCAmY3J5cHRvX1g1MDlfVHlwZSk7CisKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHNlbGYtPng1MDkgPSBjZXJ0OworICAgIHNlbGYtPmRlYWxsb2MgPSBkZWFsbG9jOworCisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qCisgKiBEZWFsbG9jYXRlIHRoZSBtZW1vcnkgdXNlZCBieSB0aGUgWDUwOSBvYmplY3QKKyAqCisgKiBBcmd1bWVudHM6IHNlbGYgLSBUaGUgWDUwOSBvYmplY3QKKyAqIFJldHVybnM6ICAgTm9uZQorICovCitzdGF0aWMgdm9pZAorY3J5cHRvX1g1MDlfZGVhbGxvYyhjcnlwdG9fWDUwOU9iaiAqc2VsZikKK3sKKyAgICAvKiBTb21ldGltZXMgd2UgZG9uJ3QgaGF2ZSB0byBkZWFsbG9jIHRoZSAicmVhbCIgWDUwOSBwb2ludGVyIG91cnNlbHZlcyAqLworICAgIGlmIChzZWxmLT5kZWFsbG9jKQorICAgICAgICBYNTA5X2ZyZWUoc2VsZi0+eDUwOSk7CisKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7Cit9CisKKy8qCisgKiBGaW5kIGF0dHJpYnV0ZQorICoKKyAqIEFyZ3VtZW50czogc2VsZiAtIFRoZSBYNTA5IG9iamVjdAorICogICAgICAgICAgICBuYW1lIC0gVGhlIGF0dHJpYnV0ZSBuYW1lCisgKiBSZXR1cm5zOiAgIEEgUHl0aG9uIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSwgb3IgTlVMTCBpZiBzb21ldGhpbmcgd2VudAorICogICAgICAgICAgICB3cm9uZworICovCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX1g1MDlfZ2V0YXR0cihjcnlwdG9fWDUwOU9iaiAqc2VsZiwgY2hhciAqbmFtZSkKK3sKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChjcnlwdG9fWDUwOV9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKK30KKworUHlUeXBlT2JqZWN0IGNyeXB0b19YNTA5X1R5cGUgPSB7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwKKyAgICAiWDUwOSIsCisgICAgc2l6ZW9mKGNyeXB0b19YNTA5T2JqKSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWNyeXB0b19YNTA5X2RlYWxsb2MsCisgICAgTlVMTCwgLyogcHJpbnQgKi8KKyAgICAoZ2V0YXR0cmZ1bmMpY3J5cHRvX1g1MDlfZ2V0YXR0ciwKK307CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBYNTA5IHBhcnQgb2YgdGhlIGNyeXB0byBzdWIgbW9kdWxlCisgKgorICogQXJndW1lbnRzOiBkaWN0IC0gVGhlIGNyeXB0byBtb2R1bGUgZGljdGlvbmFyeQorICogUmV0dXJuczogICBOb25lCisgKi8KK2ludAoraW5pdF9jcnlwdG9feDUwOShQeU9iamVjdCAqZGljdCkKK3sKKyAgICBjcnlwdG9fWDUwOV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlfSU5DUkVGKCZjcnlwdG9fWDUwOV9UeXBlKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiWDUwOVR5cGUiLCAoUHlPYmplY3QgKikmY3J5cHRvX1g1MDlfVHlwZSk7CisgICAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOS5oIGIvc3JjL2NyeXB0by94NTA5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA3NjhjZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jcnlwdG8veDUwOS5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiB4NTA5LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIEFCIFN0cmFrdCAyMDAxLCBBbGwgcmlnaHRzIHJlc2VydmVkCisgKgorICogRXhwb3J0IHg1MDkgZnVuY3Rpb25zIGFuZCBkYXRhIHN0cnVjdHVyZS4KKyAqIFNlZSB0aGUgZmlsZSBSQVRJT05BTEUgZm9yIGEgc2hvcnQgZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgbW9kdWxlIHdhcyB3cml0dGVuLgorICoKKyAqIFJldmlld2VkIDIwMDEtMDctMjMKKyAqCisgKiBAKCMpICRJZDogeDUwOS5oLHYgMS45IDIwMDIvMDkvMDQgMjI6MjQ6NTkgaWtvIEV4cCAkCisgKi8KKyNpZm5kZWYgUHlPcGVuU1NMX2NyeXB0b19YNTA5X0hfCisjZGVmaW5lIFB5T3BlblNTTF9jcnlwdG9fWDUwOV9IXworCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKworZXh0ZXJuICBpbnQgICAgICAgaW5pdF9jcnlwdG9feDUwOSAgIChQeU9iamVjdCAqKTsKKworZXh0ZXJuICBQeVR5cGVPYmplY3QgICAgICBjcnlwdG9fWDUwOV9UeXBlOworCisjZGVmaW5lIGNyeXB0b19YNTA5X0NoZWNrKHYpICgodiktPm9iX3R5cGUgPT0gJmNyeXB0b19YNTA5X1R5cGUpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgWDUwOSAgICAgICAgICAgICAgICAqeDUwOTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBkZWFsbG9jOworfSBjcnlwdG9fWDUwOU9iajsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOWV4dC5jIGIvc3JjL2NyeXB0by94NTA5ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2MjhjMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jcnlwdG8veDUwOWV4dC5jCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICogeDUwOWV4dC5jCisgKgorICogRXhwb3J0IFguNTA5IGV4dGVuc2lvbiBmdW5jdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcy4KKyAqIFNlZSB0aGUgZmlsZSBSQVRJT05BTEUgZm9yIGEgc2hvcnQgZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgbW9kdWxlIHdhcyB3cml0dGVuLgorICoKKyAqIEAoIykgJElkOiB4NTA5ZXh0LmMsdiAxLjEgMjAwMi8wNy8wOSAxMzozNDo0NiBtYXJ0aW4gRXhwICQKKyAqLworCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjZGVmaW5lIGNyeXB0b19NT0RVTEUKKyNpbmNsdWRlICJjcnlwdG8uaCIKKworc3RhdGljIGNoYXIgKkNWU2lkID0gIkAoIykgJElkOiB4NTA5ZXh0LmMsdiAxLjEgMjAwMi8wNy8wOSAxMzozNDo0NiBtYXJ0aW4gRXhwICQiOworCitzdGF0aWMgY2hhciBjcnlwdG9fWDUwOUV4dGVuc2lvbl9nZXRfY3JpdGljYWxfZG9jW10gPSAiXG5cCitSZXR1cm5zIHRoZSBjcml0aWNhbCBmaWVsZCBvZiB0aGUgWDUwOUV4dGVuc2lvblxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgWDUwOUV4dGVuc2lvbiBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlIGVtcHR5XG5cCitSZXR1cm5zOiBUaGUgY3JpdGljYWwgZmllbGQuXG5cCisiOworCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX1g1MDlFeHRlbnNpb25fZ2V0X2NyaXRpY2FsKGNyeXB0b19YNTA5RXh0ZW5zaW9uT2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXRfY3JpdGljYWwiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoWDUwOV9FWFRFTlNJT05fZ2V0X2NyaXRpY2FsKHNlbGYtPng1MDlfZXh0ZW5zaW9uKSk7Cit9CisKKy8qCisgKiBBRERfTUVUSE9EKG5hbWUpIGV4cGFuZHMgdG8gYSBjb3JyZWN0IFB5TWV0aG9kRGVmIGRlY2xhcmF0aW9uCisgKiAgIHsgICduYW1lJywgKFB5Q0Z1bmN0aW9uKWNyeXB0b19YNTA5RXh0ZW5zaW9uX25hbWUsIE1FVEhfVkFSQVJHUyB9CisgKiBmb3IgY29udmVuaWVuY2UKKyAqLworI2RlZmluZSBBRERfTUVUSE9EKG5hbWUpICAgICAgICBcCit7ICNuYW1lLCAoUHlDRnVuY3Rpb24pY3J5cHRvX1g1MDlFeHRlbnNpb25fIyNuYW1lLCBNRVRIX1ZBUkFSR1MsIGNyeXB0b19YNTA5RXh0ZW5zaW9uXyMjbmFtZSMjX2RvYyB9CitzdGF0aWMgUHlNZXRob2REZWYgY3J5cHRvX1g1MDlFeHRlbnNpb25fbWV0aG9kc1tdID0KK3sKKyAgICBBRERfTUVUSE9EKGdldF9jcml0aWNhbCksCisgICAgeyBOVUxMLCBOVUxMIH0KK307CisjdW5kZWYgQUREX01FVEhPRAorCisvKgorICogQ29uc3RydWN0b3IgZm9yIFg1MDlFeHRlbnNpb24sIG5ldmVyIGNhbGxlZCBieSBQeXRob24gY29kZSBkaXJlY3RseQorICoKKyAqIEFyZ3VtZW50czogdHlwZV9uYW1lIC0gPz8/CisgKiAgICAgICAgICAgIGNyaXRpY2FsICAtID8/PworICogICAgICAgICAgICB2YWx1ZSAgICAgLSA/Pz8KKyAqIFJldHVybnM6ICAgVGhlIG5ld2x5IGNyZWF0ZWQgWDUwOUV4dGVuc2lvbiBvYmplY3QKKyAqLworY3J5cHRvX1g1MDlFeHRlbnNpb25PYmogKgorY3J5cHRvX1g1MDlFeHRlbnNpb25fTmV3KGNoYXIgKnR5cGVfbmFtZSwgaW50IGNyaXRpY2FsLCBjaGFyICp2YWx1ZSkKK3sKKyAgICBjcnlwdG9fWDUwOUV4dGVuc2lvbk9iaiAqc2VsZjsKKyAgICBpbnQgZXh0X2xlbiwgZXh0X25pZDsKKyAgICB1bnNpZ25lZCBjaGFyICpleHRfZGVyOworICAgIFg1MDlWM19FWFRfTUVUSE9EICpleHRfbWV0aG9kID0gTlVMTDsKKyAgICBBU04xX09DVEVUX1NUUklORyAqZXh0X29jdDsKKyAgICBTVEFDS19PRihDT05GX1ZBTFVFKSAqbnZhbDsKKyAgICB2b2lkICogZXh0X3N0cnVjdDsKKyAgICBYNTA5X0VYVEVOU0lPTiAqZXh0ZW5zaW9uID0gTlVMTDsKKworICAgIHNlbGYgPSBQeU9iamVjdF9OZXcoY3J5cHRvX1g1MDlFeHRlbnNpb25PYmosICZjcnlwdG9fWDUwOUV4dGVuc2lvbl9UeXBlKTsKKworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogVHJ5IHRvIGdldCBhIE5JRCBmb3IgdGhlIG5hbWUgKi8KKyAgICBpZiAoKGV4dF9uaWQgPSBPQkpfc24ybmlkKHR5cGVfbmFtZSkpID09IE5JRF91bmRlZikKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiVW5rbm93biBleHRlbnNpb24gbmFtZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBMb29rdXAgdGhlIGV4dGVuc2lvbiBtZXRob2Qgc3RydWN0dXJlICovCisgICAgaWYgKCEoZXh0X21ldGhvZCA9IFg1MDlWM19FWFRfZ2V0X25pZChleHRfbmlkKSkpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIlVua25vd24gZXh0ZW5zaW9uIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIExvb2sgaWYgaXQgaGFzIGEgZnVuY3Rpb24gdG8gY29udmVydCB2YWx1ZSB0byBhbiAKKyAgICAgKiBpbnRlcm5hbCBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgaWYgKCFleHRfbWV0aG9kLT52MmkpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkNhbid0IGluaXRpYWxpemUgZXhjZXB0aW9uIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIFBhcnNlIHRoZSB2YWx1ZSAqLworICAgIG52YWwgPSBYNTA5VjNfcGFyc2VfbGlzdCh2YWx1ZSk7CisgICAgaWYgKCFudmFsKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJJbnZhbGlkIGV4dGVuc2lvbiBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogQW5kIHVzZSBpdCB0byBnZXQgdGhlIGludGVybmFsIHN0cnVjdHVyZSAqLworICAgIGlmKCEoZXh0X3N0cnVjdCA9IGV4dF9tZXRob2QtPnYyaShleHRfbWV0aG9kLCBOVUxMLCBudmFsKSkpIHsKKyAgICAgICAgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogRGVhbGxvY2F0ZSB0aGUgY29uZmlndXJhdGlvbiB2YWx1ZSBzdGFjayAqLworICAgIHNrX0NPTkZfVkFMVUVfcG9wX2ZyZWUobnZhbCwgWDUwOVYzX2NvbmZfZnJlZSk7CisgICAgICAgIAorICAgIC8qIEZpbmQgb3V0IGhvdyBtdWNoIG1lbW9yeSB3ZSBuZWVkICovCisKKworICAgIC8qIENvbnZlcnQgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gdG8gREVSICovCisgICAgLyogYW5kIEFsbG9jYXRlICovCisgICAgaWYgKGV4dF9tZXRob2QtPml0KSB7CisgICAgICAgIGV4dF9kZXIgPSBOVUxMOworICAgICAgICBleHRfbGVuID0gQVNOMV9pdGVtX2kyZChleHRfc3RydWN0LCAmZXh0X2RlciwgQVNOMV9JVEVNX3B0cihleHRfbWV0aG9kLT5pdCkpOworICAgICAgICBpZiAoZXh0X2xlbiA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqcDsKKyAgICAgICAgZXh0X2xlbiA9IGV4dF9tZXRob2QtPmkyZChleHRfc3RydWN0LCBOVUxMKTsKKyAgICAgICAgaWYoIShleHRfZGVyID0gbWFsbG9jKGV4dF9sZW4pKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcCA9IGV4dF9kZXI7CisgICAgICAgIGV4dF9tZXRob2QtPmkyZChleHRfc3RydWN0LCAmcCk7CisgICAgfQorCisgICAgLyogQW5kIGNyZWF0ZSB0aGUgQVNOMV9PQ1RFVF9TVFJJTkcgKi8KKyAgICBpZighKGV4dF9vY3QgPSBNX0FTTjFfT0NURVRfU1RSSU5HX25ldygpKSkgeworICAgICAgICBleGNlcHRpb25fZnJvbV9lcnJvcl9xdWV1ZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgICAgIAorICAgIGV4dF9vY3QtPmRhdGEgPSBleHRfZGVyOworICAgIGV4dF9vY3QtPmxlbmd0aCA9IGV4dF9sZW47CisKKyAgICAvKiBOb3cgdGhhdCB3ZSBnb3QgYWxsIGluZ3JlZGllbnRzLCBtYWtlIHRoZSBleHRlbnNpb24gKi8KKyAgICBleHRlbnNpb24gPSBYNTA5X0VYVEVOU0lPTl9jcmVhdGVfYnlfTklEKE5VTEwsIGV4dF9uaWQsIGNyaXRpY2FsLCBleHRfb2N0KTsKKyAgICBpZiAoZXh0ZW5zaW9uID09IE5VTEwpCisgICAgeworICAgICAgICBleGNlcHRpb25fZnJvbV9lcnJvcl9xdWV1ZSgpOworICAgICAgICBNX0FTTjFfT0NURVRfU1RSSU5HX2ZyZWUoZXh0X29jdCk7CisgICAgICAgIGV4dF9tZXRob2QtPmV4dF9mcmVlKGV4dF9zdHJ1Y3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgCisgICAgTV9BU04xX09DVEVUX1NUUklOR19mcmVlKGV4dF9vY3QpOworICAgIC8vZXh0X21ldGhvZC0+ZXh0X2ZyZWUoZXh0X3N0cnVjdCk7CisKKyAgICBzZWxmLT54NTA5X2V4dGVuc2lvbiA9IGV4dGVuc2lvbjsKKyAgICBzZWxmLT5kZWFsbG9jID0gMTsKKworICAgIHJldHVybiBzZWxmOworfQorCisvKgorICogRGVhbGxvY2F0ZSB0aGUgbWVtb3J5IHVzZWQgYnkgdGhlIFg1MDlFeHRlbnNpb24gb2JqZWN0CisgKgorICogQXJndW1lbnRzOiBzZWxmIC0gVGhlIFg1MDlFeHRlbnNpb24gb2JqZWN0CisgKiBSZXR1cm5zOiAgIE5vbmUKKyAqLworc3RhdGljIHZvaWQKK2NyeXB0b19YNTA5RXh0ZW5zaW9uX2RlYWxsb2MoY3J5cHRvX1g1MDlFeHRlbnNpb25PYmogKnNlbGYpCit7CisgICAgLyogU29tZXRpbWVzIHdlIGRvbid0IGhhdmUgdG8gZGVhbGxvYyB0aGlzICovCisgICAgaWYgKHNlbGYtPmRlYWxsb2MpCisgICAgICAgIFg1MDlfRVhURU5TSU9OX2ZyZWUoc2VsZi0+eDUwOV9leHRlbnNpb24pOworCisgICAgUHlPYmplY3RfRGVsKHNlbGYpOworfQorCisvKgorICogRmluZCBhdHRyaWJ1dGUKKyAqCisgKiBBcmd1bWVudHM6IHNlbGYgLSBUaGUgWDUwOUV4dGVuc2lvbiBvYmplY3QKKyAqICAgICAgICAgICAgbmFtZSAtIFRoZSBhdHRyaWJ1dGUgbmFtZQorICogUmV0dXJuczogQSBQeXRob24gb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlLCBvciBOVUxMIGlmIHNvbWV0aGluZworICogICAgICAgICAgd2VudCB3cm9uZy4KKyAqLyAgICAgICAKK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fWDUwOUV4dGVuc2lvbl9nZXRhdHRyKGNyeXB0b19YNTA5RXh0ZW5zaW9uT2JqICpzZWxmLCBjaGFyICpuYW1lKQoreworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKGNyeXB0b19YNTA5RXh0ZW5zaW9uX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworfQorCisvKgorICogUHJpbnQgYSBuaWNlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNlcnRpZmljYXRlIHJlcXVlc3QuCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fWDUwOUV4dGVuc2lvbl9zdHIoY3J5cHRvX1g1MDlFeHRlbnNpb25PYmogKnNlbGYpCit7CisgICAgaW50IHN0cl9sZW47CisgICAgY2hhciAqdG1wX3N0cjsKKyAgICBQeU9iamVjdCAqc3RyOworICAgIEJJTyAqYmlvID0gQklPX25ldyhCSU9fc19tZW0oKSk7CisKKyAgICBpZiAoIVg1MDlWM19FWFRfcHJpbnQoYmlvLCBzZWxmLT54NTA5X2V4dGVuc2lvbiwgMCwgMCkpCisgICAgeworICAgICAgICBCSU9fZnJlZShiaW8pOworICAgICAgICBleGNlcHRpb25fZnJvbV9lcnJvcl9xdWV1ZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzdHJfbGVuID0gQklPX2dldF9tZW1fZGF0YShiaW8sICZ0bXBfc3RyKTsKKyAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh0bXBfc3RyLCBzdHJfbGVuKTsKKworICAgIEJJT19mcmVlKGJpbyk7CisKKyAgICByZXR1cm4gc3RyOworfQorCitQeVR5cGVPYmplY3QgY3J5cHRvX1g1MDlFeHRlbnNpb25fVHlwZSA9IHsKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLAorICAgICJYNTA5RXh0ZW5zaW9uIiwKKyAgICBzaXplb2YoY3J5cHRvX1g1MDlFeHRlbnNpb25PYmopLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpY3J5cHRvX1g1MDlFeHRlbnNpb25fZGVhbGxvYywgCisgICAgTlVMTCwgLyogcHJpbnQgKi8KKyAgICAoZ2V0YXR0cmZ1bmMpY3J5cHRvX1g1MDlFeHRlbnNpb25fZ2V0YXR0ciwgCisgICAgTlVMTCwgLyogc2V0YXR0ciAgKHNldGF0dHJmdW5jKWNyeXB0b19YNTA5TmFtZV9zZXRhdHRyLCAqLworICAgIE5VTEwsIC8qIGNvbXBhcmUgKi8KKyAgICBOVUxMLCAvKiByZXByICovIAorICAgIE5VTEwsIC8qIGFzX251bWJlciAqLworICAgIE5VTEwsIC8qIGFzX3NlcXVlbmNlICovCisgICAgTlVMTCwgLyogYXNfbWFwcGluZyAqLworICAgIE5VTEwsIC8qIGhhc2ggKi8KKyAgICBOVUxMLCAvKiBjYWxsICovCisgICAgKHJlcHJmdW5jKWNyeXB0b19YNTA5RXh0ZW5zaW9uX3N0ciAvKiBzdHIgKi8KK307CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBYNTA5RXh0ZW5zaW9uIHBhcnQgb2YgdGhlIGNyeXB0byBtb2R1bGUKKyAqCisgKiBBcmd1bWVudHM6IGRpY3QgLSBUaGUgY3J5cHRvIG1vZHVsZSBkaWN0aW9uYXJ5CisgKiBSZXR1cm5zOiAgIE5vbmUKKyAqLworaW50Citpbml0X2NyeXB0b194NTA5ZXh0ZW5zaW9uKFB5T2JqZWN0ICpkaWN0KQoreworICAgIGNyeXB0b19YNTA5RXh0ZW5zaW9uX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBQeV9JTkNSRUYoJmNyeXB0b19YNTA5RXh0ZW5zaW9uX1R5cGUpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJYNTA5RXh0ZW5zaW9uVHlwZSIsCisgICAgICAgICAgICAoUHlPYmplY3QgKikmY3J5cHRvX1g1MDlFeHRlbnNpb25fVHlwZSk7CisgICAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOWV4dC5oIGIvc3JjL2NyeXB0by94NTA5ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIwZTU2MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jcnlwdG8veDUwOWV4dC5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiB4NTA5ZXh0LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIEF3YW5pbSAyMDAyLCBBbGwgcmlnaHRzIHJlc2VydmVkCisgKgorICogRXhwb3J0IFguNTA5IGV4dGVuc2lvbiBmdW5jdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcy4KKyAqIFNlZSB0aGUgZmlsZSBSQVRJT05BTEUgZm9yIGEgc2hvcnQgZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgbW9kdWxlIHdhcyB3cml0dGVuLgorICoKKyAqIEAoIykgJElkOiB4NTA5ZXh0LmgsdiAxLjIgMjAwMi8wOS8wNCAyMjoyNDo1OSBpa28gRXhwICQKKyAqLworI2lmbmRlZiBQeU9wZW5TU0xfY3J5cHRvX1g1MDlFWFRFTlNJT05fSF8KKyNkZWZpbmUgUHlPcGVuU1NMX2NyeXB0b19YNTA5RVhURU5TSU9OX0hfCisKKyNpbmNsdWRlIDxQeXRob24uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKK2V4dGVybiAgaW50ICAgICBpbml0X2NyeXB0b194NTA5ZXh0ZW5zaW9uICAgICAgIChQeU9iamVjdCAqKTsKKworZXh0ZXJuICBQeVR5cGVPYmplY3QgICAgICBjcnlwdG9fWDUwOUV4dGVuc2lvbl9UeXBlOworCisjZGVmaW5lIGNyeXB0b19YNTA5RXh0ZW5zaW9uX0NoZWNrKHYpICgodiktPm9iX3R5cGUgPT0gXAorCQkJCSAgICAgICAmY3J5cHRvX1g1MDlFeHRlbnNpb25fVHlwZSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBYNTA5X0VYVEVOU0lPTiAgICAgICAqeDUwOV9leHRlbnNpb247CisgICAgaW50ICAgICAgICAgICAgICAgICAgZGVhbGxvYzsKK30gY3J5cHRvX1g1MDlFeHRlbnNpb25PYmo7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDluYW1lLmMgYi9zcmMvY3J5cHRvL3g1MDluYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjljMDIzMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jcnlwdG8veDUwOW5hbWUuYwpAQCAtMCwwICsxLDMwNyBAQAorLyoKKyAqIHg1MDluYW1lLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIEFCIFN0cmFrdCAyMDAxLCBBbGwgcmlnaHRzIHJlc2VydmVkCisgKgorICogWC41MDkgTmFtZSBoYW5kbGluZywgbW9zdGx5IHRoaW4gd3JhcHBpbmcuCisgKiBTZWUgdGhlIGZpbGUgUkFUSU9OQUxFIGZvciBhIHNob3J0IGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIG1vZHVsZSB3YXMgd3JpdHRlbi4KKyAqCisgKiBSZXZpZXdlZCAyMDAxLTA3LTIzCisgKi8KKyNpbmNsdWRlIDxQeXRob24uaD4KKyNkZWZpbmUgY3J5cHRvX01PRFVMRQorI2luY2x1ZGUgImNyeXB0by5oIgorCitzdGF0aWMgY2hhciAqQ1ZTaWQgPSAiQCgjKSAkSWQ6IHg1MDluYW1lLmMsdiAxLjE2IDIwMDMvMDEvMDkgMTc6MDg6MzIgbWFydGluIEV4cCAkIjsKKworCisvKgorICogQ29uc3RydWN0b3IgZm9yIFg1MDlOYW1lLCBuZXZlciBjYWxsZWQgYnkgUHl0aG9uIGNvZGUgZGlyZWN0bHkKKyAqCisgKiBBcmd1bWVudHM6IG5hbWUgICAgLSBBICJyZWFsIiBYNTA5X05BTUUgb2JqZWN0CisgKiAgICAgICAgICAgIGRlYWxsb2MgLSBCb29sZWFuIHZhbHVlIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgZGVzdHJ1Y3RvciBzaG91bGQKKyAqICAgICAgICAgICAgICAgICAgICAgIGZyZWUgdGhlICJyZWFsIiBYNTA5X05BTUUgb2JqZWN0CisgKiBSZXR1cm5zOiAgIFRoZSBuZXdseSBjcmVhdGVkIFg1MDlOYW1lIG9iamVjdAorICovCitjcnlwdG9fWDUwOU5hbWVPYmogKgorY3J5cHRvX1g1MDlOYW1lX05ldyhYNTA5X05BTUUgKm5hbWUsIGludCBkZWFsbG9jKQoreworICAgIGNyeXB0b19YNTA5TmFtZU9iaiAqc2VsZjsKKworICAgIHNlbGYgPSBQeU9iamVjdF9HQ19OZXcoY3J5cHRvX1g1MDlOYW1lT2JqLCAmY3J5cHRvX1g1MDlOYW1lX1R5cGUpOworCisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzZWxmLT54NTA5X25hbWUgPSBuYW1lOworICAgIHNlbGYtPmRlYWxsb2MgPSBkZWFsbG9jOworICAgIHNlbGYtPnBhcmVudF9jZXJ0ID0gTlVMTDsKKworICAgIFB5T2JqZWN0X0dDX1RyYWNrKHNlbGYpOworICAgIHJldHVybiBzZWxmOworfQorCisvKgorICogUmV0dXJuIGEgbmFtZSBzdHJpbmcgZ2l2ZW4gYSBYNTA5X05BTUUgb2JqZWN0IGFuZCBhIG5hbWUgaWRlbnRpZmllci4gVXNlZAorICogYnkgdGhlIGdldGF0dHIgZnVuY3Rpb24uCisgKgorICogQXJndW1lbnRzOiBuYW1lIC0gVGhlIFg1MDlfTkFNRSBvYmplY3QKKyAqICAgICAgICAgICAgbmlkICAtIFRoZSBuYW1lIGlkZW50aWZpZXIKKyAqIFJldHVybnM6ICAgVGhlIG5hbWUgYXMgYSBQeXRob24gc3RyaW5nIG9iamVjdAorICovCitzdGF0aWMgaW50CitnZXRfbmFtZV9ieV9uaWQoWDUwOV9OQU1FICpuYW1lLCBpbnQgbmlkLCBjaGFyICoqdXRmOHN0cmluZykKK3sKKyAgICBpbnQgZW50cnlfaWR4OworICAgIFg1MDlfTkFNRV9FTlRSWSAqZW50cnk7CisgICAgQVNOMV9TVFJJTkcgKmRhdGE7CisgICAgaW50IGxlbjsKKworICAgIGlmICgoZW50cnlfaWR4ID0gWDUwOV9OQU1FX2dldF9pbmRleF9ieV9OSUQobmFtZSwgbmlkLCAtMSkpID09IC0xKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVudHJ5ID0gWDUwOV9OQU1FX2dldF9lbnRyeShuYW1lLCBlbnRyeV9pZHgpOworICAgIGRhdGEgPSBYNTA5X05BTUVfRU5UUllfZ2V0X2RhdGEoZW50cnkpOworICAgIGlmICgobGVuID0gQVNOMV9TVFJJTkdfdG9fVVRGOCgodW5zaWduZWQgY2hhciAqKil1dGY4c3RyaW5nLCBkYXRhKSkgPCAwKQorICAgIHsKKyAgICAgICAgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBsZW47Cit9CisKKy8qCisgKiBHaXZlbiBhIFg1MDlfTkFNRSBvYmplY3QgYW5kIGEgbmFtZSBpZGVudGlmaWVyLCBzZXQgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGF0dHJpYnV0ZSB0byB0aGUgZ2l2ZW4gc3RyaW5nLiBVc2VkIGJ5IHRoZSBzZXRhdHRyIGZ1bmN0aW9uLgorICoKKyAqIEFyZ3VtZW50czogbmFtZSAgLSBUaGUgWDUwOV9OQU1FIG9iamVjdAorICogICAgICAgICAgICBuaWQgICAtIFRoZSBuYW1lIGlkZW50aWZpZXIKKyAqICAgICAgICAgICAgdmFsdWUgLSBUaGUgc3RyaW5nIHRvIHNldAorICogUmV0dXJuczogICAwIGZvciBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQKK3NldF9uYW1lX2J5X25pZChYNTA5X05BTUUgKm5hbWUsIGludCBuaWQsIGNoYXIgKnV0ZjhzdHJpbmcpCit7CisgICAgWDUwOV9OQU1FX0VOVFJZICpuZTsKKyAgICBpbnQgaSwgZW50cnlfY291bnQsIHRlbXBfbmlkOworCisgICAgLyogSWYgdGhlcmUncyBhbiBvbGQgZW50cnkgZm9yIHRoaXMgTklELCByZW1vdmUgaXQgKi8KKyAgICBlbnRyeV9jb3VudCA9IFg1MDlfTkFNRV9lbnRyeV9jb3VudChuYW1lKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZW50cnlfY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIG5lID0gWDUwOV9OQU1FX2dldF9lbnRyeShuYW1lLCBpKTsKKyAgICAgICAgdGVtcF9uaWQgPSBPQkpfb2JqMm5pZChYNTA5X05BTUVfRU5UUllfZ2V0X29iamVjdChuZSkpOworICAgICAgICBpZiAodGVtcF9uaWQgPT0gbmlkKQorICAgICAgICB7CisgICAgICAgICAgICBuZSA9IFg1MDlfTkFNRV9kZWxldGVfZW50cnkobmFtZSwgaSk7CisgICAgICAgICAgICBYNTA5X05BTUVfRU5UUllfZnJlZShuZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFkZCB0aGUgbmV3IGVudHJ5ICovCisgICAgaWYgKCFYNTA5X05BTUVfYWRkX2VudHJ5X2J5X05JRChuYW1lLCBuaWQsIE1CU1RSSU5HX1VURjgsIHV0ZjhzdHJpbmcsCisgICAgICAgICAgICAgICAgLTEsIC0xLCAwKSkKKyAgICB7CisgICAgICAgIGV4Y2VwdGlvbl9mcm9tX2Vycm9yX3F1ZXVlKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEZpbmQgYXR0cmlidXRlLiBBbiBYNTA5TmFtZSBvYmplY3QgaGFzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKyAqIGNvdW50cnlOYW1lIChhbGlhcyBDKSwgc3RhdGVPclByb3ZpbmNlIChhbGlhcyBTVCksIGxvY2FsaXR5IChhbGlhcyBMKSwKKyAqIG9yZ2FuaXphdGlvbiAoYWxpYXMgTyksIG9yZ2FuaXphdGlvbmFsVW5pdCAoYWxpYXMgT1UpLCBjb21tb25OYW1lIChhbGlhcworICogQ04pIGFuZCBtb3JlLi4uCisgKgorICogQXJndW1lbnRzOiBzZWxmIC0gVGhlIFg1MDlOYW1lIG9iamVjdAorICogICAgICAgICAgICBuYW1lIC0gVGhlIGF0dHJpYnV0ZSBuYW1lCisgKiBSZXR1cm5zOiAgIEEgUHl0aG9uIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSwgb3IgTlVMTCBpZiBzb21ldGhpbmcgd2VudAorICogICAgICAgICAgICB3cm9uZworICovCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX1g1MDlOYW1lX2dldGF0dHIoY3J5cHRvX1g1MDlOYW1lT2JqICpzZWxmLCBjaGFyICpuYW1lKQoreworICAgIGludCBuaWQsIGxlbjsKKyAgICBjaGFyICp1dGY4c3RyaW5nOworCisgICAgaWYgKChuaWQgPSBPQkpfdHh0Mm5pZChuYW1lKSkgPT0gTklEX3VuZGVmKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAiTm8gc3VjaCBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbGVuID0gZ2V0X25hbWVfYnlfbmlkKHNlbGYtPng1MDlfbmFtZSwgbmlkLCAmdXRmOHN0cmluZyk7CisgICAgaWYgKGxlbiA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UgaWYgKGxlbiA9PSAwKQorICAgIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX0RlY29kZSh1dGY4c3RyaW5nLCBsZW4sICJ1dGYtOCIsIE5VTEwpOworfQorCisvKgorICogU2V0IGF0dHJpYnV0ZQorICoKKyAqIEFyZ3VtZW50czogc2VsZiAgLSBUaGUgWDUwOU5hbWUgb2JqZWN0CisgKiAgICAgICAgICAgIG5hbWUgIC0gVGhlIGF0dHJpYnV0ZSBuYW1lCisgKiAgICAgICAgICAgIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldAorICovCitzdGF0aWMgaW50CitjcnlwdG9fWDUwOU5hbWVfc2V0YXR0cihjcnlwdG9fWDUwOU5hbWVPYmogKnNlbGYsIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2YWx1ZSkKK3sKKyAgICBpbnQgbmlkOworICAgIGNoYXIgKmJ1ZmZlcjsKKworICAgIGlmICgobmlkID0gT0JKX3R4dDJuaWQobmFtZSkpID09IE5JRF91bmRlZikKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgIk5vIHN1Y2ggYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBTb21ldGhpbmcgb2YgYSBoYWNrIHRvIGdldCBuaWNlIHVuaWNvZGUgYmVoYXZpb3VyICovCisgICAgaWYgKCFQeUFyZ19QYXJzZSh2YWx1ZSwgImVzOnNldGF0dHIiLCAidXRmLTgiLCAmYnVmZmVyKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIAorICAgIHJldHVybiBzZXRfbmFtZV9ieV9uaWQoc2VsZi0+eDUwOV9uYW1lLCBuaWQsIGJ1ZmZlcik7Cit9CisKKy8qCisgKiBDb21wYXJlIHR3byBYNTA5TmFtZSBzdHJ1Y3R1cmVzLgorICoKKyAqIEFyZ3VtZW50czogbiAtIFRoZSBmaXJzdCBYNTA5TmFtZQorICogICAgICAgICAgICBtIC0gVGhlIHNlY29uZCBYNTA5TmFtZQorICogUmV0dXJuczogICA8MCBpZiBuIDwgbSwgMCBpZiBuID09IG0gYW5kID4wIGlmIG4gPiBtCisgKi8KK3N0YXRpYyBpbnQKK2NyeXB0b19YNTA5TmFtZV9jb21wYXJlKGNyeXB0b19YNTA5TmFtZU9iaiAqbiwgY3J5cHRvX1g1MDlOYW1lT2JqICptKQoreworICAgIHJldHVybiBYNTA5X05BTUVfY21wKG4tPng1MDlfbmFtZSwgbS0+eDUwOV9uYW1lKTsKK30KKworLyoKKyAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBYNTA5TmFtZQorICoKKyAqIEFyZ3VtZW50czogc2VsZiAtIFRoZSBYNTA5TmFtZSBvYmplY3QKKyAqIFJldHVybnM6ICAgQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdAorICovCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX1g1MDlOYW1lX3JlcHIoY3J5cHRvX1g1MDlOYW1lT2JqICpzZWxmKQoreworICAgIGNoYXIgdG1wYnVmWzUxMl0gPSAiIjsKKyAgICBjaGFyIHJlYWxidWZbNTEyKzY0XTsKKworICAgIGlmIChYNTA5X05BTUVfb25lbGluZShzZWxmLT54NTA5X25hbWUsIHRtcGJ1ZiwgNTEyKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHRtcGJ1ZiBpcyBtYXggNTEyIGNoYXJhY3RlcnMgKi8KKyAgICAgICAgc3ByaW50ZihyZWFsYnVmLCAiPFg1MDlOYW1lIG9iamVjdCAnJXMnPiIsIHRtcGJ1Zik7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHJlYWxidWYpOworICAgIH0KK30KKworLyoKKyAqIENhbGwgdGhlIHZpc2l0cHJvYyBvbiBhbGwgY29udGFpbmVkIG9iamVjdHMuCisgKgorICogQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbm5lY3Rpb24gb2JqZWN0CisgKiAgICAgICAgICAgIHZpc2l0IC0gRnVuY3Rpb24gdG8gY2FsbAorICogICAgICAgICAgICBhcmcgLSBFeHRyYSBhcmd1bWVudCB0byB2aXNpdAorICogUmV0dXJuczogICAwIGlmIGFsbCBnb2VzIHdlbGwsIG90aGVyd2lzZSB0aGUgcmV0dXJuIGNvZGUgZnJvbSB0aGUgZmlyc3QKKyAqICAgICAgICAgICAgY2FsbCB0aGF0IGdhdmUgbm9uLXplcm8gcmVzdWx0LgorICovCitzdGF0aWMgaW50CitjcnlwdG9fWDUwOU5hbWVfdHJhdmVyc2UoY3J5cHRvX1g1MDlOYW1lT2JqICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKK3sKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmIChyZXQgPT0gMCAmJiBzZWxmLT5wYXJlbnRfY2VydCAhPSBOVUxMKQorICAgICAgICByZXQgPSB2aXNpdChzZWxmLT5wYXJlbnRfY2VydCwgYXJnKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICogRGVjcmVmIGFsbCBjb250YWluZWQgb2JqZWN0cyBhbmQgemVybyB0aGUgcG9pbnRlcnMuCisgKgorICogQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbm5lY3Rpb24gb2JqZWN0CisgKiBSZXR1cm5zOiAgIEFsd2F5cyAwLgorICovCitzdGF0aWMgaW50CitjcnlwdG9fWDUwOU5hbWVfY2xlYXIoY3J5cHRvX1g1MDlOYW1lT2JqICpzZWxmKQoreworICAgIFB5X1hERUNSRUYoc2VsZi0+cGFyZW50X2NlcnQpOworICAgIHNlbGYtPnBhcmVudF9jZXJ0ID0gTlVMTDsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIERlYWxsb2NhdGUgdGhlIG1lbW9yeSB1c2VkIGJ5IHRoZSBYNTA5TmFtZSBvYmplY3QKKyAqCisgKiBBcmd1bWVudHM6IHNlbGYgLSBUaGUgWDUwOU5hbWUgb2JqZWN0CisgKiBSZXR1cm5zOiAgIE5vbmUKKyAqLworc3RhdGljIHZvaWQKK2NyeXB0b19YNTA5TmFtZV9kZWFsbG9jKGNyeXB0b19YNTA5TmFtZU9iaiAqc2VsZikKK3sKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOworICAgIC8qIFNvbWV0aW1lcyB3ZSBkb24ndCBoYXZlIHRvIGRlYWxsb2MgdGhpcyAqLworICAgIGlmIChzZWxmLT5kZWFsbG9jKQorICAgICAgICBYNTA5X05BTUVfZnJlZShzZWxmLT54NTA5X25hbWUpOworCisgICAgY3J5cHRvX1g1MDlOYW1lX2NsZWFyKHNlbGYpOworCisgICAgUHlPYmplY3RfR0NfRGVsKHNlbGYpOworfQorCitQeVR5cGVPYmplY3QgY3J5cHRvX1g1MDlOYW1lX1R5cGUgPSB7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwKKyAgICAiWDUwOU5hbWUiLAorICAgIHNpemVvZihjcnlwdG9fWDUwOU5hbWVPYmopLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpY3J5cHRvX1g1MDlOYW1lX2RlYWxsb2MsCisgICAgTlVMTCwgLyogcHJpbnQgKi8KKyAgICAoZ2V0YXR0cmZ1bmMpY3J5cHRvX1g1MDlOYW1lX2dldGF0dHIsCisgICAgKHNldGF0dHJmdW5jKWNyeXB0b19YNTA5TmFtZV9zZXRhdHRyLAorICAgIChjbXBmdW5jKWNyeXB0b19YNTA5TmFtZV9jb21wYXJlLAorICAgIChyZXByZnVuYyljcnlwdG9fWDUwOU5hbWVfcmVwciwKKyAgICBOVUxMLCAvKiBhc19udW1iZXIgKi8KKyAgICBOVUxMLCAvKiBhc19zZXF1ZW5jZSAqLworICAgIE5VTEwsIC8qIGFzX21hcHBpbmcgKi8KKyAgICBOVUxMLCAvKiBoYXNoICovCisgICAgTlVMTCwgLyogY2FsbCAqLworICAgIE5VTEwsIC8qIHN0ciAqLworICAgIE5VTEwsIC8qIGdldGF0dHJvICovCisgICAgTlVMTCwgLyogc2V0YXR0cm8gKi8KKyAgICBOVUxMLCAvKiBhc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCisgICAgTlVMTCwgLyogZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyljcnlwdG9fWDUwOU5hbWVfdHJhdmVyc2UsCisgICAgKGlucXVpcnkpY3J5cHRvX1g1MDlOYW1lX2NsZWFyLAorfTsKKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgWDUwOU5hbWUgcGFydCBvZiB0aGUgY3J5cHRvIG1vZHVsZQorICoKKyAqIEFyZ3VtZW50czogZGljdCAtIFRoZSBjcnlwdG8gbW9kdWxlIGRpY3Rpb25hcnkKKyAqIFJldHVybnM6ICAgTm9uZQorICovCitpbnQKK2luaXRfY3J5cHRvX3g1MDluYW1lKFB5T2JqZWN0ICpkaWN0KQoreworICAgIGNyeXB0b19YNTA5TmFtZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlfSU5DUkVGKCZjcnlwdG9fWDUwOU5hbWVfVHlwZSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIlg1MDlOYW1lVHlwZSIsIChQeU9iamVjdCAqKSZjcnlwdG9fWDUwOU5hbWVfVHlwZSk7CisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDluYW1lLmggYi9zcmMvY3J5cHRvL3g1MDluYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyY2UzNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jcnlwdG8veDUwOW5hbWUuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogeDUwOW5hbWUuaAorICoKKyAqIENvcHlyaWdodCAoQykgQUIgU3RyYWt0IDIwMDEsIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBFeHBvcnQgWC41MDkgbmFtZSBmdW5jdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcy4KKyAqIFNlZSB0aGUgZmlsZSBSQVRJT05BTEUgZm9yIGEgc2hvcnQgZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgbW9kdWxlIHdhcyB3cml0dGVuLgorICoKKyAqIFJldmlld2VkIDIwMDEtMDctMjMKKyAqCisgKiBAKCMpICRJZDogeDUwOW5hbWUuaCx2IDEuOCAyMDAyLzA5LzA0IDIyOjI0OjU5IGlrbyBFeHAgJAorICovCisjaWZuZGVmIFB5T3BlblNTTF9jcnlwdG9fWDUwOU5BTUVfSF8KKyNkZWZpbmUgUHlPcGVuU1NMX2NyeXB0b19YNTA5TkFNRV9IXworCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKworZXh0ZXJuICBpbnQgICAgIGluaXRfY3J5cHRvX3g1MDluYW1lICAgICAgIChQeU9iamVjdCAqKTsKKworZXh0ZXJuICBQeVR5cGVPYmplY3QgICAgICBjcnlwdG9fWDUwOU5hbWVfVHlwZTsKKworI2RlZmluZSBjcnlwdG9fWDUwOU5hbWVfQ2hlY2sodikgKCh2KS0+b2JfdHlwZSA9PSAmY3J5cHRvX1g1MDlOYW1lX1R5cGUpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgWDUwOV9OQU1FICAgICAgICAgICAqeDUwOV9uYW1lOworICAgIGludCAgICAgICAgICAgICAgICAgIGRlYWxsb2M7CisgICAgUHlPYmplY3QgICAgICAgICAgICAqcGFyZW50X2NlcnQ7Cit9IGNyeXB0b19YNTA5TmFtZU9iajsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOXJlcS5jIGIvc3JjL2NyeXB0by94NTA5cmVxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU1MWRlNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jcnlwdG8veDUwOXJlcS5jCkBAIC0wLDAgKzEsMzI0IEBACisvKgorICogeDUwOXJlcS5jCisgKgorICogQ29weXJpZ2h0IChDKSBBQiBTdHJha3QgMjAwMSwgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIFguNTA5IFJlcXVlc3QgaGFuZGxpbmcsIG1vc3RseSB0aGluIHdyYXBwaW5nLgorICogU2VlIHRoZSBmaWxlIFJBVElPTkFMRSBmb3IgYSBzaG9ydCBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBtb2R1bGUgd2FzIHdyaXR0ZW4uCisgKi8KKyNpbmNsdWRlIDxQeXRob24uaD4KKyNkZWZpbmUgY3J5cHRvX01PRFVMRQorI2luY2x1ZGUgImNyeXB0by5oIgorCitzdGF0aWMgY2hhciAqQ1ZTaWQgPSAiQCgjKSAkSWQ6IHg1MDlyZXEuYyx2IDEuMTUgMjAwMi8wOS8wNCAyMjoyNDo1OSBpa28gRXhwICQiOworCisKK3N0YXRpYyBjaGFyIGNyeXB0b19YNTA5UmVxX2dldF9zdWJqZWN0X2RvY1tdID0gIlxuXAorQ3JlYXRlIGFuIFg1MDlOYW1lIG9iamVjdCBmb3IgdGhlIHN1YmplY3Qgb2YgdGhlIGNlcnRpZmljYXRlIHJlcXVlc3RcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIFg1MDlSZXEgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmUgZW1wdHlcblwKK1JldHVybnM6ICAgQW4gWDUwOU5hbWUgb2JqZWN0XG5cCisiOworCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX1g1MDlSZXFfZ2V0X3N1YmplY3QoY3J5cHRvX1g1MDlSZXFPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGNyeXB0b19YNTA5TmFtZU9iaiAqY3J5cHRvX1g1MDlOYW1lX05ldyhYNTA5X05BTUUgKiwgaW50KTsKKyAgICBYNTA5X05BTUUgKm5hbWU7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXRfc3ViamVjdCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICgobmFtZSA9IFg1MDlfUkVRX2dldF9zdWJqZWN0X25hbWUoc2VsZi0+eDUwOV9yZXEpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNyeXB0b19YNTA5TmFtZV9OZXcobmFtZSwgMCk7Cit9CisKK3N0YXRpYyBjaGFyIGNyeXB0b19YNTA5UmVxX2dldF9wdWJrZXlfZG9jW10gPSAiXG5cCitHZXQgdGhlIHB1YmxpYyBrZXkgZnJvbSB0aGUgY2VydGlmaWNhdGUgcmVxdWVzdFxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgWDUwOVJlcSBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZSBlbXB0eVxuXAorUmV0dXJuczogICBUaGUgcHVibGljIGtleVxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK2NyeXB0b19YNTA5UmVxX2dldF9wdWJrZXkoY3J5cHRvX1g1MDlSZXFPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGNyeXB0b19QS2V5T2JqICpjcnlwdG9fUEtleV9OZXcoRVZQX1BLRVkgKiwgaW50KTsKKyAgICBFVlBfUEtFWSAqcGtleTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldF9wdWJrZXkiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoKHBrZXkgPSBYNTA5X1JFUV9nZXRfcHVia2V5KHNlbGYtPng1MDlfcmVxKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGV4Y2VwdGlvbl9mcm9tX2Vycm9yX3F1ZXVlKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiAoUHlPYmplY3QgKiljcnlwdG9fUEtleV9OZXcocGtleSwgMSk7Cit9CisKK3N0YXRpYyBjaGFyIGNyeXB0b19YNTA5UmVxX3NldF9wdWJrZXlfZG9jW10gPSAiXG5cCitTZXQgdGhlIHB1YmxpYyBrZXkgb2YgdGhlIGNlcnRpZmljYXRlIHJlcXVlc3RcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIFg1MDlSZXEgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAgcGtleSAtIFRoZSBwdWJsaWMga2V5IHRvIHVzZVxuXAorUmV0dXJuczogICBOb25lXG5cCisiOworCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX1g1MDlSZXFfc2V0X3B1YmtleShjcnlwdG9fWDUwOVJlcU9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY3J5cHRvX1BLZXlPYmogKnBrZXk7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOnNldF9wdWJrZXkiLCAmY3J5cHRvX1BLZXlfVHlwZSwgJnBrZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghWDUwOV9SRVFfc2V0X3B1YmtleShzZWxmLT54NTA5X3JlcSwgcGtleS0+cGtleSkpCisgICAgeworICAgICAgICBleGNlcHRpb25fZnJvbV9lcnJvcl9xdWV1ZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBjaGFyIGNyeXB0b19YNTA5UmVxX3NpZ25fZG9jW10gPSAiXG5cCitTaWduIHRoZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IHVzaW5nIHRoZSBzdXBwbGllZCBrZXkgYW5kIGRpZ2VzdFxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgWDUwOVJlcSBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZTpcblwKKyAgICAgICAgICAgICBwa2V5ICAgLSBUaGUga2V5IHRvIHNpZ24gd2l0aFxuXAorICAgICAgICAgICAgIGRpZ2VzdCAtIFRoZSBtZXNzYWdlIGRpZ2VzdCB0byB1c2VcblwKK1JldHVybnM6ICAgTm9uZVxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK2NyeXB0b19YNTA5UmVxX3NpZ24oY3J5cHRvX1g1MDlSZXFPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGNyeXB0b19QS2V5T2JqICpwa2V5OworICAgIGNoYXIgKmRpZ2VzdF9uYW1lOworICAgIGNvbnN0IEVWUF9NRCAqZGlnZXN0OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXM6c2lnbiIsICZjcnlwdG9fUEtleV9UeXBlLCAmcGtleSwKKwkJCSAgJmRpZ2VzdF9uYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoKGRpZ2VzdCA9IEVWUF9nZXRfZGlnZXN0YnluYW1lKGRpZ2VzdF9uYW1lKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiTm8gc3VjaCBkaWdlc3QgbWV0aG9kIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghWDUwOV9SRVFfc2lnbihzZWxmLT54NTA5X3JlcSwgcGtleS0+cGtleSwgZGlnZXN0KSkKKyAgICB7CisgICAgICAgIGV4Y2VwdGlvbl9mcm9tX2Vycm9yX3F1ZXVlKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KKyAKK3N0YXRpYyBjaGFyIGNyeXB0b19YNTA5UmVxX3ZlcmlmeV9kb2NbXSA9ICJcblwKK1ZlcmlmaWVzIGEgY2VydGlmaWNhdGUgcmVxdWVzdCB1c2luZyB0aGUgc3VwcGxpZWQgcHVibGljIGtleVxuXAorIFxuXAorQXJndW1lbnRzOiBzZWxmIC0gWDUwOVJlcSBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZTpcblwKKyAgICAgICAgICAgICBrZXkgLSBhIHB1YmxpYyBrZXlcblwKK1JldHVybnM6ICAgVHJ1ZSwgaWYgdGhlIHNpZ25hdHVyZSBpcyBjb3JyZWN0LCAwIG90aGVyd2lzZS5cblwKKyI7CisKK1B5T2JqZWN0ICoKK2NyeXB0b19YNTA5UmVxX3ZlcmlmeShjcnlwdG9fWDUwOVJlcU9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgUHlPYmplY3QgKm9iajsKKyAgICBjcnlwdG9fUEtleU9iaiAqa2V5OworICAgIGludCBhbnN3ZXI7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOnZlcmlmeSIsICZjcnlwdG9fUEtleV9UeXBlLCAmb2JqKSkgCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAga2V5ID0gKGNyeXB0b19QS2V5T2JqICopb2JqOworCisgICAgaWYgKChhbnN3ZXIgPSBYNTA5X1JFUV92ZXJpZnkoc2VsZi0+eDUwOV9yZXEsIGtleS0+cGtleSkpIDwgMCkKKyAgICB7CisgICAgICAgIGV4Y2VwdGlvbl9mcm9tX2Vycm9yX3F1ZXVlKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhhbnN3ZXIpOworfQorCitzdGF0aWMgY2hhciBjcnlwdG9fWDUwOVJlcV9hZGRfZXh0ZW5zaW9uc19kb2NbXSA9ICJcblwKK0FkZCBleHRlbnNpb25zIHRvIHRoZSByZXF1ZXN0LlxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBYNTA5UmVxIG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlOlxuXAorICAgICAgICAgICAgIGV4dGVuc2lvbnMgLSBhIHNlcXVlbmNlIG9mIFg1MDlFeHRlbnNpb24gb2JqZWN0c1xuXAorUmV0dXJuczogICBOb25lXG5cCisiOworCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX1g1MDlSZXFfYWRkX2V4dGVuc2lvbnMoY3J5cHRvX1g1MDlSZXFPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIFB5T2JqZWN0ICpleHRlbnNpb25zOworICAgIGNyeXB0b19YNTA5RXh0ZW5zaW9uT2JqICpleHQ7CisgICAgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpleHRzOworICAgIGludCBucl9vZl9leHRlbnNpb25zLCBpOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOmFkZF9leHRlbnNpb25zIiwgJmV4dGVuc2lvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghUHlTZXF1ZW5jZV9DaGVjayhleHRlbnNpb25zKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFeHBlY3RlZCBhIHNlcXVlbmNlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIE1ha2UgYSBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgZnJvbSBzZXF1ZW5jZSAqLworICAgIGlmICgoZXh0cyA9IHNrX1g1MDlfRVhURU5TSU9OX25ld19udWxsKCkpID09IE5VTEwpCisgICAgeworICAgICAgICBleGNlcHRpb25fZnJvbV9lcnJvcl9xdWV1ZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBQdXQgdGhlIGV4dGVuc2lvbnMgaW4gYSBzdGFjayAqLworICAgIG5yX29mX2V4dGVuc2lvbnMgPSBQeVNlcXVlbmNlX0xlbmd0aChleHRlbnNpb25zKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBucl9vZl9leHRlbnNpb25zOyBpKyspCisgICAgeworICAgICAgICBleHQgPSAoY3J5cHRvX1g1MDlFeHRlbnNpb25PYmogKilQeVNlcXVlbmNlX0dldEl0ZW0oZXh0ZW5zaW9ucywgaSk7CisJaWYgKCEoY3J5cHRvX1g1MDlFeHRlbnNpb25fQ2hlY2soZXh0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPbmUgb2YgdGhlIGVsZW1lbnRzIGlzIG5vdCBhbiBYNTA5RXh0ZW5zaW9uIik7CisJICAgIHNrX1g1MDlfRVhURU5TSU9OX2ZyZWUoZXh0cyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBza19YNTA5X0VYVEVOU0lPTl9wdXNoKGV4dHMsIGV4dC0+eDUwOV9leHRlbnNpb24pOworICAgIH0KKyAgICAKKyAgICBpZiAoIVg1MDlfUkVRX2FkZF9leHRlbnNpb25zKHNlbGYtPng1MDlfcmVxLCBleHRzKSkKKyAgICB7CisgICAgICAgIHNrX1g1MDlfRVhURU5TSU9OX2ZyZWUoZXh0cyk7CisgICAgICAgIGV4Y2VwdGlvbl9mcm9tX2Vycm9yX3F1ZXVlKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNrX1g1MDlfRVhURU5TSU9OX2ZyZWUoZXh0cyk7CisgICAgCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCisvKgorICogQUREX01FVEhPRChuYW1lKSBleHBhbmRzIHRvIGEgY29ycmVjdCBQeU1ldGhvZERlZiBkZWNsYXJhdGlvbgorICogICB7ICAnbmFtZScsIChQeUNGdW5jdGlvbiljcnlwdG9fWDUwOVJlcV9uYW1lLCBNRVRIX1ZBUkFSR1MgfQorICogZm9yIGNvbnZlbmllbmNlCisgKi8KKyNkZWZpbmUgQUREX01FVEhPRChuYW1lKSAgICAgICAgXAorICAgIHsgI25hbWUsIChQeUNGdW5jdGlvbiljcnlwdG9fWDUwOVJlcV8jI25hbWUsIE1FVEhfVkFSQVJHUywgY3J5cHRvX1g1MDlSZXFfIyNuYW1lIyNfZG9jIH0KK3N0YXRpYyBQeU1ldGhvZERlZiBjcnlwdG9fWDUwOVJlcV9tZXRob2RzW10gPQoreworICAgIEFERF9NRVRIT0QoZ2V0X3N1YmplY3QpLAorICAgIEFERF9NRVRIT0QoZ2V0X3B1YmtleSksCisgICAgQUREX01FVEhPRChzZXRfcHVia2V5KSwKKyAgICBBRERfTUVUSE9EKHNpZ24pLAorICAgIEFERF9NRVRIT0QodmVyaWZ5KSwKKyAgICBBRERfTUVUSE9EKGFkZF9leHRlbnNpb25zKSwKKyAgICB7IE5VTEwsIE5VTEwgfQorfTsKKyN1bmRlZiBBRERfTUVUSE9ECisKKworLyoKKyAqIENvbnN0cnVjdG9yIGZvciBYNTA5UmVxLCBuZXZlciBjYWxsZWQgYnkgUHl0aG9uIGNvZGUgZGlyZWN0bHkKKyAqCisgKiBBcmd1bWVudHM6IG5hbWUgICAgLSBBICJyZWFsIiBYNTA5X1JFUSBvYmplY3QKKyAqICAgICAgICAgICAgZGVhbGxvYyAtIEJvb2xlYW4gdmFsdWUgdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSBkZXN0cnVjdG9yIHNob3VsZAorICogICAgICAgICAgICAgICAgICAgICAgZnJlZSB0aGUgInJlYWwiIFg1MDlfUkVRIG9iamVjdAorICogUmV0dXJuczogICBUaGUgbmV3bHkgY3JlYXRlZCBYNTA5UmVxIG9iamVjdAorICovCitjcnlwdG9fWDUwOVJlcU9iaiAqCitjcnlwdG9fWDUwOVJlcV9OZXcoWDUwOV9SRVEgKnJlcSwgaW50IGRlYWxsb2MpCit7CisgICAgY3J5cHRvX1g1MDlSZXFPYmogKnNlbGY7CisKKyAgICBzZWxmID0gUHlPYmplY3RfTmV3KGNyeXB0b19YNTA5UmVxT2JqLCAmY3J5cHRvX1g1MDlSZXFfVHlwZSk7CisKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHNlbGYtPng1MDlfcmVxID0gcmVxOworICAgIHNlbGYtPmRlYWxsb2MgPSBkZWFsbG9jOworCisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qCisgKiBEZWFsbG9jYXRlIHRoZSBtZW1vcnkgdXNlZCBieSB0aGUgWDUwOVJlcSBvYmplY3QKKyAqCisgKiBBcmd1bWVudHM6IHNlbGYgLSBUaGUgWDUwOVJlcSBvYmplY3QKKyAqIFJldHVybnM6ICAgTm9uZQorICovCitzdGF0aWMgdm9pZAorY3J5cHRvX1g1MDlSZXFfZGVhbGxvYyhjcnlwdG9fWDUwOVJlcU9iaiAqc2VsZikKK3sKKyAgICAvKiBTb21ldGltZXMgd2UgZG9uJ3QgaGF2ZSB0byBkZWFsbG9jIHRoaXMgKi8KKyAgICBpZiAoc2VsZi0+ZGVhbGxvYykKKyAgICAgICAgWDUwOV9SRVFfZnJlZShzZWxmLT54NTA5X3JlcSk7CisKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7Cit9CisKKworLyoKKyAqIEZpbmQgYXR0cmlidXRlLgorICoKKyAqIEFyZ3VtZW50czogc2VsZiAtIFRoZSBYNTA5UmVxIG9iamVjdAorICogICAgICAgICAgICBuYW1lIC0gVGhlIGF0dHJpYnV0ZSBuYW1lCisgKiBSZXR1cm5zOiAgIEEgUHl0aG9uIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSwgb3IgTlVMTCBpZiBzb21ldGhpbmcgd2VudAorICogICAgICAgICAgICB3cm9uZworICovCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX1g1MDlSZXFfZ2V0YXR0cihjcnlwdG9fWDUwOVJlcU9iaiAqc2VsZiwgY2hhciAqbmFtZSkKK3sKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChjcnlwdG9fWDUwOVJlcV9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKK30KKworUHlUeXBlT2JqZWN0IGNyeXB0b19YNTA5UmVxX1R5cGUgPSB7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwKKyAgICAiWDUwOVJlcSIsCisgICAgc2l6ZW9mKGNyeXB0b19YNTA5UmVxT2JqKSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWNyeXB0b19YNTA5UmVxX2RlYWxsb2MsCisgICAgTlVMTCwgLyogcHJpbnQgKi8KKyAgICAoZ2V0YXR0cmZ1bmMpY3J5cHRvX1g1MDlSZXFfZ2V0YXR0ciwKK307CisKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIFg1MDlSZXEgcGFydCBvZiB0aGUgY3J5cHRvIG1vZHVsZQorICoKKyAqIEFyZ3VtZW50czogZGljdCAtIFRoZSBjcnlwdG8gbW9kdWxlIGRpY3Rpb25hcnkKKyAqIFJldHVybnM6ICAgTm9uZQorICovCitpbnQKK2luaXRfY3J5cHRvX3g1MDlyZXEoUHlPYmplY3QgKmRpY3QpCit7CisgICAgY3J5cHRvX1g1MDlSZXFfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIFB5X0lOQ1JFRigmY3J5cHRvX1g1MDlSZXFfVHlwZSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIlg1MDlSZXFUeXBlIiwgKFB5T2JqZWN0ICopJmNyeXB0b19YNTA5UmVxX1R5cGUpOworICAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5cmVxLmggYi9zcmMvY3J5cHRvL3g1MDlyZXEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjgwNDNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NyeXB0by94NTA5cmVxLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIHg1MDlyZXEuaAorICoKKyAqIENvcHlyaWdodCAoQykgQUIgU3RyYWt0IDIwMDEsIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBFeHBvcnQgWDUwOSByZXF1ZXN0IGZ1bmN0aW9ucyBhbmQgZGF0YSBzdHJ1Y3R1cmVzLgorICogU2VlIHRoZSBmaWxlIFJBVElPTkFMRSBmb3IgYSBzaG9ydCBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBtb2R1bGUgd2FzIHdyaXR0ZW4uCisgKgorICogQCgjKSAkSWQ6IHg1MDlyZXEuaCx2IDEuNiAyMDAyLzA5LzA0IDIyOjI0OjU5IGlrbyBFeHAgJAorICovCisjaWZuZGVmIFB5T3BlblNTTF9TU0xfWDUwOVJFUV9IXworI2RlZmluZSBQeU9wZW5TU0xfU1NMX1g1MDlSRVFfSF8KKworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisKK2V4dGVybiAgaW50ICAgICAgIGluaXRfY3J5cHRvX3g1MDlyZXEgICAoUHlPYmplY3QgKik7CisKK2V4dGVybiAgUHlUeXBlT2JqZWN0ICAgICAgY3J5cHRvX1g1MDlSZXFfVHlwZTsKKworI2RlZmluZSBjcnlwdG9fWDUwOVJlcV9DaGVjayh2KSAoKHYpLT5vYl90eXBlID09ICZjcnlwdG9fWDUwOVJlcV9UeXBlKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFg1MDlfUkVRICAgICAgICAgICAgKng1MDlfcmVxOworICAgIGludCAgICAgICAgICAgICAgICAgIGRlYWxsb2M7Cit9IGNyeXB0b19YNTA5UmVxT2JqOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5c3RvcmUuYyBiL3NyYy9jcnlwdG8veDUwOXN0b3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ4MWYwYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jcnlwdG8veDUwOXN0b3JlLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiB4NTA5c3RvcmUuYworICoKKyAqIENvcHlyaWdodCAoQykgQUIgU3RyYWt0IDIwMDEsIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBYLjUwOSBTdG9yZSBoYW5kbGluZywgbW9zdGx5IHRoaW4gd3JhcHBpbmcuCisgKiBTZWUgdGhlIGZpbGUgUkFUSU9OQUxFIGZvciBhIHNob3J0IGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIG1vZHVsZSB3YXMgd3JpdHRlbi4KKyAqLworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2RlZmluZSBjcnlwdG9fTU9EVUxFCisjaW5jbHVkZSAiY3J5cHRvLmgiCisKK3N0YXRpYyBjaGFyICpDVlNpZCA9ICJAKCMpICRJZDogeDUwOXN0b3JlLmMsdiAxLjkgMjAwMi8wOS8wNCAyMjoyNDo1OSBpa28gRXhwICQiOworCitzdGF0aWMgY2hhciBjcnlwdG9fWDUwOVN0b3JlX2FkZF9jZXJ0X2RvY1tdID0gIlxuXAorQWRkIGEgY2VydGlmaWNhdGVcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIFg1MDlTdG9yZSBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZTpcblwKKyAgICAgICAgICAgICBjZXJ0IC0gVGhlIGNlcnRpZmljYXRlIHRvIGFkZFxuXAorUmV0dXJuczogICBOb25lXG5cCisiOworCitzdGF0aWMgUHlPYmplY3QgKgorY3J5cHRvX1g1MDlTdG9yZV9hZGRfY2VydChjcnlwdG9fWDUwOVN0b3JlT2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjcnlwdG9fWDUwOU9iaiAqY2VydDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6YWRkX2NlcnQiLCAmY3J5cHRvX1g1MDlfVHlwZSwgJmNlcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghWDUwOV9TVE9SRV9hZGRfY2VydChzZWxmLT54NTA5X3N0b3JlLCBjZXJ0LT54NTA5KSkKKyAgICB7CisgICAgICAgIGV4Y2VwdGlvbl9mcm9tX2Vycm9yX3F1ZXVlKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KKworCisvKgorICogQUREX01FVEhPRChuYW1lKSBleHBhbmRzIHRvIGEgY29ycmVjdCBQeU1ldGhvZERlZiBkZWNsYXJhdGlvbgorICogICB7ICAnbmFtZScsIChQeUNGdW5jdGlvbiljcnlwdG9fWDUwOVN0b3JlX25hbWUsIE1FVEhfVkFSQVJHUyB9CisgKiBmb3IgY29udmVuaWVuY2UKKyAqLworI2RlZmluZSBBRERfTUVUSE9EKG5hbWUpICAgICAgICBcCisgICAgeyAjbmFtZSwgKFB5Q0Z1bmN0aW9uKWNyeXB0b19YNTA5U3RvcmVfIyNuYW1lLCBNRVRIX1ZBUkFSR1MsIGNyeXB0b19YNTA5U3RvcmVfIyNuYW1lIyNfZG9jIH0KK3N0YXRpYyBQeU1ldGhvZERlZiBjcnlwdG9fWDUwOVN0b3JlX21ldGhvZHNbXSA9Cit7CisgICAgQUREX01FVEhPRChhZGRfY2VydCksCisgICAgeyBOVUxMLCBOVUxMIH0KK307CisjdW5kZWYgQUREX01FVEhPRAorCisKKy8qCisgKiBDb25zdHJ1Y3RvciBmb3IgWDUwOVN0b3JlLCBuZXZlciBjYWxsZWQgYnkgUHl0aG9uIGNvZGUgZGlyZWN0bHkKKyAqCisgKiBBcmd1bWVudHM6IG5hbWUgICAgLSBBICJyZWFsIiBYNTA5X1NUT1JFIG9iamVjdAorICogICAgICAgICAgICBkZWFsbG9jIC0gQm9vbGVhbiB2YWx1ZSB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIGRlc3RydWN0b3Igc2hvdWxkCisgKiAgICAgICAgICAgICAgICAgICAgICBmcmVlIHRoZSAicmVhbCIgWDUwOV9TVE9SRSBvYmplY3QKKyAqIFJldHVybnM6ICAgVGhlIG5ld2x5IGNyZWF0ZWQgWDUwOVN0b3JlIG9iamVjdAorICovCitjcnlwdG9fWDUwOVN0b3JlT2JqICoKK2NyeXB0b19YNTA5U3RvcmVfTmV3KFg1MDlfU1RPUkUgKnN0b3JlLCBpbnQgZGVhbGxvYykKK3sKKyAgICBjcnlwdG9fWDUwOVN0b3JlT2JqICpzZWxmOworCisgICAgc2VsZiA9IFB5T2JqZWN0X05ldyhjcnlwdG9fWDUwOVN0b3JlT2JqLCAmY3J5cHRvX1g1MDlTdG9yZV9UeXBlKTsKKworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgc2VsZi0+eDUwOV9zdG9yZSA9IHN0b3JlOworICAgIHNlbGYtPmRlYWxsb2MgPSBkZWFsbG9jOworCisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qCisgKiBEZWFsbG9jYXRlIHRoZSBtZW1vcnkgdXNlZCBieSB0aGUgWDUwOVN0b3JlIG9iamVjdAorICoKKyAqIEFyZ3VtZW50czogc2VsZiAtIFRoZSBYNTA5U3RvcmUgb2JqZWN0CisgKiBSZXR1cm5zOiAgIE5vbmUKKyAqLworc3RhdGljIHZvaWQKK2NyeXB0b19YNTA5U3RvcmVfZGVhbGxvYyhjcnlwdG9fWDUwOVN0b3JlT2JqICpzZWxmKQoreworICAgIC8qIFNvbWV0aW1lcyB3ZSBkb24ndCBoYXZlIHRvIGRlYWxsb2MgdGhpcyAqLworICAgIGlmIChzZWxmLT5kZWFsbG9jKQorICAgICAgICBYNTA5X1NUT1JFX2ZyZWUoc2VsZi0+eDUwOV9zdG9yZSk7CisKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7Cit9CisKKworLyoKKyAqIEZpbmQgYXR0cmlidXRlLgorICoKKyAqIEFyZ3VtZW50czogc2VsZiAtIFRoZSBYNTA5U3RvcmUgb2JqZWN0CisgKiAgICAgICAgICAgIG5hbWUgLSBUaGUgYXR0cmlidXRlIG5hbWUKKyAqIFJldHVybnM6ICAgQSBQeXRob24gb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlLCBvciBOVUxMIGlmIHNvbWV0aGluZyB3ZW50CisgKiAgICAgICAgICAgIHdyb25nCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqCitjcnlwdG9fWDUwOVN0b3JlX2dldGF0dHIoY3J5cHRvX1g1MDlTdG9yZU9iaiAqc2VsZiwgY2hhciAqbmFtZSkKK3sKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChjcnlwdG9fWDUwOVN0b3JlX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworfQorCitQeVR5cGVPYmplY3QgY3J5cHRvX1g1MDlTdG9yZV9UeXBlID0geworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsCisgICAgIlg1MDlTdG9yZSIsCisgICAgc2l6ZW9mKGNyeXB0b19YNTA5U3RvcmVPYmopLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpY3J5cHRvX1g1MDlTdG9yZV9kZWFsbG9jLAorICAgIE5VTEwsIC8qIHByaW50ICovCisgICAgKGdldGF0dHJmdW5jKWNyeXB0b19YNTA5U3RvcmVfZ2V0YXR0ciwKKyAgICBOVUxMLCAvKiBzZXRhdHRyICovCisgICAgTlVMTCwgLyogY29tcGFyZSAqLworICAgIE5VTEwsIC8qIHJlcHIgKi8KKyAgICBOVUxMLCAvKiBhc19udW1iZXIgKi8KKyAgICBOVUxMLCAvKiBhc19zZXF1ZW5jZSAqLworICAgIE5VTEwsIC8qIGFzX21hcHBpbmcgKi8KKyAgICBOVUxMICAvKiBoYXNoICovCit9OworCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBYNTA5U3RvcmUgcGFydCBvZiB0aGUgY3J5cHRvIG1vZHVsZQorICoKKyAqIEFyZ3VtZW50czogZGljdCAtIFRoZSBjcnlwdG8gbW9kdWxlIGRpY3Rpb25hcnkKKyAqIFJldHVybnM6ICAgTm9uZQorICovCitpbnQKK2luaXRfY3J5cHRvX3g1MDlzdG9yZShQeU9iamVjdCAqZGljdCkKK3sKKyAgICBjcnlwdG9fWDUwOVN0b3JlX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBQeV9JTkNSRUYoJmNyeXB0b19YNTA5U3RvcmVfVHlwZSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIlg1MDlTdG9yZVR5cGUiLCAoUHlPYmplY3QgKikmY3J5cHRvX1g1MDlTdG9yZV9UeXBlKTsKKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOXN0b3JlLmggYi9zcmMvY3J5cHRvL3g1MDlzdG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZDUwNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY3J5cHRvL3g1MDlzdG9yZS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiB4NTA5c3RvcmUuaAorICoKKyAqIENvcHlyaWdodCAoQykgQUIgU3RyYWt0IDIwMDEsIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBFeHBvcnQgWDUwOSBzdG9yZSBmdW5jdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcy4KKyAqIFNlZSB0aGUgZmlsZSBSQVRJT05BTEUgZm9yIGEgc2hvcnQgZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgbW9kdWxlIHdhcyB3cml0dGVuLgorICoKKyAqIEAoIykgJElkOiB4NTA5c3RvcmUuaCx2IDEuNCAyMDAyLzA5LzA0IDIyOjI0OjU5IGlrbyBFeHAgJAorICovCisjaWZuZGVmIFB5T3BlblNTTF9TU0xfWDUwOVNUT1JFX0hfCisjZGVmaW5lIFB5T3BlblNTTF9TU0xfWDUwOVNUT1JFX0hfCisKKyNpbmNsdWRlIDxQeXRob24uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorCitleHRlcm4gIGludCAgICAgaW5pdF9jcnlwdG9feDUwOXN0b3JlICAgICAgIChQeU9iamVjdCAqKTsKKworZXh0ZXJuICBQeVR5cGVPYmplY3QgICAgICBjcnlwdG9fWDUwOVN0b3JlX1R5cGU7CisKKyNkZWZpbmUgY3J5cHRvX1g1MDlTdG9yZV9DaGVjayh2KSAoKHYpLT5vYl90eXBlID09ICZjcnlwdG9fWDUwOVN0b3JlX1R5cGUpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgWDUwOV9TVE9SRSAgICAgICAgICAgKng1MDlfc3RvcmU7CisgICAgaW50ICAgICAgICAgICAgICAgICAgZGVhbGxvYzsKK30gY3J5cHRvX1g1MDlTdG9yZU9iajsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9weW1lbWNvbXBhdC5oIGIvc3JjL3B5bWVtY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyMjFlYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9weW1lbWNvbXBhdC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qIFRoZSBpZGVhIG9mIHRoaXMgZmlsZSBpcyB0aGF0IHlvdSBidW5kbGUgaXQgd2l0aCB5b3VyIGV4dGVuc2lvbiwKKyAgICNpbmNsdWRlIGl0LCBwcm9ncmFtIHRvIFB5dGhvbiAyLjMncyBtZW1vcnkgQVBJIGFuZCBoYXZlIHlvdXIKKyAgIGV4dGVuc2lvbiBidWlsZCB3aXRoIGFueSB2ZXJzaW9uIG9mIFB5dGhvbiBmcm9tIDEuNS4yIHRocm91Z2ggdG8KKyAgIDIuMyAoYW5kIGhvcGVmdWxseSBiZXlvbmQpLiAqLworCisjaWZuZGVmIFB5X1BZTUVNQ09NUEFUX0gKKyNkZWZpbmUgUHlfUFlNRU1DT01QQVRfSAorCisjaW5jbHVkZSAiUHl0aG9uLmgiCisKKy8qIFRoZXJlIGFyZSB0aHJlZSAiZmFtaWxpZXMiIG9mIG1lbW9yeSBBUEk6IHRoZSAicmF3IG1lbW9yeSIsICJvYmplY3QKKyAgIG1lbW9yeSIgYW5kICJvYmplY3QiIGZhbWlsaWVzLiAgKFRoaXMgaXMgaWdub3JpbmcgdGhlIG1hdHRlciBvZiB0aGUKKyAgIGN5Y2xlIGNvbGxlY3RvciwgYWJvdXQgd2hpY2ggbW9yZSBpcyBzYWlkIGJlbG93KS4KKworICAgUmF3IE1lbW9yeToKKworICAgICAgIFB5TWVtX01hbGxvYywgUHlNZW1fUmVhbGxvYywgUHlNZW1fRnJlZQorCisgICBPYmplY3QgTWVtb3J5OgorCisgICAgICAgUHlPYmplY3RfTWFsbG9jLCBQeU9iamVjdF9SZWFsbG9jLCBQeU9iamVjdF9GcmVlCisKKyAgIE9iamVjdDoKKworICAgICAgIFB5T2JqZWN0X05ldywgUHlPYmplY3RfTmV3VmFyLCBQeU9iamVjdF9EZWwKKworICAgVGhlIHJhdyBtZW1vcnkgYW5kIG9iamVjdCBtZW1vcnkgYWxsb2NhdG9ycyBib3RoIG1pbWljIHRoZQorICAgbWFsbG9jL3JlYWxsb2MvZnJlZSBpbnRlcmZhY2UgZnJvbSBBTlNJIEMsIGJ1dCB0aGUgb2JqZWN0IG1lbW9yeQorICAgYWxsb2NhdG9yIGNhbiAoYW5kLCBzaW5jZSAyLjMsIGRvZXMgYnkgZGVmYXVsdCkgdXNlIGEgZGlmZmVyZW50CisgICBhbGxvY2F0aW9uIHN0cmF0ZWd5IGJpYXNlZCB0b3dhcmRzIGxvdHMgb2YgbG90cyBvZiAic21hbGwiCisgICBhbGxvY2F0aW9ucy4KKworICAgVGhlIG9iamVjdCBmYW1pbHkgaXMgdXNlZCBmb3IgYWxsb2NhdGluZyBQeXRob24gb2JqZWN0cywgYW5kIHRoZQorICAgaW5pdGlhbGl6ZXJzIHRha2UgY2FyZSBvZiBzb21lIGJhc2ljIGluaXRpYWxpemF0aW9uIChzZXR0aW5nIHRoZQorICAgcmVmY291bnQgdG8gMSBhbmQgZmlsbGluZyBvdXQgdGhlIG9iX3R5cGUgZmllbGQpIGFzIHdlbGwgYXMgaGF2aW5nCisgICBhIHNvbWV3aGF0IGRpZmZlcmVudCBpbnRlcmZhY2UuCisKKyAgIERvIG5vdCBtaXggdGhlIGZhbWlsaWVzISAgRS5nLiBkbyBub3QgYWxsb2NhdGUgbWVtb3J5IHdpdGgKKyAgIFB5TWVtX01hbGxvYyBhbmQgZnJlZSBpdCB3aXRoIFB5T2JqZWN0X0ZyZWUuICBZb3UgbWF5IGdldCBhd2F5IHdpdGgKKyAgIGl0IHF1aXRlIGEgbG90IG9mIHRoZSB0aW1lLCBidXQgdGhlcmUgKmFyZSogc2NlbmFyaW9zIHdoZXJlIHRoaXMKKyAgIHdpbGwgYnJlYWsuICBZb3UgSGF2ZSBCZWVuIFdhcm5lZC4gCisKKyAgIEFsc28sIGluIG1hbnkgdmVyc2lvbnMgb2YgUHl0aG9uIHRoZXJlIGFyZSBhbiBpbnNhbmUgYW1vdW50IG9mCisgICBtZW1vcnkgaW50ZXJmYWNlcyB0byBjaG9vc2UgZnJvbS4gIFVzZSB0aGUgb25lcyBkZXNjcmliZWQgYWJvdmUuICovCisKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDEwNjAwMDAKKy8qIHJhdyBtZW1vcnkgaW50ZXJmYWNlIGFscmVhZHkgcHJlc2VudCAqLworCisvKiB0aGVyZSBpcyBubyBvYmplY3QgbWVtb3J5IGludGVyZmFjZSBpbiAxLjUuMiAqLworI2RlZmluZSBQeU9iamVjdF9NYWxsb2MJCVB5TWVtX01hbGxvYworI2RlZmluZSBQeU9iamVjdF9SZWFsbG9jCVB5TWVtX1JlYWxsb2MKKyNkZWZpbmUgUHlPYmplY3RfRnJlZQkJUHlNZW1fRnJlZQorCisvKiB0aGUgb2JqZWN0IGludGVyZmFjZSBpcyB0aGVyZSwgYnV0IHRoZSBuYW1lcyBoYXZlIGNoYW5nZWQgKi8KKyNkZWZpbmUgUHlPYmplY3RfTmV3CQlQeU9iamVjdF9ORVcKKyNkZWZpbmUgUHlPYmplY3RfTmV3VmFyCQlQeU9iamVjdF9ORVdfVkFSCisjZGVmaW5lIFB5T2JqZWN0X0RlbAkJUHlNZW1fRnJlZQorI2VuZGlmCisKKy8qIElmIHlvdXIgb2JqZWN0IGlzIGEgY29udGFpbmVyIHlvdSBwcm9iYWJseSB3YW50IHRvIHN1cHBvcnQgdGhlCisgICBjeWNsZSBjb2xsZWN0b3IsIHdoaWNoIHdhcyBuZXcgaW4gUHl0aG9uIDIuMC4KKworICAgVW5mb3J0dW5hdGVseSwgdGhlIGludGVyZmFjZSB0byB0aGUgY29sbGVjdG9yIHRoYXQgd2FzIHByZXNlbnQgaW4KKyAgIFB5dGhvbiAyLjAgYW5kIDIuMSBwcm92ZWQgdG8gYmUgdHJpY2t5IHRvIHVzZSwgYW5kIHNvIGNoYW5nZWQgaW4KKyAgIDIuMiAtLSBpbiBhIHdheSB0aGF0IGNhbid0IGVhc2lseSBiZSBwYXBlcmVkIG92ZXIgd2l0aCBtYWNyb3MuCisKKyAgIFRoaXMgZmlsZSBjb250YWlucyBtYWNyb3MgdGhhdCBsZXQgeW91IHByb2dyYW0gdG8gdGhlIDIuMiBHQyBBUEkuCisgICBZb3VyIG1vZHVsZSB3aWxsIGNvbXBpbGUgYWdhaW5zdCBhbnkgUHl0aG9uIHNpbmNlIHZlcnNpb24gMS41LjIsCisgICBidXQgdGhlIHR5cGUgd2lsbCBvbmx5IHBhcnRpY2lwYXRlIGluIHRoZSBHQyBpbiB2ZXJzaW9ucyAyLjIgYW5kCisgICB1cC4gIFNvbWUgd29yayBpcyBzdGlsbCBuZWNlc3Nhcnkgb24geW91ciBwYXJ0IHRvIG9ubHkgZmlsbCBvdXQgdGhlCisgICB0cF90cmF2ZXJzZSBhbmQgdHBfY2xlYXIgZmllbGRzIHdoZW4gdGhleSBleGlzdCBhbmQgc2V0IHRwX2ZsYWdzCisgICBhcHByb3ByaWF0ZWx5LgorCisgICBJdCBpcyBwb3NzaWJsZSB0byBzdXBwb3J0IGJvdGggdGhlIDIuMCBhbmQgMi4yIEdDIEFQSXMsIGJ1dCBpdCdzCisgICBub3QgcHJldHR5IGFuZCB0aGlzIGNvbW1lbnQgYmxvY2sgaXMgdG9vIG5hcnJvdyB0byBjb250YWluIGEKKyAgIGRlc2NpcHRpb24gb2Ygd2hhdCdzIHJlcXVpcmVkLi4uICovCisKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDIwMjAwQjEKKyNkZWZpbmUgUHlPYmplY3RfR0NfTmV3ICAgICAgICAgUHlPYmplY3RfTmV3CisjZGVmaW5lIFB5T2JqZWN0X0dDX05ld1ZhciAgICAgIFB5T2JqZWN0X05ld1ZhcgorI2RlZmluZSBQeU9iamVjdF9HQ19EZWwgICAgICAgICBQeU9iamVjdF9EZWwKKyNkZWZpbmUgUHlPYmplY3RfR0NfVHJhY2sob3ApCisjZGVmaW5lIFB5T2JqZWN0X0dDX1VuVHJhY2sob3ApCisjZW5kaWYKKworI2VuZGlmIC8qICFQeV9QWU1FTUNPTVBBVF9IICovCmRpZmYgLS1naXQgYS9zcmMvcmFuZC9yYW5kLmMgYi9zcmMvcmFuZC9yYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3ZjJmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9yYW5kL3JhbmQuYwpAQCAtMCwwICsxLDI0MCBAQAorLyoKKyAqIHJhbmQuYworICoKKyAqIENvcHlyaWdodCAoQykgQUIgU3RyYWt0IDIwMDEsIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBQUk5HIG1hbmFnZW1lbnQgcm91dGluZXMsIHRoaW4gd3JhcHBlcnMuCisgKiBTZWUgdGhlIGZpbGUgUkFUSU9OQUxFIGZvciBhIHNob3J0IGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIG1vZHVsZSB3YXMgd3JpdHRlbi4KKyAqCisgKiBSZXZpZXdlZCAyMDAxLTA3LTIzCisgKi8KKyNpbmNsdWRlIDxQeXRob24uaD4KKworLyogCisgKiBJbiBvcmRlciB0byBnZXQgdGhlIFJBTkRfc2NyZWVuIGRlZmluaXRpb24gZnJvbSB0aGUgcmFuZC5oCisgKiBXSU4zMiBvciBXSU5ET1dTIG5lZWRzIHRvIGJlIGRlZmluZWQsIG90aGVyd2lzZSB3ZSBnZXQgYQorICogd2FybmluZy4KKyAqLworI2lmZGVmIE1TX1dJTkRPV1MgCisjZGVmaW5lIFdJTjMyCisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKworc3RhdGljIGNoYXIgcmFuZF9kb2NbXSA9ICJcblwKK1BSTkcgbWFuYWdlbWVudCByb3V0aW5lcywgdGhpbiB3cmFwcGVycy5cblwKK1NlZSB0aGUgZmlsZSBSQVRJT05BTEUgZm9yIGEgc2hvcnQgZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgbW9kdWxlIHdhcyB3cml0dGVuLlxuXAorIjsKKworc3RhdGljIGNoYXIgKkNWU2lkID0gIkAoIykgJElkOiByYW5kLmMsdiAxLjEwIDIwMDIvMDcvMDggMTE6MDY6MDEgbWFydGluIEV4cCAkIjsKKworc3RhdGljIGNoYXIgcmFuZF9hZGRfZG9jW10gPSAiXG5cCitBZGQgZGF0YSB3aXRoIGEgZ2l2ZW4gZW50cm9weSB0byB0aGUgUFJOR1xuXAorXG5cCitBcmd1bWVudHM6IHNwYW0gLSBBbHdheXMgTlVMTFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlOlxuXAorICAgICAgICAgICAgIGJ1ZmZlciAgLSBCdWZmZXIgd2l0aCByYW5kb20gZGF0YVxuXAorICAgICAgICAgICAgIGVudHJvcHkgLSBUaGUgZW50cm9weSAoaW4gYnl0ZXMpIG1lYXN1cmVtZW50IG9mIHRoZSBidWZmZXJcblwKK1JldHVybnM6ICAgTm9uZVxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK3JhbmRfYWRkKFB5T2JqZWN0ICpzcGFtLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjaGFyICpidWY7CisgICAgaW50IHNpemU7CisgICAgZG91YmxlIGVudHJvcHk7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjZDphZGQiLCAmYnVmLCAmc2l6ZSwgJmVudHJvcHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIFJBTkRfYWRkKGJ1Ziwgc2l6ZSwgZW50cm9weSk7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBjaGFyIHJhbmRfc2VlZF9kb2NbXSA9ICJcblwKK0FsaWFzIGZvciByYW5kX2FkZCwgd2l0aCBlbnRyb3B5IGVxdWFsIHRvIGxlbmd0aFxuXAorXG5cCitBcmd1bWVudHM6IHNwYW0gLSBBbHdheXMgTlVMTFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlOlxuXAorICAgICAgICAgICAgIGJ1ZmZlciAtIEJ1ZmZlciB3aXRoIHJhbmRvbSBkYXRhXG5cCitSZXR1cm5zOiAgIE5vbmVcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCityYW5kX3NlZWQoUHlPYmplY3QgKnNwYW0sIFB5T2JqZWN0ICphcmdzKQoreworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgc2l6ZTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6c2VlZCIsICZidWYsICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBSQU5EX3NlZWQoYnVmLCBzaXplKTsKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KKworc3RhdGljIGNoYXIgcmFuZF9zdGF0dXNfZG9jW10gPSAiXG5cCitSZXRyaWV2ZSB0aGUgc3RhdHVzIG9mIHRoZSBQUk5HXG5cCitcblwKK0FyZ3VtZW50czogc3BhbSAtIEFsd2F5cyBOVUxMXG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmUgZW1wdHlcblwKK1JldHVybnM6ICAgVHJ1ZSBpZiB0aGUgUFJORyBpcyBzZWVkZWQgZW5vdWdoLCBmYWxzZSBvdGhlcndpc2VcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCityYW5kX3N0YXR1cyhQeU9iamVjdCAqc3BhbSwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6c3RhdHVzIikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKVJBTkRfc3RhdHVzKCkpOworfQorCisjaWZkZWYgTVNfV0lORE9XUworc3RhdGljIGNoYXIgcmFuZF9zY3JlZW5fZG9jW10gPSAiXG5cCitBZGQgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIHNjcmVlbiB0byB0aGUgUFJORyBzdGF0ZS4gQXZhaWxhYmlsaXR5OlxuXAorV2luZG93cy5cblwKK1xuXAorQXJndW1lbnRzOiBzcGFtIC0gQWx3YXlzIE5VTExcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZSBlbXB0eVxuXAorUmV0dXJuczogICBOb25lXG5cCisiOworCitzdGF0aWMgUHlPYmplY3QgKgorcmFuZF9zY3JlZW4oUHlPYmplY3QgKnNwYW0sIFB5T2JqZWN0ICphcmdzKQoreworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOnNjcmVlbiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIFJBTkRfc2NyZWVuKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorI2VuZGlmCisKK3N0YXRpYyBjaGFyIHJhbmRfZWdkX2RvY1tdID0gIlxuXAorUXVlcnkgYW4gZW50cm9weSBnYXRoZXJpbmcgZGFlbW9uIChFR0QpIGZvciByYW5kb20gZGF0YSBhbmQgYWRkIGl0IHRvIHRoZVxuXAorUFJORy4gSSBoYXZlbid0IGZvdW5kIGFueSBwcm9ibGVtcyB3aGVuIHRoZSBzb2NrZXQgaXMgbWlzc2luZywgdGhlIGZ1bmN0aW9uXG5cCitqdXN0IHJldHVybnMgMC5cblwKK1xuXAorQXJndW1lbnRzOiBzcGFtIC0gQWx3YXlzIE5VTExcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZTpcblwKKyAgICAgICAgICAgICBwYXRoICAtIFRoZSBwYXRoIHRvIHRoZSBFR0Qgc29ja2V0XG5cCisgICAgICAgICAgICAgYnl0ZXMgLSAob3B0aW9uYWwpIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCwgZGVmYXVsdCBpcyAyNTVcblwKK1JldHVybnM6ICAgVGhlIG51bWJlciBvZiBieXRlcyByZWFkIChOQjogYSB2YWx1ZSBvZiAwIGlzbid0IG5lY2Vzc2FyaWx5IGFuXG5cCisgICAgICAgICAgIGVycm9yLCBjaGVjayByYW5kLnN0YXR1cygpKVxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK3JhbmRfZWdkKFB5T2JqZWN0ICpzcGFtLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjaGFyICpwYXRoOworICAgIGludCBieXRlcyA9IDI1NTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xpOmVnZCIsICZwYXRoLCAmYnl0ZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylSQU5EX2VnZF9ieXRlcyhwYXRoLCBieXRlcykpOworfQorCitzdGF0aWMgY2hhciByYW5kX2NsZWFudXBfZG9jW10gPSAiXG5cCitFcmFzZSB0aGUgbWVtb3J5IHVzZWQgYnkgdGhlIFBSTkcuXG5cCitcblwKK0FyZ3VtZW50czogc3BhbSAtIEFsd2F5cyBOVUxMXG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmUgZW1wdHlcblwKK1JldHVybnM6ICAgTm9uZVxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK3JhbmRfY2xlYW51cChQeU9iamVjdCAqc3BhbSwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Y2xlYW51cCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIFJBTkRfY2xlYW51cCgpOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCitzdGF0aWMgY2hhciByYW5kX2xvYWRfZmlsZV9kb2NbXSA9ICJcblwKK1NlZWQgdGhlIFBSTkcgd2l0aCBkYXRhIGZyb20gYSBmaWxlXG5cCitcblwKK0FyZ3VtZW50czogc3BhbSAtIEFsd2F5cyBOVUxMXG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAgZmlsZW5hbWUgLSBUaGUgZmlsZSB0byByZWFkIGRhdGEgZnJvbVxuXAorICAgICAgICAgICAgIG1heGJ5dGVzIC0gKG9wdGlvbmFsKSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQsIGRlZmF1bHQgaXNcblwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlYWQgdGhlIGVudGlyZSBmaWxlXG5cCitSZXR1cm5zOiAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZFxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK3JhbmRfbG9hZF9maWxlKFB5T2JqZWN0ICpzcGFtLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjaGFyICpmaWxlbmFtZTsKKyAgICBpbnQgbWF4Ynl0ZXMgPSAtMTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xpOmxvYWRfZmlsZSIsICZmaWxlbmFtZSwgJm1heGJ5dGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpUkFORF9sb2FkX2ZpbGUoZmlsZW5hbWUsIG1heGJ5dGVzKSk7Cit9CisKK3N0YXRpYyBjaGFyIHJhbmRfd3JpdGVfZmlsZV9kb2NbXSA9ICJcblwKK1NhdmUgUFJORyBzdGF0ZSB0byBhIGZpbGVcblwKK1xuXAorQXJndW1lbnRzOiBzcGFtIC0gQWx3YXlzIE5VTExcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZTpcblwKKyAgICAgICAgICAgICBmaWxlbmFtZSAtIFRoZSBmaWxlIHRvIHdyaXRlIGRhdGEgdG9cblwKK1JldHVybnM6ICAgVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuXG5cCisiOworCitzdGF0aWMgUHlPYmplY3QgKgorcmFuZF93cml0ZV9maWxlKFB5T2JqZWN0ICpzcGFtLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjaGFyICpmaWxlbmFtZTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczp3cml0ZV9maWxlIiwgJmZpbGVuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpUkFORF93cml0ZV9maWxlKGZpbGVuYW1lKSk7Cit9CisKKworLyogTWV0aG9kcyBpbiB0aGUgT3BlblNTTC5yYW5kIG1vZHVsZSAqLworc3RhdGljIFB5TWV0aG9kRGVmIHJhbmRfbWV0aG9kc1tdID0geworICAgIHsgImFkZCIsICAgICAgIChQeUNGdW5jdGlvbilyYW5kX2FkZCwgICAgICAgICAgTUVUSF9WQVJBUkdTLCByYW5kX2FkZF9kb2MgfSwKKyAgICB7ICJzZWVkIiwgICAgICAoUHlDRnVuY3Rpb24pcmFuZF9zZWVkLCAgICAgICAgIE1FVEhfVkFSQVJHUywgcmFuZF9zZWVkX2RvYyB9LAorICAgIHsgInN0YXR1cyIsICAgIChQeUNGdW5jdGlvbilyYW5kX3N0YXR1cywgICAgICAgTUVUSF9WQVJBUkdTLCByYW5kX3N0YXR1c19kb2MgfSwKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgeyAic2NyZWVuIiwgICAgKFB5Q0Z1bmN0aW9uKXJhbmRfc2NyZWVuLCAgICAgICBNRVRIX1ZBUkFSR1MsIHJhbmRfc2NyZWVuX2RvYyB9LAorI2VuZGlmCisgICAgeyAiZWdkIiwgICAgICAgKFB5Q0Z1bmN0aW9uKXJhbmRfZWdkLCAgICAgICAgICBNRVRIX1ZBUkFSR1MsIHJhbmRfZWdkX2RvYyB9LAorICAgIHsgImNsZWFudXAiLCAgIChQeUNGdW5jdGlvbilyYW5kX2NsZWFudXAsICAgICAgTUVUSF9WQVJBUkdTLCByYW5kX2NsZWFudXBfZG9jIH0sCisgICAgeyAibG9hZF9maWxlIiwgKFB5Q0Z1bmN0aW9uKXJhbmRfbG9hZF9maWxlLCAgICBNRVRIX1ZBUkFSR1MsIHJhbmRfbG9hZF9maWxlX2RvYyB9LAorICAgIHsgIndyaXRlX2ZpbGUiLChQeUNGdW5jdGlvbilyYW5kX3dyaXRlX2ZpbGUsICAgTUVUSF9WQVJBUkdTLCByYW5kX3dyaXRlX2ZpbGVfZG9jIH0sCisgICAgeyBOVUxMLCBOVUxMIH0KK307CisKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIHJhbmQgc3ViIG1vZHVsZQorICoKKyAqIEFyZ3VtZW50czogTm9uZQorICogUmV0dXJuczogICBOb25lCisgKi8KK3ZvaWQKK2luaXRyYW5kKHZvaWQpCit7CisgICAgUHlPYmplY3QgKm1vZHVsZTsKKworICAgIEVSUl9sb2FkX1JBTkRfc3RyaW5ncygpOworCisgICAgaWYgKChtb2R1bGUgPSBQeV9Jbml0TW9kdWxlMygicmFuZCIsIHJhbmRfbWV0aG9kcywgcmFuZF9kb2MpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm47Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9zc2wvY29ubmVjdGlvbi5jIGIvc3JjL3NzbC9jb25uZWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTYxMTFhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zc2wvY29ubmVjdGlvbi5jCkBAIC0wLDAgKzEsMTA3NiBAQAorLyoKKyAqIGNvbm5lY3Rpb24uYworICoKKyAqIENvcHlyaWdodCAoQykgQUIgU3RyYWt0IDIwMDEsIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBTU0wgQ29ubmVjdGlvbiBvYmplY3RzIGFuZCBtZXRob2RzLgorICogU2VlIHRoZSBmaWxlIFJBVElPTkFMRSBmb3IgYSBzaG9ydCBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBtb2R1bGUgd2FzIHdyaXR0ZW4uCisgKgorICogUmV2aWV3ZWQgMjAwMS0wNy0yMworICovCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjZGVmaW5lIFNTTF9NT0RVTEUKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgInNzbC5oIgorCisjaWZuZGVmIE1TX1dJTkRPV1MKKyMgIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyMgIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyMgIGlmICEoZGVmaW5lZChfX0JFT1NfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSkKKyMgICAgaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyMgIGVuZGlmCisjZWxzZQorIyAgaW5jbHVkZSA8d2luc29jay5oPgorI2VuZGlmCisKK3N0YXRpYyBjaGFyICpDVlNpZCA9ICJAKCMpICRJZDogY29ubmVjdGlvbi5jLHYgMS4yOCAyMDA0LzA4LzA2IDEwOjIxOjU2IG1hcnRpbiBFeHAgJCI7CisKKworLyoqCisgKiBJZiB3ZSBhcmUgb24gVU5JWCwgZmluZSwganVzdCB1c2UgUHlFcnJfU2V0RnJvbUVycm5vLiBJZiB3ZSBhcmUgb24gV2luZG93cywKKyAqIGFwcGx5IHNvbWUgYmxhY2sgd2luc29jayB2b29kb28uIFRoaXMgaXMgYmFzaWNhbGx5IGp1c3QgY29waWVkIGZyb20gUHl0aG9uJ3MKKyAqIHNvY2tldG1vZHVsZS5jCisgKgorICogQXJndW1lbnRzOiBOb25lCisgKiBSZXR1cm5zOiAgIE5vbmUKKyAqLworc3RhdGljIHZvaWQKK3N5c2NhbGxfZnJvbV9lcnJubyh2b2lkKQoreworI2lmZGVmIE1TX1dJTkRPV1MKKyAgICBpbnQgZXJybnVtID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgaWYgKGVycm51bSkKKyAgICB7CisgICAgICAgIHN0YXRpYyBzdHJ1Y3QgeyBpbnQgbnVtOyBjb25zdCBjaGFyICptc2c7IH0gKm1zZ3AsIG1zZ3NbXSA9IHsKKyAgICAgICAgICAgIHsgV1NBRUlOVFIsICJJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCIgfSwKKyAgICAgICAgICAgIHsgV1NBRUJBREYsICJCYWQgZmlsZSBkZXNjcmlwdG9yIiB9LAorICAgICAgICAgICAgeyBXU0FFQUNDRVMsICJQZXJtaXNzaW9uIGRlbmllZCIgfSwKKyAgICAgICAgICAgIHsgV1NBRUZBVUxULCAiQmFkIGFkZHJlc3MiIH0sCisgICAgICAgICAgICB7IFdTQUVJTlZBTCwgIkludmFsaWQgYXJndW1lbnQiIH0sCisgICAgICAgICAgICB7IFdTQUVNRklMRSwgIlRvbyBtYW55IG9wZW4gZmlsZXMiIH0sCisgICAgICAgICAgICB7IFdTQUVXT1VMREJMT0NLLCAiVGhlIHNvY2tldCBvcGVyYXRpb24gY291bGQgbm90IGNvbXBsZXRlICIKKyAgICAgICAgICAgICAgICAgICAgIndpdGhvdXQgYmxvY2tpbmciIH0sCisgICAgICAgICAgICB7IFdTQUVJTlBST0dSRVNTLCAiT3BlcmF0aW9uIG5vdyBpbiBwcm9ncmVzcyIgfSwKKyAgICAgICAgICAgIHsgV1NBRUFMUkVBRFksICJPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyIgfSwKKyAgICAgICAgICAgIHsgV1NBRU5PVFNPQ0ssICJTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQiIH0sCisgICAgICAgICAgICB7IFdTQUVERVNUQUREUlJFUSwgIkRlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQiIH0sCisgICAgICAgICAgICB7IFdTQUVNU0dTSVpFLCAiTWVzc2FnZSB0b28gbG9uZyIgfSwKKyAgICAgICAgICAgIHsgV1NBRVBST1RPVFlQRSwgIlByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCIgfSwKKyAgICAgICAgICAgIHsgV1NBRU5PUFJPVE9PUFQsICJQcm90b2NvbCBub3QgYXZhaWxhYmxlIiB9LAorICAgICAgICAgICAgeyBXU0FFUFJPVE9OT1NVUFBPUlQsICJQcm90b2NvbCBub3Qgc3VwcG9ydGVkIiB9LAorICAgICAgICAgICAgeyBXU0FFU09DS1ROT1NVUFBPUlQsICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIiB9LAorICAgICAgICAgICAgeyBXU0FFT1BOT1RTVVBQLCAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQiIH0sCisgICAgICAgICAgICB7IFdTQUVQRk5PU1VQUE9SVCwgIlByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkIiB9LAorICAgICAgICAgICAgeyBXU0FFQUZOT1NVUFBPUlQsICJBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIiB9LAorICAgICAgICAgICAgeyBXU0FFQUREUklOVVNFLCAiQWRkcmVzcyBhbHJlYWR5IGluIHVzZSIgfSwKKyAgICAgICAgICAgIHsgV1NBRUFERFJOT1RBVkFJTCwgIkNhbid0IGFzc2lnbiByZXF1ZXN0ZWQgYWRkcmVzcyIgfSwKKyAgICAgICAgICAgIHsgV1NBRU5FVERPV04sICJOZXR3b3JrIGlzIGRvd24iIH0sCisgICAgICAgICAgICB7IFdTQUVORVRVTlJFQUNILCAiTmV0d29yayBpcyB1bnJlYWNoYWJsZSIgfSwKKyAgICAgICAgICAgIHsgV1NBRU5FVFJFU0VULCAiTmV0d29yayBkcm9wcGVkIGNvbm5lY3Rpb24gb24gcmVzZXQiIH0sCisgICAgICAgICAgICB7IFdTQUVDT05OQUJPUlRFRCwgIlNvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0IiB9LAorICAgICAgICAgICAgeyBXU0FFQ09OTlJFU0VULCAiQ29ubmVjdGlvbiByZXNldCBieSBwZWVyIiB9LAorICAgICAgICAgICAgeyBXU0FFTk9CVUZTLCAiTm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZSIgfSwKKyAgICAgICAgICAgIHsgV1NBRUlTQ09OTiwgIlNvY2tldCBpcyBhbHJlYWR5IGNvbm5lY3RlZCIgfSwKKyAgICAgICAgICAgIHsgV1NBRU5PVENPTk4sICJTb2NrZXQgaXMgbm90IGNvbm5lY3RlZCIgfSwKKyAgICAgICAgICAgIHsgV1NBRVNIVVRET1dOLCAiQ2FuJ3Qgc2VuZCBhZnRlciBzb2NrZXQgc2h1dGRvd24iIH0sCisgICAgICAgICAgICB7IFdTQUVUT09NQU5ZUkVGUywgIlRvbyBtYW55IHJlZmVyZW5jZXM6IGNhbid0IHNwbGljZSIgfSwKKyAgICAgICAgICAgIHsgV1NBRVRJTUVET1VULCAiT3BlcmF0aW9uIHRpbWVkIG91dCIgfSwKKyAgICAgICAgICAgIHsgV1NBRUNPTk5SRUZVU0VELCAiQ29ubmVjdGlvbiByZWZ1c2VkIiB9LAorICAgICAgICAgICAgeyBXU0FFTE9PUCwgIlRvbyBtYW55IGxldmVscyBvZiBzeW1ib2xpYyBsaW5rcyIgfSwKKyAgICAgICAgICAgIHsgV1NBRU5BTUVUT09MT05HLCAiRmlsZSBuYW1lIHRvbyBsb25nIiB9LAorICAgICAgICAgICAgeyBXU0FFSE9TVERPV04sICJIb3N0IGlzIGRvd24iIH0sCisgICAgICAgICAgICB7IFdTQUVIT1NUVU5SRUFDSCwgIk5vIHJvdXRlIHRvIGhvc3QiIH0sCisgICAgICAgICAgICB7IFdTQUVOT1RFTVBUWSwgIkRpcmVjdG9yeSBub3QgZW1wdHkiIH0sCisgICAgICAgICAgICB7IFdTQUVQUk9DTElNLCAiVG9vIG1hbnkgcHJvY2Vzc2VzIiB9LAorICAgICAgICAgICAgeyBXU0FFVVNFUlMsICJUb28gbWFueSB1c2VycyIgfSwKKyAgICAgICAgICAgIHsgV1NBRURRVU9ULCAiRGlzYyBxdW90YSBleGNlZWRlZCIgfSwKKyAgICAgICAgICAgIHsgV1NBRVNUQUxFLCAiU3RhbGUgTkZTIGZpbGUgaGFuZGxlIiB9LAorICAgICAgICAgICAgeyBXU0FFUkVNT1RFLCAiVG9vIG1hbnkgbGV2ZWxzIG9mIHJlbW90ZSBpbiBwYXRoIiB9LAorICAgICAgICAgICAgeyBXU0FTWVNOT1RSRUFEWSwgIk5ldHdvcmsgc3Vic3lzdGVtIGlzIHVudmFpbGFibGUiIH0sCisgICAgICAgICAgICB7IFdTQVZFUk5PVFNVUFBPUlRFRCwgIldpblNvY2sgdmVyc2lvbiBpcyBub3Qgc3VwcG9ydGVkIiB9LAorICAgICAgICAgICAgeyBXU0FOT1RJTklUSUFMSVNFRCwgIlN1Y2Nlc3NmdWwgV1NBU3RhcnR1cCgpIG5vdCB5ZXQgcGVyZm9ybWVkIiB9LAorICAgICAgICAgICAgeyBXU0FFRElTQ09OLCAiR3JhY2VmdWwgc2h1dGRvd24gaW4gcHJvZ3Jlc3MiIH0sCisgICAgICAgICAgICAvKiBSZXNvbHZlciBlcnJvcnMgKi8KKyAgICAgICAgICAgIHsgV1NBSE9TVF9OT1RfRk9VTkQsICJObyBzdWNoIGhvc3QgaXMga25vd24iIH0sCisgICAgICAgICAgICB7IFdTQVRSWV9BR0FJTiwgIkhvc3Qgbm90IGZvdW5kLCBvciBzZXJ2ZXIgZmFpbGVkIiB9LAorICAgICAgICAgICAgeyBXU0FOT19SRUNPVkVSWSwgIlVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIGVuY291bnRlcmVkIiB9LAorICAgICAgICAgICAgeyBXU0FOT19EQVRBLCAiVmFsaWQgbmFtZSB3aXRob3V0IHJlcXVlc3RlZCBkYXRhIiB9LAorICAgICAgICAgICAgeyBXU0FOT19BRERSRVNTLCAiTm8gYWRkcmVzcywgbG9vayBmb3IgTVggcmVjb3JkIiB9LAorICAgICAgICAgICAgeyAwLCBOVUxMIH0KKyAgICAgICAgfTsKKyAgICAgICAgUHlPYmplY3QgKnY7CisgICAgICAgIGNvbnN0IGNoYXIgKm1zZyA9ICJ3aW5zb2NrIGVycm9yIjsKKworICAgICAgICBmb3IgKG1zZ3AgPSBtc2dzOyBtc2dwLT5tc2c7IG1zZ3ArKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVycm51bSA9PSBtc2dwLT5udW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXNnID0gbXNncC0+bXNnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdiA9IFB5X0J1aWxkVmFsdWUoIihpcykiLCBlcnJudW0sIG1zZyk7CisgICAgICAgIGlmICh2ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFB5RXJyX1NldE9iamVjdChzc2xfU3lzQ2FsbEVycm9yLCB2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorI2Vsc2UKKyAgICBQeUVycl9TZXRGcm9tRXJybm8oc3NsX1N5c0NhbGxFcnJvcik7CisjZW5kaWYKK30KKworLyoKKyAqIEhhbmRsZSBlcnJvcnMgcmFpc2VkIGJ5IFNTTCBJL08gZnVuY3Rpb25zLiBOT1RFOiBOb3QgU1NMX3NodXRkb3duIDspCisgKgorICogQXJndW1lbnRzOiBzc2wgLSBUaGUgU1NMIG9iamVjdAorICogICAgICAgICAgICBlcnIgLSBUaGUgcmV0dXJuIGNvZGUgZnJvbSBTU0xfZ2V0X2Vycm9yCisgKiAgICAgICAgICAgIHJldCAtIFRoZSByZXR1cm4gY29kZSBmcm9tIHRoZSBTU0wgSS9PIGZ1bmN0aW9uCisgKiBSZXR1cm5zOiAgIE5vbmUsIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gTlVMTAorICovCitzdGF0aWMgdm9pZAoraGFuZGxlX3NzbF9lcnJvcnMoU1NMICpzc2wsIGludCBlcnIsIGludCByZXQpCit7CisgICAgc3dpdGNoIChlcnIpCisgICAgeworCS8qCisgICAgICAgICAqIFN0cmFuZ2UgYXMgaXQgbWF5IHNlZW0sIFplcm9SZXR1cm4gaXMgbm90IGFuIGVycm9yIHBlciBzZS4gSXQgbWVhbnMKKyAgICAgICAgICogdGhhdCB0aGUgU1NMIENvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkIGNvcnJlY3RseSAobm90ZSwgbm90IHRoZQorICAgICAgICAgKiB0cmFuc3BvcnQgbGF5ZXIhKSwgaS5lLiBjbG9zdXJlIGFsZXJ0cyBoYXZlIGJlZW4gZXhjaGFuZ2VkLiBUaGlzIGlzCisgICAgICAgICAqIGFuIGV4Y2VwdGlvbiBzaW5jZQorICAgICAgICAgKiAgKyBUaGVyZSdzIGFuIFNTTCAiZXJyb3IiIGNvZGUgZm9yIGl0CisgICAgICAgICAqICArIFlvdSBoYXZlIHRvIGRlYWwgd2l0aCBpdCBpbiBhbnkgY2FzZSwgY2xvc2UgdGhlIHRyYW5zcG9ydCBsYXllcgorICAgICAgICAgKiAgICBldGMKKyAgICAgICAgICovCisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1pFUk9fUkVUVVJOOgorICAgICAgICAgICAgUHlFcnJfU2V0Tm9uZShzc2xfWmVyb1JldHVybkVycm9yKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBXYW50WFlaIGV4Y2VwdGlvbnMgZG9uJ3QgbWVhbiB0aGF0IHRoZXJlJ3MgYW4gZXJyb3IsIGp1c3QgdGhhdAorICAgICAgICAgKiBub3RoaW5nIGNvdWxkIGJlIHJlYWQvd3JpdHRlbiBqdXN0IG5vdywgbWF5YmUgYmVjYXVzZSB0aGUgdHJhbnNwb3J0CisgICAgICAgICAqIGxheWVyIHdvdWxkIGJsb2NrIG9uIHRoZSBvcGVyYXRpb24sIG9yIHRoYXQgdGhlcmUncyBub3QgZW5vdWdoIGRhdGEKKyAgICAgICAgICogYXZhaWxhYmxlIHRvIGZpbGwgYW4gZW50aXJlIFNTTCByZWNvcmQuCisgICAgICAgICAqLworICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgICAgICBQeUVycl9TZXROb25lKHNzbF9XYW50UmVhZEVycm9yKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgICBQeUVycl9TZXROb25lKHNzbF9XYW50V3JpdGVFcnJvcik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1g1MDlfTE9PS1VQOgorICAgICAgICAgICAgUHlFcnJfU2V0Tm9uZShzc2xfV2FudFg1MDlMb29rdXBFcnJvcik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgICAgaWYgKEVSUl9wZWVrX2Vycm9yKCkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN5c2NhbGxfZnJvbV9lcnJubygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdjsKKworICAgICAgICAgICAgICAgICAgICB2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIC0xLCAiVW5leHBlY3RlZCBFT0YiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHYgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KHNzbF9TeXNDYWxsRXJyb3IsIHYpOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisJLyogTk9URTogRmFsbC10aHJvdWdoIGhlcmUsIHdlIGRvbid0IHdhbnQgdG8gZHVwbGljYXRlIGNvZGUsIHJpZ2h0PyAqLworCisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NTTDoKKyAgICAgICAgICAgIDsKKyAgICAgICAgZGVmYXVsdDoKKwkgICAgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyoKKyAqIEhlcmUgYmUgbWVtYmVyIG1ldGhvZHMgb2YgdGhlIENvbm5lY3Rpb24gImNsYXNzIgorICovCisKK3N0YXRpYyBjaGFyIHNzbF9Db25uZWN0aW9uX2dldF9jb250ZXh0X2RvY1tdID0gIlxuXAorR2V0IHNlc3Npb24gY29udGV4dFxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgQ29ubmVjdGlvbiBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZSBlbXB0eVxuXAorUmV0dXJuczogICBBIENvbnRleHQgb2JqZWN0XG5cCisiOworc3RhdGljIFB5T2JqZWN0ICoKK3NzbF9Db25uZWN0aW9uX2dldF9jb250ZXh0KHNzbF9Db25uZWN0aW9uT2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXRfY29udGV4dCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIFB5X0lOQ1JFRihzZWxmLT5jb250ZXh0KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZi0+Y29udGV4dDsKK30KKworc3RhdGljIGNoYXIgc3NsX0Nvbm5lY3Rpb25fcGVuZGluZ19kb2NbXSA9ICJcblwKK0dldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHNhZmVseSByZWFkIGZyb20gdGhlIGNvbm5lY3Rpb25cblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbm5lY3Rpb24gb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmUgZW1wdHlcblwKK1JldHVybnM6ICAgXG5cCisiOworc3RhdGljIFB5T2JqZWN0ICoKK3NzbF9Db25uZWN0aW9uX3BlbmRpbmcoc3NsX0Nvbm5lY3Rpb25PYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpwZW5kaW5nIikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0ID0gU1NMX3BlbmRpbmcoc2VsZi0+c3NsKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcmV0KTsKK30KKyAgICAKK3N0YXRpYyBjaGFyIHNzbF9Db25uZWN0aW9uX3NlbmRfZG9jW10gPSAiXG5cCitTZW5kIGRhdGEgb24gdGhlIGNvbm5lY3Rpb24uIE5PVEU6IElmIHlvdSBnZXQgb25lIG9mIHRoZSBXYW50UmVhZCxcblwKK1dhbnRXcml0ZSBvciBXYW50WDUwOUxvb2t1cCBleGNlcHRpb25zIG9uIHRoaXMsIHlvdSBoYXZlIHRvIGNhbGwgdGhlXG5cCittZXRob2QgYWdhaW4gd2l0aCB0aGUgU0FNRSBidWZmZXIuXG5cCitcblwKK0FyZ3VtZW50czogc2VsZiAtIFRoZSBDb25uZWN0aW9uIG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlOlxuXAorICAgICAgICAgICAgIGJ1ZiAgIC0gVGhlIHN0cmluZyB0byBzZW5kXG5cCisgICAgICAgICAgICAgZmxhZ3MgLSAob3B0aW9uYWwpIEluY2x1ZGVkIGZvciBjb21wYXRhYmlsaXR5IHdpdGggdGhlIHNvY2tldFxuXAorICAgICAgICAgICAgICAgICAgICAgQVBJLCB0aGUgdmFsdWUgaXMgaWdub3JlZFxuXAorUmV0dXJuczogICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW5cblwKKyI7CitzdGF0aWMgUHlPYmplY3QgKgorc3NsX0Nvbm5lY3Rpb25fc2VuZChzc2xfQ29ubmVjdGlvbk9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY2hhciAqYnVmOworICAgIGludCBsZW4sIHJldCwgZXJyLCBmbGFnczsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8aTpzZW5kIiwgJmJ1ZiwgJmxlbiwgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBNWV9CRUdJTl9BTExPV19USFJFQURTKHNlbGYtPnRzdGF0ZSkKKyAgICByZXQgPSBTU0xfd3JpdGUoc2VsZi0+c3NsLCBidWYsIGxlbik7CisgICAgTVlfRU5EX0FMTE9XX1RIUkVBRFMoc2VsZi0+dHN0YXRlKQorCisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgeworICAgICAgICBmbHVzaF9lcnJvcl9xdWV1ZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNlbGYtPnNzbCwgcmV0KTsKKyAgICBpZiAoZXJyID09IFNTTF9FUlJPUl9OT05FKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXJldCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhhbmRsZV9zc2xfZXJyb3JzKHNlbGYtPnNzbCwgZXJyLCByZXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyIHNzbF9Db25uZWN0aW9uX3NlbmRhbGxfZG9jW10gPSAiXG5cCitTZW5kIFwiYWxsXCIgZGF0YSBvbiB0aGUgY29ubmVjdGlvbi4gVGhpcyBjYWxscyBzZW5kKCkgcmVwZWF0ZWRseSB1bnRpbFxuXAorYWxsIGRhdGEgaXMgc2VudC4gSWYgYW4gZXJyb3Igb2NjdXJzLCBpdCdzIGltcG9zc2libGUgdG8gdGVsbCBob3cgbXVjaCBkYXRhXG5cCitoYXMgYmVlbiBzZW50LlxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgQ29ubmVjdGlvbiBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZTpcblwKKyAgICAgICAgICAgICBidWYgICAtIFRoZSBzdHJpbmcgdG8gc2VuZFxuXAorICAgICAgICAgICAgIGZsYWdzIC0gKG9wdGlvbmFsKSBJbmNsdWRlZCBmb3IgY29tcGF0YWJpbGl0eSB3aXRoIHRoZSBzb2NrZXRcblwKKyAgICAgICAgICAgICAgICAgICAgIEFQSSwgdGhlIHZhbHVlIGlzIGlnbm9yZWRcblwKK1JldHVybnM6ICAgVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuXG5cCisiOworc3RhdGljIFB5T2JqZWN0ICoKK3NzbF9Db25uZWN0aW9uX3NlbmRhbGwoc3NsX0Nvbm5lY3Rpb25PYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgbGVuLCByZXQsIGVyciwgZmxhZ3M7CisgICAgUHlPYmplY3QgKnB5cmV0ID0gUHlfTm9uZTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8aTpzZW5kYWxsIiwgJmJ1ZiwgJmxlbiwgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBkbyB7CisgICAgICAgIE1ZX0JFR0lOX0FMTE9XX1RIUkVBRFMoc2VsZi0+dHN0YXRlKQorICAgICAgICByZXQgPSBTU0xfd3JpdGUoc2VsZi0+c3NsLCBidWYsIGxlbik7CisgICAgICAgIE1ZX0VORF9BTExPV19USFJFQURTKHNlbGYtPnRzdGF0ZSkKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsdXNoX2Vycm9yX3F1ZXVlKCk7CisgICAgICAgICAgICBweXJldCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNlbGYtPnNzbCwgcmV0KTsKKyAgICAgICAgaWYgKGVyciA9PSBTU0xfRVJST1JfTk9ORSkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmICs9IHJldDsKKyAgICAgICAgICAgIGxlbiAtPSByZXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZXJyID09IFNTTF9FUlJPUl9TU0wgfHwgZXJyID09IFNTTF9FUlJPUl9TWVNDQUxMIHx8CisgICAgICAgICAgICAgICAgIGVyciA9PSBTU0xfRVJST1JfWkVST19SRVRVUk4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbmRsZV9zc2xfZXJyb3JzKHNlbGYtPnNzbCwgZXJyLCByZXQpOworICAgICAgICAgICAgcHlyZXQgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gICAgCisgICAgfSB3aGlsZSAobGVuID4gMCk7CisKKyAgICBQeV9YSU5DUkVGKHB5cmV0KTsKKyAgICByZXR1cm4gcHlyZXQ7Cit9CisKK3N0YXRpYyBjaGFyIHNzbF9Db25uZWN0aW9uX3JlY3ZfZG9jW10gPSAiXG5cCitSZWNlaXZlIGRhdGEgb24gdGhlIGNvbm5lY3Rpb24uIE5PVEU6IElmIHlvdSBnZXQgb25lIG9mIHRoZSBXYW50UmVhZCxcblwKK1dhbnRXcml0ZSBvciBXYW50WDUwOUxvb2t1cCBleGNlcHRpb25zIG9uIHRoaXMsIHlvdSBoYXZlIHRvIGNhbGwgdGhlXG5cCittZXRob2QgYWdhaW4gd2l0aCB0aGUgU0FNRSBidWZmZXIuXG5cCitcblwKK0FyZ3VtZW50czogc2VsZiAtIFRoZSBDb25uZWN0aW9uIG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlOlxuXAorICAgICAgICAgICAgIGJ1ZnNpeiAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkXG5cCisgICAgICAgICAgICAgZmxhZ3MgIC0gKG9wdGlvbmFsKSBJbmNsdWRlZCBmb3IgY29tcGF0YWJpbGl0eSB3aXRoIHRoZSBzb2NrZXRcblwKKyAgICAgICAgICAgICAgICAgICAgICBBUEksIHRoZSB2YWx1ZSBpcyBpZ25vcmVkXG5cCitSZXR1cm5zOiAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZFxuXAorIjsKK3N0YXRpYyBQeU9iamVjdCAqCitzc2xfQ29ubmVjdGlvbl9yZWN2KHNzbF9Db25uZWN0aW9uT2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBpbnQgYnVmc2l6LCByZXQsIGVyciwgZmxhZ3M7CisgICAgUHlPYmplY3QgKmJ1ZjsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxpOnJlY3YiLCAmYnVmc2l6LCAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGJ1ZiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ1ZnNpeik7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIE1ZX0JFR0lOX0FMTE9XX1RIUkVBRFMoc2VsZi0+dHN0YXRlKQorICAgIHJldCA9IFNTTF9yZWFkKHNlbGYtPnNzbCwgUHlTdHJpbmdfQXNTdHJpbmcoYnVmKSwgYnVmc2l6KTsKKyAgICBNWV9FTkRfQUxMT1dfVEhSRUFEUyhzZWxmLT50c3RhdGUpCisKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICB7CisgICAgICAgIFB5X0RFQ1JFRihidWYpOworICAgICAgICBmbHVzaF9lcnJvcl9xdWV1ZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBlcnIgPSBTU0xfZ2V0X2Vycm9yKHNlbGYtPnNzbCwgcmV0KTsKKyAgICBpZiAoZXJyID09IFNTTF9FUlJPUl9OT05FKQorICAgIHsKKyAgICAgICAgaWYgKHJldCAhPSBidWZzaXogJiYgX1B5U3RyaW5nX1Jlc2l6ZSgmYnVmLCByZXQpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoYW5kbGVfc3NsX2Vycm9ycyhzZWxmLT5zc2wsIGVyciwgcmV0KTsKKyAgICAgICAgUHlfREVDUkVGKGJ1Zik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworc3RhdGljIGNoYXIgc3NsX0Nvbm5lY3Rpb25fcmVuZWdvdGlhdGVfZG9jW10gPSAiXG5cCitSZW5lZ290aWF0ZSB0aGUgc2Vzc2lvblxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgQ29ubmVjdGlvbiBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZSBlbXB0eVxuXAorUmV0dXJuczogICBUcnVlIGlmIHRoZSByZW5lZ290aWF0aW9uIGNhbiBiZSBzdGFydGVkLCBmYWxzZSBvdGhlcndpc2VcblwKKyI7CitzdGF0aWMgUHlPYmplY3QgKgorc3NsX0Nvbm5lY3Rpb25fcmVuZWdvdGlhdGUoc3NsX0Nvbm5lY3Rpb25PYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpyZW5lZ290aWF0ZSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIE1ZX0JFR0lOX0FMTE9XX1RIUkVBRFMoc2VsZi0+dHN0YXRlKTsKKyAgICByZXQgPSBTU0xfcmVuZWdvdGlhdGUoc2VsZi0+c3NsKTsKKyAgICBNWV9FTkRfQUxMT1dfVEhSRUFEUyhzZWxmLT50c3RhdGUpOworCisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgeworICAgICAgICBmbHVzaF9lcnJvcl9xdWV1ZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcmV0KTsKK30KKworc3RhdGljIGNoYXIgc3NsX0Nvbm5lY3Rpb25fZG9faGFuZHNoYWtlX2RvY1tdID0gIlxuXAorUGVyZm9ybSBhbiBTU0wgaGFuZHNoYWtlICh1c3VhbGx5IGNhbGxlZCBhZnRlciByZW5lZ290aWF0ZSgpIG9yIG9uZSBvZlxuXAorc2V0Xypfc3RhdGUoKSkuIFRoaXMgY2FuIHJhaXNlIHRoZSBzYW1lIGV4Y2VwdGlvbnMgYXMgc2VuZCBhbmQgcmVjdi5cblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbm5lY3Rpb24gb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmUgZW1wdHlcblwKK1JldHVybnM6ICAgTm9uZS5cblwKKyI7CitzdGF0aWMgUHlPYmplY3QgKgorc3NsX0Nvbm5lY3Rpb25fZG9faGFuZHNoYWtlKHNzbF9Db25uZWN0aW9uT2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBpbnQgcmV0LCBlcnI7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpkb19oYW5kc2hha2UiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBNWV9CRUdJTl9BTExPV19USFJFQURTKHNlbGYtPnRzdGF0ZSk7CisgICAgcmV0ID0gU1NMX2RvX2hhbmRzaGFrZShzZWxmLT5zc2wpOworICAgIE1ZX0VORF9BTExPV19USFJFQURTKHNlbGYtPnRzdGF0ZSk7CisKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICB7CisgICAgICAgIGZsdXNoX2Vycm9yX3F1ZXVlKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGVyciA9IFNTTF9nZXRfZXJyb3Ioc2VsZi0+c3NsLCByZXQpOworICAgIGlmIChlcnIgPT0gU1NMX0VSUk9SX05PTkUpCisgICAgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoYW5kbGVfc3NsX2Vycm9ycyhzZWxmLT5zc2wsIGVyciwgcmV0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCisjaWYgZGVmaW5lZChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSKSAmJiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MDA5MDcwMDBMCitzdGF0aWMgY2hhciBzc2xfQ29ubmVjdGlvbl9yZW5lZ290aWF0ZV9wZW5kaW5nX2RvY1tdID0gIlxuXAorQ2hlY2sgaWYgdGhlcmUncyBhIHJlbmVnb3RpYXRpb24gaW4gcHJvZ3Jlc3MsIGl0IHdpbGwgcmV0dXJuIGZhbHNlIG9uY2VcblwKK2EgcmVuZWdvdGlhdGlvbiBpcyBmaW5pc2hlZC5cblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbm5lY3Rpb24gb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmUgZW1wdHlcblwKK1JldHVybnM6ICAgV2hldGhlciB0aGVyZSdzIGEgcmVuZWdvdGlhdGlvbiBpbiBwcm9ncmVzc1xuXAorIjsKK3N0YXRpYyBQeU9iamVjdCAqCitzc2xfQ29ubmVjdGlvbl9yZW5lZ290aWF0ZV9wZW5kaW5nKHNzbF9Db25uZWN0aW9uT2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpyZW5lZ290aWF0ZV9wZW5kaW5nIikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKVNTTF9yZW5lZ290aWF0ZV9wZW5kaW5nKHNlbGYtPnNzbCkpOworfQorI2VuZGlmCisKK3N0YXRpYyBjaGFyIHNzbF9Db25uZWN0aW9uX3RvdGFsX3JlbmVnb3RpYXRpb25zX2RvY1tdID0gIlxuXAorRmluZCBvdXQgdGhlIHRvdGFsIG51bWJlciBvZiByZW5lZ290aWF0aW9ucy5cblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbm5lY3Rpb24gb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmUgZW1wdHlcblwKK1JldHVybnM6ICAgVGhlIG51bWJlciBvZiByZW5lZ290aWF0aW9ucy5cblwKKyI7CitzdGF0aWMgUHlPYmplY3QgKgorc3NsX0Nvbm5lY3Rpb25fdG90YWxfcmVuZWdvdGlhdGlvbnMoc3NsX0Nvbm5lY3Rpb25PYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOnRvdGFsX3JlbmVnb3RpYXRpb25zIikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKFNTTF90b3RhbF9yZW5lZ290aWF0aW9ucyhzZWxmLT5zc2wpKTsKK30KKworc3RhdGljIGNoYXIgc3NsX0Nvbm5lY3Rpb25fc2V0X2FjY2VwdF9zdGF0ZV9kb2NbXSA9ICJcblwKK1NldCB0aGUgY29ubmVjdGlvbiB0byB3b3JrIGluIHNlcnZlciBtb2RlLiBUaGUgaGFuZHNoYWtlIHdpbGwgYmUgaGFuZGxlZFxuXAorYXV0b21hdGljYWxseSBieSByZWFkL3dyaXRlLlxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgQ29ubmVjdGlvbiBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZSBlbXB0eVxuXAorUmV0dXJuczogICBOb25lXG5cCisiOworc3RhdGljIFB5T2JqZWN0ICoKK3NzbF9Db25uZWN0aW9uX3NldF9hY2NlcHRfc3RhdGUoc3NsX0Nvbm5lY3Rpb25PYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOnNldF9hY2NlcHRfc3RhdGUiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBTU0xfc2V0X2FjY2VwdF9zdGF0ZShzZWxmLT5zc2wpOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCitzdGF0aWMgY2hhciBzc2xfQ29ubmVjdGlvbl9zZXRfY29ubmVjdF9zdGF0ZV9kb2NbXSA9ICJcblwKK1NldCB0aGUgY29ubmVjdGlvbiB0byB3b3JrIGluIGNsaWVudCBtb2RlLiBUaGUgaGFuZHNoYWtlIHdpbGwgYmUgaGFuZGxlZFxuXAorYXV0b21hdGljYWxseSBieSByZWFkL3dyaXRlLlxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgQ29ubmVjdGlvbiBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZSBlbXB0eVxuXAorUmV0dXJuczogICBOb25lXG5cCisiOworc3RhdGljIFB5T2JqZWN0ICoKK3NzbF9Db25uZWN0aW9uX3NldF9jb25uZWN0X3N0YXRlKHNzbF9Db25uZWN0aW9uT2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpzZXRfY29ubmVjdF9zdGF0ZSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIFNTTF9zZXRfY29ubmVjdF9zdGF0ZShzZWxmLT5zc2wpOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCitzdGF0aWMgY2hhciBzc2xfQ29ubmVjdGlvbl9jb25uZWN0X2RvY1tdID0gIlxuXAorQ29ubmVjdCB0byByZW1vdGUgaG9zdCBhbmQgc2V0IHVwIGNsaWVudC1zaWRlIFNTTFxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgQ29ubmVjdGlvbiBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZTpcblwKKyAgICAgICAgICAgICBhZGRyIC0gQSByZW1vdGUgYWRkcmVzc1xuXAorUmV0dXJuczogICBXaGF0IHRoZSBzb2NrZXQncyBjb25uZWN0IG1ldGhvZCByZXR1cm5zXG5cCisiOworc3RhdGljIFB5T2JqZWN0ICoKK3NzbF9Db25uZWN0aW9uX2Nvbm5lY3Qoc3NsX0Nvbm5lY3Rpb25PYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIFB5T2JqZWN0ICptZXRoLCAqcmV0OworCisgICAgaWYgKChtZXRoID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLT5zb2NrZXQsICJjb25uZWN0IikpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgU1NMX3NldF9jb25uZWN0X3N0YXRlKHNlbGYtPnNzbCk7CisKKyAgICByZXQgPSBQeUV2YWxfQ2FsbE9iamVjdChtZXRoLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYobWV0aCk7CisgICAgaWYgKHJldCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjaGFyIHNzbF9Db25uZWN0aW9uX2Nvbm5lY3RfZXhfZG9jW10gPSAiXG5cCitDb25uZWN0IHRvIHJlbW90ZSBob3N0IGFuZCBzZXQgdXAgY2xpZW50LXNpZGUgU1NMLiBOb3RlIHRoYXQgaWYgdGhlIHNvY2tldCdzXG5cCitjb25uZWN0X2V4IG1ldGhvZCBkb2Vzbid0IHJldHVybiAwLCBTU0wgd29uJ3QgYmUgaW5pdGlhbGl6ZWQuXG5cCitcblwKK0FyZ3VtZW50czogc2VsZiAtIFRoZSBDb25uZWN0aW9uIG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlOlxuXAorICAgICAgICAgICAgIGFkZHIgLSBBIHJlbW92ZSBhZGRyZXNzXG5cCitSZXR1cm5zOiAgIFdoYXQgdGhlIHNvY2tldCdzIGNvbm5lY3RfZXggbWV0aG9kIHJldHVybnNcblwKKyI7CitzdGF0aWMgUHlPYmplY3QgKgorc3NsX0Nvbm5lY3Rpb25fY29ubmVjdF9leChzc2xfQ29ubmVjdGlvbk9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgUHlPYmplY3QgKm1ldGgsICpyZXQ7CisKKyAgICBpZiAoKG1ldGggPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlbGYtPnNvY2tldCwgImNvbm5lY3RfZXgiKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBTU0xfc2V0X2Nvbm5lY3Rfc3RhdGUoc2VsZi0+c3NsKTsKKworICAgIHJldCA9IFB5RXZhbF9DYWxsT2JqZWN0KG1ldGgsIGFyZ3MpOworICAgIFB5X0RFQ1JFRihtZXRoKTsKKyAgICBpZiAocmV0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeUludF9DaGVjayhyZXQpICYmIFB5SW50X0FzTG9uZyhyZXQpICE9IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY2hhciBzc2xfQ29ubmVjdGlvbl9hY2NlcHRfZG9jW10gPSAiXG5cCitBY2NlcHQgaW5jb21pbmcgY29ubmVjdGlvbiBhbmQgc2V0IHVwIFNTTCBvbiBpdFxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgQ29ubmVjdGlvbiBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZSBlbXB0eVxuXAorUmV0dXJuczogICBBIChjb25uLGFkZHIpIHBhaXIgd2hlcmUgY29ubiBpcyBhIENvbm5lY3Rpb24gYW5kIGFkZHIgaXMgYW5cblwKKyAgICAgICAgICAgYWRkcmVzc1xuXAorIjsKK3N0YXRpYyBQeU9iamVjdCAqCitzc2xfQ29ubmVjdGlvbl9hY2NlcHQoc3NsX0Nvbm5lY3Rpb25PYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIFB5T2JqZWN0ICp0dXBsZSwgKnNvY2tldCwgKmFkZHJlc3MsICptZXRoOworICAgIHNzbF9Db25uZWN0aW9uT2JqICpjb25uOworCisgICAgaWYgKChtZXRoID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLT5zb2NrZXQsICJhY2NlcHQiKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdHVwbGUgPSBQeUV2YWxfQ2FsbE9iamVjdChtZXRoLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYobWV0aCk7CisgICAgaWYgKHR1cGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgc29ja2V0ICA9IFB5VHVwbGVfR2V0SXRlbSh0dXBsZSwgMCk7CisgICAgUHlfSU5DUkVGKHNvY2tldCk7CisgICAgYWRkcmVzcyA9IFB5VHVwbGVfR2V0SXRlbSh0dXBsZSwgMSk7CisgICAgUHlfSU5DUkVGKGFkZHJlc3MpOworICAgIFB5X0RFQ1JFRih0dXBsZSk7CisKKyAgICBjb25uID0gc3NsX0Nvbm5lY3Rpb25fTmV3KHNlbGYtPmNvbnRleHQsIHNvY2tldCk7CisgICAgUHlfREVDUkVGKHNvY2tldCk7CisgICAgaWYgKGNvbm4gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5X0RFQ1JFRihhZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgU1NMX3NldF9hY2NlcHRfc3RhdGUoY29ubi0+c3NsKTsKKworICAgIHR1cGxlID0gUHlfQnVpbGRWYWx1ZSgiKE9PKSIsIGNvbm4sIGFkZHJlc3MpOworCisgICAgUHlfREVDUkVGKGNvbm4pOworICAgIFB5X0RFQ1JFRihhZGRyZXNzKTsKKworICAgIHJldHVybiB0dXBsZTsKK30KKworc3RhdGljIGNoYXIgc3NsX0Nvbm5lY3Rpb25fc2h1dGRvd25fZG9jW10gPSAiXG5cCitTZW5kIGNsb3N1cmUgYWxlcnRcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbm5lY3Rpb24gb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmUgZW1wdHlcblwKK1JldHVybnM6ICAgVHJ1ZSBpZiB0aGUgc2h1dGRvd24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAoaS5lLiBib3RoIHNpZGVzXG5cCisgICAgICAgICAgIGhhdmUgc2VudCBjbG9zdXJlIGFsZXJ0cyksIGZhbHNlIG90aGVyd2lzZSAoaS5lLiB5b3UgaGF2ZSB0b1xuXAorICAgICAgICAgICB3YWl0IGZvciBhIFplcm9SZXR1cm5FcnJvciBvbiBhIHJlY3YoKSBtZXRob2QgY2FsbFxuXAorIjsKK3N0YXRpYyBQeU9iamVjdCAqCitzc2xfQ29ubmVjdGlvbl9zaHV0ZG93bihzc2xfQ29ubmVjdGlvbk9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaW50IHJldDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOnNodXRkb3duIikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgTVlfQkVHSU5fQUxMT1dfVEhSRUFEUyhzZWxmLT50c3RhdGUpCisgICAgcmV0ID0gU1NMX3NodXRkb3duKHNlbGYtPnNzbCk7CisgICAgTVlfRU5EX0FMTE9XX1RIUkVBRFMoc2VsZi0+dHN0YXRlKQorCisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgeworICAgICAgICBmbHVzaF9lcnJvcl9xdWV1ZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAocmV0IDwgMCkKKyAgICB7CisgICAgICAgIGV4Y2VwdGlvbl9mcm9tX2Vycm9yX3F1ZXVlKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChyZXQgPiAwKQorICAgIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X1RydWUpOworICAgICAgICByZXR1cm4gUHlfVHJ1ZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X0ZhbHNlKTsKKyAgICAgICAgcmV0dXJuIFB5X0ZhbHNlOworICAgIH0KK30KKworc3RhdGljIGNoYXIgc3NsX0Nvbm5lY3Rpb25fZ2V0X2NpcGhlcl9saXN0X2RvY1tdID0gIlxuXAorR2V0IHRoZSBzZXNzaW9uIGNpcGhlciBsaXN0XG5cCitXQVJOSU5HOiBBUEkgY2hhbmdlISBUaGlzIHVzZWQgdG8gdGFrZSBhbiBvcHRpb25hbCBhcmd1bWVudCwgYW5kIHJldHVybiBhXG5cCitzdHJpbmcuXG5cCitcblwKK0FyZ3VtZW50czogc2VsZiAtIFRoZSBDb25uZWN0aW9uIG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlIGVtcHR5XG5cCitSZXR1cm5zOiAgIEEgbGlzdCBvZiBjaXBoZXIgc3RyaW5nc1xuXAorIjsKK3N0YXRpYyBQeU9iamVjdCAqCitzc2xfQ29ubmVjdGlvbl9nZXRfY2lwaGVyX2xpc3Qoc3NsX0Nvbm5lY3Rpb25PYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGludCBpZHggPSAwOworICAgIGNvbnN0IGNoYXIgKnJldDsKKyAgICBQeU9iamVjdCAqbHN0LCAqaXRlbTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldF9jaXBoZXJfbGlzdCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGxzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgd2hpbGUgKChyZXQgPSBTU0xfZ2V0X2NpcGhlcl9saXN0KHNlbGYtPnNzbCwgaWR4KSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGl0ZW0gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHJldCk7CisgICAgICAgIFB5TGlzdF9BcHBlbmQobHN0LCBpdGVtKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICBpZHgrKzsKKyAgICB9CisgICAgcmV0dXJuIGxzdDsKK30KKworc3RhdGljIGNoYXIgc3NsX0Nvbm5lY3Rpb25fbWFrZWZpbGVfZG9jW10gPSAiXG5cCitUaGUgbWFrZWZpbGUoKSBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLCBzaW5jZSB0aGVyZSBpcyBubyBkdXAgc2VtYW50aWNzXG5cCitmb3IgU1NMIGNvbm5lY3Rpb25zXG5cCitYWFg6IFJldHVybiBzZWxmIGluc3RlYWQ/XG5cCitcblwKK0FyZ3VtZW50czogc2VsZiAtIFRoZSBDb25uZWN0aW9uIG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlIGVtcHR5XG5cCitSZXR1cm5zOiAgIE5VTExcblwKKyI7CitzdGF0aWMgUHlPYmplY3QgKgorc3NsX0Nvbm5lY3Rpb25fbWFrZWZpbGUoc3NsX0Nvbm5lY3Rpb25PYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCAiQ2Fubm90IG1ha2UgZmlsZSBvYmplY3Qgb2YgU1NMLkNvbm5lY3Rpb24iKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNoYXIgc3NsX0Nvbm5lY3Rpb25fZ2V0X2FwcF9kYXRhX2RvY1tdID0gIlxuXAorR2V0IGFwcGxpY2F0aW9uIGRhdGFcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbm5lY3Rpb24gb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmUgZW1wdHlcblwKK1JldHVybnM6ICAgVGhlIGFwcGxpY2F0aW9uIGRhdGFcblwKKyI7CitzdGF0aWMgUHlPYmplY3QgKgorc3NsX0Nvbm5lY3Rpb25fZ2V0X2FwcF9kYXRhKHNzbF9Db25uZWN0aW9uT2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXRfYXBwX2RhdGEiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBQeV9JTkNSRUYoc2VsZi0+YXBwX2RhdGEpOworICAgIHJldHVybiBzZWxmLT5hcHBfZGF0YTsKK30KKworc3RhdGljIGNoYXIgc3NsX0Nvbm5lY3Rpb25fc2V0X2FwcF9kYXRhX2RvY1tdID0gIlxuXAorU2V0IGFwcGxpY2F0aW9uIGRhdGFcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbm5lY3Rpb24gb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmVcblwKKyAgICAgICAgICAgICBkYXRhIC0gVGhlIGFwcGxpY2F0aW9uIGRhdGFcblwKK1JldHVybnM6ICAgTm9uZVxuXAorIjsKK3N0YXRpYyBQeU9iamVjdCAqCitzc2xfQ29ubmVjdGlvbl9zZXRfYXBwX2RhdGEoc3NsX0Nvbm5lY3Rpb25PYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIFB5T2JqZWN0ICpkYXRhOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOnNldF9hcHBfZGF0YSIsICZkYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBQeV9ERUNSRUYoc2VsZi0+YXBwX2RhdGEpOworICAgIFB5X0lOQ1JFRihkYXRhKTsKKyAgICBzZWxmLT5hcHBfZGF0YSA9IGRhdGE7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBjaGFyIHNzbF9Db25uZWN0aW9uX3N0YXRlX3N0cmluZ19kb2NbXSA9ICJcblwKK0dldCBhIHZlcmJvc2Ugc3RhdGUgZGVzY3JpcHRpb25cblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbm5lY3Rpb24gb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmUgZW1wdHlcblwKK1JldHVybnM6ICAgQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZVxuXAorIjsKK3N0YXRpYyBQeU9iamVjdCAqCitzc2xfQ29ubmVjdGlvbl9zdGF0ZV9zdHJpbmcoc3NsX0Nvbm5lY3Rpb25PYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOnN0YXRlX3N0cmluZyIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKFNTTF9zdGF0ZV9zdHJpbmdfbG9uZyhzZWxmLT5zc2wpKTsKK30KKworc3RhdGljIGNoYXIgc3NsX0Nvbm5lY3Rpb25fc29ja19zaHV0ZG93bl9kb2NbXSA9ICJcblwKK1NlZSBzaHV0ZG93bigyKVxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgQ29ubmVjdGlvbiBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZSB3aGF0ZXZlciB0aGVcblwKKyAgICAgICAgICAgICAgICAgIHNvY2tldCdzIHNodXRkb3duKCkgbWV0aG9kIGV4cGVjdHNcblwKK1JldHVybnM6ICAgV2hhdCB0aGUgc29ja2V0J3Mgc2h1dGRvd24oKSBtZXRob2QgcmV0dXJuc1xuXAorIjsKK3N0YXRpYyBQeU9iamVjdCAqCitzc2xfQ29ubmVjdGlvbl9zb2NrX3NodXRkb3duKHNzbF9Db25uZWN0aW9uT2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBQeU9iamVjdCAqbWV0aCwgKnJldDsKKworICAgIGlmICgobWV0aCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc2VsZi0+c29ja2V0LCAic2h1dGRvd24iKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0ID0gUHlFdmFsX0NhbGxPYmplY3QobWV0aCwgYXJncyk7CisgICAgUHlfREVDUkVGKG1ldGgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjaGFyIHNzbF9Db25uZWN0aW9uX2dldF9wZWVyX2NlcnRpZmljYXRlX2RvY1tdID0gIlxuXAorUmV0cmlldmUgdGhlIG90aGVyIHNpZGUncyBjZXJ0aWZpY2F0ZSAoaWYgYW55KVxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgQ29ubmVjdGlvbiBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZSBlbXB0eVxuXAorUmV0dXJuczogICBUaGUgcGVlcidzIGNlcnRpZmljYXRlXG5cCisiOworc3RhdGljIFB5T2JqZWN0ICoKK3NzbF9Db25uZWN0aW9uX2dldF9wZWVyX2NlcnRpZmljYXRlKHNzbF9Db25uZWN0aW9uT2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBYNTA5ICpjZXJ0OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0X3BlZXJfY2VydGlmaWNhdGUiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBjZXJ0ID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNlbGYtPnNzbCk7CisgICAgaWYgKGNlcnQgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKiljcnlwdG9fWDUwOV9OZXcoY2VydCwgMSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorfQorCitzdGF0aWMgY2hhciBzc2xfQ29ubmVjdGlvbl93YW50X3JlYWRfZG9jW10gPSAiXG5cCitDaGVja3MgaWYgbW9yZSBkYXRhIGhhcyB0byBiZSByZWFkIGZyb20gdGhlIHRyYW5zcG9ydCBsYXllciB0byBjb21wbGV0ZSBhblxuXAorb3BlcmF0aW9uLlxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgQ29ubmVjdGlvbiBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZSBlbXB0eVxuXAorUmV0dXJuczogICBUcnVlIGlmZiBtb3JlIGRhdGEgaGFzIHRvIGJlIHJlYWRcblwKKyI7CitzdGF0aWMgUHlPYmplY3QgKgorc3NsX0Nvbm5lY3Rpb25fd2FudF9yZWFkKHNzbF9Db25uZWN0aW9uT2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjp3YW50X3JlYWQiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpU1NMX3dhbnRfcmVhZChzZWxmLT5zc2wpKTsKK30KKworc3RhdGljIGNoYXIgc3NsX0Nvbm5lY3Rpb25fd2FudF93cml0ZV9kb2NbXSA9ICJcblwKK0NoZWNrcyBpZiB0aGVyZSBpcyBkYXRhIHRvIHdyaXRlIHRvIHRoZSB0cmFuc3BvcnQgbGF5ZXIgdG8gY29tcGxldGUgYW5cblwKK29wZXJhdGlvbi5cblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbm5lY3Rpb24gb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmUgZW1wdHlcblwKK1JldHVybnM6ICAgVHJ1ZSBpZmYgdGhlcmUgaXMgZGF0YSB0byB3cml0ZVxuXAorIjsKK3N0YXRpYyBQeU9iamVjdCAqCitzc2xfQ29ubmVjdGlvbl93YW50X3dyaXRlKHNzbF9Db25uZWN0aW9uT2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjp3YW50X3dyaXRlIikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKVNTTF93YW50X3dyaXRlKHNlbGYtPnNzbCkpOworfQorCisvKgorICogTWVtYmVyIG1ldGhvZHMgaW4gdGhlIENvbm5lY3Rpb24gb2JqZWN0CisgKiBBRERfTUVUSE9EKG5hbWUpIGV4cGFuZHMgdG8gYSBjb3JyZWN0IFB5TWV0aG9kRGVmIGRlY2xhcmF0aW9uCisgKiAgIHsgICduYW1lJywgKFB5Q0Z1bmN0aW9uKXNzbF9Db25uZWN0aW9uX25hbWUsIE1FVEhfVkFSQVJHUyB9CisgKiBmb3IgY29udmVuaWVuY2UKKyAqIEFERF9BTElBUyhuYW1lLHJlYWwpIGNyZWF0ZXMgYW4gImFsaWFzIiBvZiB0aGUgc3NsX0Nvbm5lY3Rpb25fcmVhbAorICogZnVuY3Rpb24gd2l0aCB0aGUgbmFtZSAnbmFtZScKKyAqLworI2RlZmluZSBBRERfTUVUSE9EKG5hbWUpICAgICAgICBcCisgICAgeyAjbmFtZSwgKFB5Q0Z1bmN0aW9uKXNzbF9Db25uZWN0aW9uXyMjbmFtZSwgTUVUSF9WQVJBUkdTLCBzc2xfQ29ubmVjdGlvbl8jI25hbWUjI19kb2MgfQorI2RlZmluZSBBRERfQUxJQVMobmFtZSxyZWFsKSAgICBcCisgICAgeyAjbmFtZSwgKFB5Q0Z1bmN0aW9uKXNzbF9Db25uZWN0aW9uXyMjcmVhbCwgTUVUSF9WQVJBUkdTLCBzc2xfQ29ubmVjdGlvbl8jI3JlYWwjI19kb2MgfQorc3RhdGljIFB5TWV0aG9kRGVmIHNzbF9Db25uZWN0aW9uX21ldGhvZHNbXSA9Cit7CisgICAgQUREX01FVEhPRChnZXRfY29udGV4dCksCisgICAgQUREX01FVEhPRChwZW5kaW5nKSwKKyAgICBBRERfTUVUSE9EKHNlbmQpLAorICAgIEFERF9BTElBUyAod3JpdGUsIHNlbmQpLAorICAgIEFERF9NRVRIT0Qoc2VuZGFsbCksCisgICAgQUREX01FVEhPRChyZWN2KSwKKyAgICBBRERfQUxJQVMgKHJlYWQsIHJlY3YpLAorICAgIEFERF9NRVRIT0QocmVuZWdvdGlhdGUpLAorICAgIEFERF9NRVRIT0QoZG9faGFuZHNoYWtlKSwKKyNpZiBkZWZpbmVkKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIpICYmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgwMDkwNzAwMEwKKyAgICBBRERfTUVUSE9EKHJlbmVnb3RpYXRlX3BlbmRpbmcpLAorI2VuZGlmCisgICAgQUREX01FVEhPRCh0b3RhbF9yZW5lZ290aWF0aW9ucyksCisgICAgQUREX01FVEhPRChjb25uZWN0KSwKKyAgICBBRERfTUVUSE9EKGNvbm5lY3RfZXgpLAorICAgIEFERF9NRVRIT0QoYWNjZXB0KSwKKyAgICBBRERfTUVUSE9EKHNodXRkb3duKSwKKyAgICBBRERfTUVUSE9EKGdldF9jaXBoZXJfbGlzdCksCisgICAgQUREX01FVEhPRChtYWtlZmlsZSksCisgICAgQUREX01FVEhPRChnZXRfYXBwX2RhdGEpLAorICAgIEFERF9NRVRIT0Qoc2V0X2FwcF9kYXRhKSwKKyAgICBBRERfTUVUSE9EKHN0YXRlX3N0cmluZyksCisgICAgQUREX01FVEhPRChzb2NrX3NodXRkb3duKSwKKyAgICBBRERfTUVUSE9EKGdldF9wZWVyX2NlcnRpZmljYXRlKSwKKyAgICBBRERfTUVUSE9EKHdhbnRfcmVhZCksCisgICAgQUREX01FVEhPRCh3YW50X3dyaXRlKSwKKyAgICBBRERfTUVUSE9EKHNldF9hY2NlcHRfc3RhdGUpLAorICAgIEFERF9NRVRIT0Qoc2V0X2Nvbm5lY3Rfc3RhdGUpLAorICAgIHsgTlVMTCwgTlVMTCB9Cit9OworI3VuZGVmIEFERF9BTElBUworI3VuZGVmIEFERF9NRVRIT0QKKworCisvKgorICogQ29uc3RydWN0b3IgZm9yIENvbm5lY3Rpb24gb2JqZWN0cworICoKKyAqIEFyZ3VtZW50czogY3R4ICAtIEFuIFNTTCBDb250ZXh0IHRvIHVzZSBmb3IgdGhpcyBjb25uZWN0aW9uCisgKiAgICAgICAgICAgIHNvY2sgLSBUaGUgc29ja2V0IHRvIHVzZSBmb3IgdHJhbnNwb3J0IGxheWVyCisgKiBSZXR1cm5zOiAgIFRoZSBuZXdseSBjcmVhdGVkIENvbm5lY3Rpb24gb2JqZWN0CisgKi8KK3NzbF9Db25uZWN0aW9uT2JqICoKK3NzbF9Db25uZWN0aW9uX05ldyhzc2xfQ29udGV4dE9iaiAqY3R4LCBQeU9iamVjdCAqc29jaykKK3sKKyAgICBzc2xfQ29ubmVjdGlvbk9iaiAqc2VsZjsKKyAgICBpbnQgZmQ7CisKKyAgICBzZWxmID0gUHlPYmplY3RfR0NfTmV3KHNzbF9Db25uZWN0aW9uT2JqLCAmc3NsX0Nvbm5lY3Rpb25fVHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBQeV9JTkNSRUYoY3R4KTsKKyAgICBzZWxmLT5jb250ZXh0ID0gY3R4OworCisgICAgUHlfSU5DUkVGKHNvY2spOworICAgIHNlbGYtPnNvY2tldCA9IHNvY2s7CisKKyAgICBzZWxmLT5zc2wgPSBOVUxMOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHNlbGYtPmFwcF9kYXRhID0gUHlfTm9uZTsKKworICAgIHNlbGYtPnRzdGF0ZSA9IE5VTEw7CisKKyAgICBmZCA9IFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3Ioc2VsZi0+c29ja2V0KTsKKyAgICBpZiAoZmQgPCAwKQorICAgIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzZWxmLT5zc2wgPSBTU0xfbmV3KHNlbGYtPmNvbnRleHQtPmN0eCk7CisgICAgU1NMX3NldF9hcHBfZGF0YShzZWxmLT5zc2wsIHNlbGYpOworICAgIFNTTF9zZXRfZmQoc2VsZi0+c3NsLCAoU09DS0VUX1QpZmQpOworCisgICAgUHlPYmplY3RfR0NfVHJhY2soc2VsZik7CisKKyAgICByZXR1cm4gc2VsZjsKK30KKworLyoKKyAqIEZpbmQgYXR0cmlidXRlCisgKgorICogQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbm5lY3Rpb24gb2JqZWN0CisgKiAgICAgICAgICAgIG5hbWUgLSBUaGUgYXR0cmlidXRlIG5hbWUKKyAqIFJldHVybnM6ICAgQSBQeXRob24gb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlLCBvciBOVUxMIGlmIHNvbWV0aGluZyB3ZW50CisgKiAgICAgICAgICAgIHdyb25nCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqCitzc2xfQ29ubmVjdGlvbl9nZXRhdHRyKHNzbF9Db25uZWN0aW9uT2JqICpzZWxmLCBjaGFyICpuYW1lKQoreworICAgIFB5T2JqZWN0ICptZXRoOworICAgIAorICAgIG1ldGggPSBQeV9GaW5kTWV0aG9kKHNzbF9Db25uZWN0aW9uX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworCisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkgJiYgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAvKiBUcnkgbG9va2luZyBpdCB1cCBpbiB0aGUgInNvY2tldCIgaW5zdGVhZC4gKi8KKyAgICAgICAgbWV0aCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc2VsZi0+c29ja2V0LCBuYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWV0aDsKK30KKworLyoKKyAqIENhbGwgdGhlIHZpc2l0cHJvYyBvbiBhbGwgY29udGFpbmVkIG9iamVjdHMuCisgKgorICogQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbm5lY3Rpb24gb2JqZWN0CisgKiAgICAgICAgICAgIHZpc2l0IC0gRnVuY3Rpb24gdG8gY2FsbAorICogICAgICAgICAgICBhcmcgLSBFeHRyYSBhcmd1bWVudCB0byB2aXNpdAorICogUmV0dXJuczogICAwIGlmIGFsbCBnb2VzIHdlbGwsIG90aGVyd2lzZSB0aGUgcmV0dXJuIGNvZGUgZnJvbSB0aGUgZmlyc3QKKyAqICAgICAgICAgICAgY2FsbCB0aGF0IGdhdmUgbm9uLXplcm8gcmVzdWx0LgorICovCitzdGF0aWMgaW50Citzc2xfQ29ubmVjdGlvbl90cmF2ZXJzZShzc2xfQ29ubmVjdGlvbk9iaiAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCit7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAocmV0ID09IDAgJiYgc2VsZi0+Y29udGV4dCAhPSBOVUxMKQorICAgICAgICByZXQgPSB2aXNpdCgoUHlPYmplY3QgKilzZWxmLT5jb250ZXh0LCBhcmcpOworICAgIGlmIChyZXQgPT0gMCAmJiBzZWxmLT5zb2NrZXQgIT0gTlVMTCkKKyAgICAgICAgcmV0ID0gdmlzaXQoc2VsZi0+c29ja2V0LCBhcmcpOworICAgIGlmIChyZXQgPT0gMCAmJiBzZWxmLT5hcHBfZGF0YSAhPSBOVUxMKQorICAgICAgICByZXQgPSB2aXNpdChzZWxmLT5hcHBfZGF0YSwgYXJnKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICogRGVjcmVmIGFsbCBjb250YWluZWQgb2JqZWN0cyBhbmQgemVybyB0aGUgcG9pbnRlcnMuCisgKgorICogQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbm5lY3Rpb24gb2JqZWN0CisgKiBSZXR1cm5zOiAgIEFsd2F5cyAwLgorICovCitzdGF0aWMgaW50Citzc2xfQ29ubmVjdGlvbl9jbGVhcihzc2xfQ29ubmVjdGlvbk9iaiAqc2VsZikKK3sKKyAgICBQeV9YREVDUkVGKHNlbGYtPmNvbnRleHQpOworICAgIHNlbGYtPmNvbnRleHQgPSBOVUxMOworICAgIFB5X1hERUNSRUYoc2VsZi0+c29ja2V0KTsKKyAgICBzZWxmLT5zb2NrZXQgPSBOVUxMOworICAgIFB5X1hERUNSRUYoc2VsZi0+YXBwX2RhdGEpOworICAgIHNlbGYtPmFwcF9kYXRhID0gTlVMTDsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIERlYWxsb2NhdGUgdGhlIG1lbW9yeSB1c2VkIGJ5IHRoZSBDb25uZWN0aW9uIG9iamVjdAorICoKKyAqIEFyZ3VtZW50czogc2VsZiAtIFRoZSBDb25uZWN0aW9uIG9iamVjdAorICogUmV0dXJuczogICBOb25lCisgKi8KK3N0YXRpYyB2b2lkCitzc2xfQ29ubmVjdGlvbl9kZWFsbG9jKHNzbF9Db25uZWN0aW9uT2JqICpzZWxmKQoreworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7CisgICAgaWYgKHNlbGYtPnNzbCAhPSBOVUxMKQorICAgICAgICBTU0xfZnJlZShzZWxmLT5zc2wpOworICAgIHNzbF9Db25uZWN0aW9uX2NsZWFyKHNlbGYpOworICAgIFB5T2JqZWN0X0dDX0RlbChzZWxmKTsKK30KKworUHlUeXBlT2JqZWN0IHNzbF9Db25uZWN0aW9uX1R5cGUgPSB7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwKKyAgICAiQ29ubmVjdGlvbiIsCisgICAgc2l6ZW9mKHNzbF9Db25uZWN0aW9uT2JqKSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKXNzbF9Db25uZWN0aW9uX2RlYWxsb2MsCisgICAgTlVMTCwgLyogcHJpbnQgKi8KKyAgICAoZ2V0YXR0cmZ1bmMpc3NsX0Nvbm5lY3Rpb25fZ2V0YXR0ciwKKyAgICBOVUxMLCAvKiBzZXRhdHRyICovCisgICAgTlVMTCwgLyogY29tcGFyZSAqLworICAgIE5VTEwsIC8qIHJlcHIgKi8KKyAgICBOVUxMLCAvKiBhc19udW1iZXIgKi8KKyAgICBOVUxMLCAvKiBhc19zZXF1ZW5jZSAqLworICAgIE5VTEwsIC8qIGFzX21hcHBpbmcgKi8KKyAgICBOVUxMLCAvKiBoYXNoICovCisgICAgTlVMTCwgLyogY2FsbCAqLworICAgIE5VTEwsIC8qIHN0ciAqLworICAgIE5VTEwsIC8qIGdldGF0dHJvICovCisgICAgTlVMTCwgLyogc2V0YXR0cm8gKi8KKyAgICBOVUxMLCAvKiBhc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCisgICAgTlVMTCwgLyogZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylzc2xfQ29ubmVjdGlvbl90cmF2ZXJzZSwKKyAgICAoaW5xdWlyeSlzc2xfQ29ubmVjdGlvbl9jbGVhciwKK307CisKKworLyoKKyAqIEluaXRpYWlsemUgdGhlIENvbm5lY3Rpb24gcGFydCBvZiB0aGUgU1NMIHN1YiBtb2R1bGUKKyAqCisgKiBBcmd1bWVudHM6IGRpY3QgLSBEaWN0aW9uYXJ5IG9mIHRoZSBPcGVuU1NMLlNTTCBtb2R1bGUKKyAqIFJldHVybnM6ICAgMSBmb3Igc3VjY2VzcywgMCBvdGhlcndpc2UKKyAqLworaW50Citpbml0X3NzbF9jb25uZWN0aW9uKFB5T2JqZWN0ICpkaWN0KQoreworICAgIHNzbF9Db25uZWN0aW9uX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBQeV9JTkNSRUYoJnNzbF9Db25uZWN0aW9uX1R5cGUpOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiQ29ubmVjdGlvblR5cGUiLCAoUHlPYmplY3QgKikmc3NsX0Nvbm5lY3Rpb25fVHlwZSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL3NzbC9jb25uZWN0aW9uLmggYi9zcmMvc3NsL2Nvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWRiNzNlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NzbC9jb25uZWN0aW9uLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIGNvbm5lY3Rpb24uaAorICoKKyAqIENvcHlyaWdodCAoQykgQUIgU3RyYWt0IDIwMDEsIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKiBFeHBvcnQgU1NMIENvbm5lY3Rpb24gZGF0YSBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMuCisgKiBTZWUgdGhlIGZpbGUgUkFUSU9OQUxFIGZvciBhIHNob3J0IGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIG1vZHVsZSB3YXMgd3JpdHRlbi4KKyAqCisgKiBSZXZpZXdlZCAyMDAxLTA3LTIzCisgKgorICogQCgjKSAkSWQ6IGNvbm5lY3Rpb24uaCx2IDEuMTEgMjAwMi8wOS8wNCAyMjoyNDo1OSBpa28gRXhwICQKKyAqLworI2lmbmRlZiBQeU9wZW5TU0xfU1NMX0NPTk5FQ1RJT05fSF8KKyNkZWZpbmUgUHlPcGVuU1NMX1NTTF9DT05ORUNUSU9OX0hfCisKKyNpbmNsdWRlIDxQeXRob24uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorCisvKiBzaGFtZWxlc3NseSBzdG9sZW4gZnJvbSBzb2NrZXRtb2R1bGUuYyAqLworI2lmZGVmIE1TX1dJTkRPV1MKKyMgIGluY2x1ZGUgPHdpbnNvY2suaD4KK3R5cGVkZWYgU09DS0VUIFNPQ0tFVF9UOworIyAgaWZkZWYgTVNfV0lONjQKKyMgICAgZGVmaW5lIFNJWkVPRl9TT0NLRVRfVCA4CisjICBlbHNlCisjICAgIGRlZmluZSBTSVpFT0ZfU09DS0VUX1QgNAorIyAgZW5kaWYKKyNlbHNlCit0eXBlZGVmIGludCBTT0NLRVRfVDsKKyMgIGRlZmluZSBTSVpFT0ZfU09DS0VUX1QgU0laRU9GX0lOVAorI2VuZGlmCisKKworZXh0ZXJuICBpbnQgICAgICAgICAgICAgICAgICAgICAgaW5pdF9zc2xfY29ubmVjdGlvbiAgICAgIChQeU9iamVjdCAqKTsKKworZXh0ZXJuICBQeVR5cGVPYmplY3QgICAgICBzc2xfQ29ubmVjdGlvbl9UeXBlOworCisjZGVmaW5lIHNzbF9Db25uZWN0aW9uX0NoZWNrKHYpICgodiktPm9iX3R5cGUgPT0gJnNzbF9Db25uZWN0aW9uX1R5cGUpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgU1NMICAgICAgICAgICAgICAgICAqc3NsOworICAgIHNzbF9Db250ZXh0T2JqICAgICAgKmNvbnRleHQ7CisgICAgUHlPYmplY3QgICAgICAgICAgICAqc29ja2V0OworICAgIFB5VGhyZWFkU3RhdGUgICAgICAgKnRzdGF0ZTsKKyAgICBQeU9iamVjdCAgICAgICAgICAgICphcHBfZGF0YTsKK30gc3NsX0Nvbm5lY3Rpb25PYmo7CisKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3JjL3NzbC9jb250ZXh0LmMgYi9zcmMvc3NsL2NvbnRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2YxYzgzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NzbC9jb250ZXh0LmMKQEAgLTAsMCArMSwxMDc0IEBACisvKgorICogY29udGV4dC5jCisgKgorICogQ29weXJpZ2h0IChDKSBBQiBTdHJha3QgMjAwMSwgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIFNTTCBDb250ZXh0IG9iamVjdHMgYW5kIHRoZWlyIG1ldGhvZHMuCisgKiBTZWUgdGhlIGZpbGUgUkFUSU9OQUxFIGZvciBhIHNob3J0IGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIG1vZHVsZSB3YXMgd3JpdHRlbi4KKyAqCisgKiBSZXZpZXdlZCAyMDAxLTA3LTIzCisgKi8KKyNpbmNsdWRlIDxQeXRob24uaD4KKyNkZWZpbmUgU1NMX01PRFVMRQorI2luY2x1ZGUgInNzbC5oIgorCitzdGF0aWMgY2hhciAqQ1ZTaWQgPSAiQCgjKSAkSWQ6IGNvbnRleHQuYyx2IDEuMTcgMjAwNC8wOC8wNiAxMDoyMTo1NiBtYXJ0aW4gRXhwICQiOworCisvKgorICogQ0FMTEJBQ0tTCisgKgorICogQ2FsbGJhY2tzIHdvcmsgbGlrZSB0aGlzOiBXZSBwcm92aWRlIGEgImdsb2JhbCIgY2FsbGJhY2sgaW4gQyB3aGljaAorICogdHJhbnNmb3JtcyB0aGUgYXJndW1lbnRzIGludG8gYSBQeXRob24gYXJndW1lbnQgdHVwbGUgYW5kIGNhbGxzIHRoZQorICogY29ycmVzcG9uZGluZyBQeXRob24gY2FsbGJhY2ssIGFuZCB0aGVuIHBhcnNpbmcgdGhlIHJldHVybiB2YWx1ZSBiYWNrIGludG8KKyAqIHRoaW5ncyB0aGUgQyBmdW5jdGlvbiBjYW4gcmV0dXJuLgorICoKKyAqIFRocmVlIGNhdmVhdHM6CisgKiAgKyBIb3cgZG8gd2UgZmluZCB0aGUgQ29udGV4dCBvYmplY3Qgd2hlcmUgdGhlIFB5dGhvbiBjYWxsYmFja3MgYXJlIHN0b3JlZD8KKyAqICArIFdoYXQgYWJvdXQgbXVsdGl0aHJlYWRpbmcgYW5kIGV4ZWN1dGlvbiBmcmFtZXM/CisgKiAgKyBXaGF0IGFib3V0IFB5dGhvbiBjYWxsYmFja3MgdGhhdCByYWlzZSBleGNlcHRpb25zPworICoKKyAqIFRoZSBzb2x1dGlvbiB0byB0aGUgZmlyc3QgaXNzdWUgaXMgdHJpdmlhbCBpZiB0aGUgY2FsbGJhY2sgcHJvdmlkZXMKKyAqICJ1c2VyZGF0YSIgZnVuY3Rpb25hbGl0eS4gU2luY2UgdGhlIG9ubHkgY2FsbGJhY2tzIHRoYXQgZG9uJ3QgcHJvdmlkZQorICogdXNlcmRhdGEgZG8gcHJvdmlkZSBhIHBvaW50ZXIgdG8gYW4gU1NMIHN0cnVjdHVyZSwgd2UgY2FuIGFzc29jaWF0ZSBhbiBTU0wKKyAqIG9iamVjdCBhbmQgYSBDb25uZWN0aW9uIG9uZS10by1vbmUgdmlhIHRoZSBTU0xfc2V0L2dldF9hcHBfZGF0YSgpCisgKiBmdW5jdGlvbnMuCisgKgorICogVGhlIHNvbHV0aW9uIHRvIHRoZSBvdGhlciBpc3N1ZSBpcyB0byByZXdyaXRlIHRoZSBQeV9CRUdJTl9BTExPV19USFJFQURTCisgKiBtYWNybyBhbGxvd2luZyBpdCAob3IgcmF0aGVyIGEgbmV3IG1hY3JvKSB0byBzcGVjaWZ5IHdoZXJlIHRvIHNhdmUgdGhlCisgKiB0aHJlYWQgc3RhdGUgKGluIG91ciBjYXNlLCBhcyBhIG1lbWJlciBvZiB0aGUgQ29ubmVjdGlvbi9Db250ZXh0IG9iamVjdCkgc28KKyAqIHdlIGNhbiByZXRyaWV2ZSBpdCBhZ2FpbiBiZWZvcmUgY2FsbGluZyB0aGUgUHl0aG9uIGNhbGxiYWNrLgorICovCisKKy8qCisgKiBHbG9iYWxseSBkZWZpbmVkIHBhc3NwaHJhc2UgY2FsbGJhY2suCisgKgorICogQXJndW1lbnRzOiBidWYgICAgLSBCdWZmZXIgdG8gc3RvcmUgdGhlIHJldHVybmVkIHBhc3NwaHJhc2UgaW4KKyAqICAgICAgICAgICAgbWF4bGVuIC0gTWF4aW11bSBsZW5ndGggb2YgdGhlIHBhc3NwaHJhc2UKKyAqICAgICAgICAgICAgdmVyaWZ5IC0gSWYgdHJ1ZSwgdGhlIHBhc3NwaHJhc2UgY2FsbGJhY2sgc2hvdWxkIGFzayBmb3IgYQorICogICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCB0d2ljZSBhbmQgdmVyaWZ5IHRoZXkncmUgZXF1YWwuIElmIGZhbHNlLCBvbmx5CisgKiAgICAgICAgICAgICAgICAgICAgIGFzayBvbmNlLgorICogICAgICAgICAgICBhcmcgICAgLSBVc2VyIGRhdGEsIGFsd2F5cyBhIENvbnRleHQgb2JqZWN0CisgKiBSZXR1cm5zOiAgIFRoZSBsZW5ndGggb2YgdGhlIHBhc3N3b3JkIGlmIHN1Y2Nlc3NmdWwsIDAgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQKK2dsb2JhbF9wYXNzcGhyYXNlX2NhbGxiYWNrKGNoYXIgKmJ1ZiwgaW50IG1heGxlbiwgaW50IHZlcmlmeSwgdm9pZCAqYXJnKQoreworICAgIGludCBsZW47CisgICAgY2hhciAqc3RyOworICAgIFB5T2JqZWN0ICphcmd2LCAqcmV0ID0gTlVMTDsKKyAgICBzc2xfQ29udGV4dE9iaiAqY3R4ID0gKHNzbF9Db250ZXh0T2JqICopYXJnOworCisgICAgLyogVGhlIFB5dGhvbiBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aCBhIChtYXhsZW4sdmVyaWZ5LHVzZXJkYXRhKSB0dXBsZSAqLworICAgIGFyZ3YgPSBQeV9CdWlsZFZhbHVlKCIoaWlPKSIsIG1heGxlbiwgdmVyaWZ5LCBjdHgtPnBhc3NwaHJhc2VfdXNlcmRhdGEpOworICAgIGlmIChjdHgtPnRzdGF0ZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLyogV2UgbmVlZCB0byBnZXQgYmFjayBvdXIgdGhyZWFkIHN0YXRlIGJlZm9yZSBjYWxsaW5nIHRoZSBjYWxsYmFjayAqLworICAgICAgICBNWV9FTkRfQUxMT1dfVEhSRUFEUyhjdHgtPnRzdGF0ZSk7CisgICAgICAgIHJldCA9IFB5RXZhbF9DYWxsT2JqZWN0KGN0eC0+cGFzc3BocmFzZV9jYWxsYmFjaywgYXJndik7CisgICAgICAgIE1ZX0JFR0lOX0FMTE9XX1RIUkVBRFMoY3R4LT50c3RhdGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXQgPSBQeUV2YWxfQ2FsbE9iamVjdChjdHgtPnBhc3NwaHJhc2VfY2FsbGJhY2ssIGFyZ3YpOworICAgIH0KKyAgICBQeV9ERUNSRUYoYXJndik7CisKKyAgICBpZiAocmV0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFQeU9iamVjdF9Jc1RydWUocmV0KSkKKyAgICB7CisgICAgICAgIFB5X0RFQ1JFRihyZXQpOworCXJldHVybiAwOworICAgIH0KKworICAgIGlmICghUHlTdHJpbmdfQ2hlY2socmV0KSkKKyAgICB7CisgICAgICAgIFB5X0RFQ1JFRihyZXQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBsZW4gPSBQeVN0cmluZ19TaXplKHJldCk7CisgICAgaWYgKGxlbiA+IG1heGxlbikKKyAgICAgICAgbGVuID0gbWF4bGVuOworCisgICAgc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcocmV0KTsKKyAgICBzdHJuY3B5KGJ1Ziwgc3RyLCBsZW4pOworICAgIFB5X1hERUNSRUYocmV0KTsKKworICAgIHJldHVybiBsZW47Cit9CisKKy8qCisgKiBHbG9iYWxseSBkZWZpbmVkIHZlcmlmeSBjYWxsYmFjaworICoKKyAqIEFyZ3VtZW50czogb2sgICAgICAgLSBUcnVlIGV2ZXJ5dGhpbmcgaXMgT0sgInNvIGZhciIsIGZhbHNlIG90aGVyd2lzZQorICogICAgICAgICAgICB4NTA5X2N0eCAtIENvbnRhaW5zIHRoZSBjZXJ0aWZpY2F0ZSBiZWluZyBjaGVja2VkLCB0aGUgY3VycmVudAorICogICAgICAgICAgICAgICAgICAgICAgIGVycm9yIG51bWJlciBhbmQgZGVwdGgsIGFuZCB0aGUgQ29ubmVjdGlvbiB3ZSdyZQorICogICAgICAgICAgICAgICAgICAgICAgIGRlYWxpbmcgd2l0aAorICogUmV0dXJuczogICBUcnVlIGlmIGV2ZXJ5dGhpbmcgaXMgb2theSwgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQKK2dsb2JhbF92ZXJpZnlfY2FsbGJhY2soaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqeDUwOV9jdHgpCit7CisgICAgUHlPYmplY3QgKmFyZ3YsICpyZXQ7CisgICAgU1NMICpzc2w7CisgICAgc3NsX0Nvbm5lY3Rpb25PYmogKmNvbm47CisgICAgY3J5cHRvX1g1MDlPYmogKmNlcnQ7CisgICAgaW50IGVycm51bSwgZXJyZGVwdGgsIGNfcmV0OworCisgICAgY2VydCA9IGNyeXB0b19YNTA5X05ldyhYNTA5X1NUT1JFX0NUWF9nZXRfY3VycmVudF9jZXJ0KHg1MDlfY3R4KSwgMCk7CisgICAgZXJybnVtID0gWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yKHg1MDlfY3R4KTsKKyAgICBlcnJkZXB0aCA9IFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcl9kZXB0aCh4NTA5X2N0eCk7CisgICAgc3NsID0gKFNTTCAqKVg1MDlfU1RPUkVfQ1RYX2dldF9hcHBfZGF0YSh4NTA5X2N0eCk7CisgICAgY29ubiA9IChzc2xfQ29ubmVjdGlvbk9iaiAqKVNTTF9nZXRfYXBwX2RhdGEoc3NsKTsKKworICAgIGFyZ3YgPSBQeV9CdWlsZFZhbHVlKCIoT09paWkpIiwgKFB5T2JqZWN0ICopY29ubiwgKFB5T2JqZWN0ICopY2VydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm51bSwgZXJyZGVwdGgsIG9rKTsKKyAgICBQeV9ERUNSRUYoY2VydCk7CisgICAgaWYgKGNvbm4tPnRzdGF0ZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLyogV2UgbmVlZCB0byBnZXQgYmFjayBvdXIgdGhyZWFkIHN0YXRlIGJlZm9yZSBjYWxsaW5nIHRoZSBjYWxsYmFjayAqLworICAgICAgICBNWV9FTkRfQUxMT1dfVEhSRUFEUyhjb25uLT50c3RhdGUpOworICAgICAgICByZXQgPSBQeUV2YWxfQ2FsbE9iamVjdChjb25uLT5jb250ZXh0LT52ZXJpZnlfY2FsbGJhY2ssIGFyZ3YpOworICAgICAgICBNWV9CRUdJTl9BTExPV19USFJFQURTKGNvbm4tPnRzdGF0ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldCA9IFB5RXZhbF9DYWxsT2JqZWN0KGNvbm4tPmNvbnRleHQtPnZlcmlmeV9jYWxsYmFjaywgYXJndik7CisgICAgfQorICAgIFB5X0RFQ1JFRihhcmd2KTsKKworICAgIGlmIChyZXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoUHlPYmplY3RfSXNUcnVlKHJldCkpCisgICAgeworICAgICAgICBYNTA5X1NUT1JFX0NUWF9zZXRfZXJyb3IoeDUwOV9jdHgsIFg1MDlfVl9PSyk7CisgICAgICAgIGNfcmV0ID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBjX3JldCA9IDA7CisKKyAgICBQeV9ERUNSRUYocmV0KTsKKworICAgIHJldHVybiBjX3JldDsKK30KKworLyoKKyAqIEdsb2JhbGx5IGRlZmluZWQgaW5mbyBjYWxsYmFjaworICoKKyAqIEFyZ3VtZW50czogc3NsICAgLSBUaGUgQ29ubmVjdGlvbgorICogICAgICAgICAgICB3aGVyZSAtIFRoZSBwYXJ0IG9mIHRoZSBTU0wgY29kZSB0aGF0IGNhbGxlZCB1cworICogICAgICAgICAgICBfcmV0ICAtIFRoZSByZXR1cm4gY29kZSBvZiB0aGUgU1NMIGZ1bmN0aW9uIHRoYXQgY2FsbGVkIHVzCisgKiBSZXR1cm5zOiAgIE5vbmUKKyAqLworc3RhdGljIHZvaWQKK2dsb2JhbF9pbmZvX2NhbGxiYWNrKFNTTCAqc3NsLCBpbnQgd2hlcmUsIGludCBfcmV0KQoreworICAgIHNzbF9Db25uZWN0aW9uT2JqICpjb25uID0gKHNzbF9Db25uZWN0aW9uT2JqICopU1NMX2dldF9hcHBfZGF0YShzc2wpOworICAgIFB5T2JqZWN0ICphcmd2LCAqcmV0OworCisgICAgYXJndiA9IFB5X0J1aWxkVmFsdWUoIihPaWkpIiwgKFB5T2JqZWN0ICopY29ubiwgd2hlcmUsIF9yZXQpOworICAgIGlmIChjb25uLT50c3RhdGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIFdlIG5lZWQgdG8gZ2V0IGJhY2sgb3VyIHRocmVhZCBzdGF0ZSBiZWZvcmUgY2FsbGluZyB0aGUgY2FsbGJhY2sgKi8KKyAgICAgICAgTVlfRU5EX0FMTE9XX1RIUkVBRFMoY29ubi0+dHN0YXRlKTsKKyAgICAgICAgcmV0ID0gUHlFdmFsX0NhbGxPYmplY3QoY29ubi0+Y29udGV4dC0+aW5mb19jYWxsYmFjaywgYXJndik7CisgICAgICAgIGlmIChyZXQgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXQpOworICAgICAgICBNWV9CRUdJTl9BTExPV19USFJFQURTKGNvbm4tPnRzdGF0ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldCA9IFB5RXZhbF9DYWxsT2JqZWN0KGNvbm4tPmNvbnRleHQtPmluZm9fY2FsbGJhY2ssIGFyZ3YpOworICAgICAgICBpZiAocmV0ID09IE5VTEwpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeV9ERUNSRUYocmV0KTsKKyAgICB9CisgICAgUHlfREVDUkVGKGFyZ3YpOworCisgICAgcmV0dXJuOworfQorCisKKworCitzdGF0aWMgY2hhciBzc2xfQ29udGV4dF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnNfZG9jW10gPSAiXG5cCitMZXQgU1NMIGtub3cgd2hlcmUgd2UgY2FuIGZpbmQgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgZm9yIHRoZSBjZXJ0aWZpY2F0ZVxuXAorY2hhaW5cblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbnRleHQgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAgY2FmaWxlIC0gV2hpY2ggZmlsZSB3ZSBjYW4gZmluZCB0aGUgY2VydGlmaWNhdGVzXG5cCitSZXR1cm5zOiAgIE5vbmVcblwKKyI7CitzdGF0aWMgUHlPYmplY3QgKgorc3NsX0NvbnRleHRfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNzbF9Db250ZXh0T2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjaGFyICpjYWZpbGU7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6bG9hZF92ZXJpZnlfbG9jYXRpb25zIiwgJmNhZmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKCFTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzZWxmLT5jdHgsIGNhZmlsZSwgTlVMTCkpCisgICAgeworICAgICAgICBleGNlcHRpb25fZnJvbV9lcnJvcl9xdWV1ZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyIHNzbF9Db250ZXh0X3NldF9wYXNzd2RfY2JfZG9jW10gPSAiXG5cCitTZXQgdGhlIHBhc3NwaHJhc2UgY2FsbGJhY2tcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbnRleHQgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAgY2FsbGJhY2sgLSBUaGUgUHl0aG9uIGNhbGxiYWNrIHRvIHVzZVxuXAorICAgICAgICAgICAgIHVzZXJkYXRhIC0gKG9wdGlvbmFsKSBBIFB5dGhvbiBvYmplY3Qgd2hpY2ggd2lsbCBiZSBnaXZlbiBhc1xuXAorICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQgdG8gdGhlIGNhbGxiYWNrXG5cCitSZXR1cm5zOiAgIE5vbmVcblwKKyI7CitzdGF0aWMgUHlPYmplY3QgKgorc3NsX0NvbnRleHRfc2V0X3Bhc3N3ZF9jYihzc2xfQ29udGV4dE9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgUHlPYmplY3QgKmNhbGxiYWNrID0gTlVMTCwgKnVzZXJkYXRhID0gUHlfTm9uZTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPOnNldF9wYXNzd2RfY2IiLCAmY2FsbGJhY2ssICZ1c2VyZGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGNhbGxiYWNrKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RlZCBQeUNhbGxhYmxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFB5X0RFQ1JFRihzZWxmLT5wYXNzcGhyYXNlX2NhbGxiYWNrKTsKKyAgICBQeV9JTkNSRUYoY2FsbGJhY2spOworICAgIHNlbGYtPnBhc3NwaHJhc2VfY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYihzZWxmLT5jdHgsIGdsb2JhbF9wYXNzcGhyYXNlX2NhbGxiYWNrKTsKKworICAgIFB5X0RFQ1JFRihzZWxmLT5wYXNzcGhyYXNlX3VzZXJkYXRhKTsKKyAgICBQeV9JTkNSRUYodXNlcmRhdGEpOworICAgIHNlbGYtPnBhc3NwaHJhc2VfdXNlcmRhdGEgPSB1c2VyZGF0YTsKKyAgICBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YShzZWxmLT5jdHgsICh2b2lkICopc2VsZik7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBjaGFyIHNzbF9Db250ZXh0X3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlX2RvY1tdID0gIlxuXAorTG9hZCBhIGNlcnRpZmljYXRlIGNoYWluIGZyb20gYSBmaWxlXG5cCitcblwKK0FyZ3VtZW50czogc2VsZiAtIFRoZSBDb250ZXh0IG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlOlxuXAorICAgICAgICAgICAgIGNlcnRmaWxlIC0gVGhlIG5hbWUgb2YgdGhlIGNlcnRpZmljYXRlIGNoYWluIGZpbGVcblwKK1JldHVybnM6ICAgTm9uZVxuXAorIjsKK3N0YXRpYyBQeU9iamVjdCAqCitzc2xfQ29udGV4dF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShzc2xfQ29udGV4dE9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY2hhciAqY2VydGZpbGU7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6dXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUiLCAmY2VydGZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShzZWxmLT5jdHgsIGNlcnRmaWxlKSkKKyAgICB7CisgICAgICAgIGV4Y2VwdGlvbl9mcm9tX2Vycm9yX3F1ZXVlKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KK30KKworCitzdGF0aWMgY2hhciBzc2xfQ29udGV4dF91c2VfY2VydGlmaWNhdGVfZmlsZV9kb2NbXSA9ICJcblwKK0xvYWQgYSBjZXJ0aWZpY2F0ZSBmcm9tIGEgZmlsZVxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgQ29udGV4dCBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZTpcblwKKyAgICAgICAgICAgICBjZXJ0ZmlsZSAtIFRoZSBuYW1lIG9mIHRoZSBjZXJ0aWZpY2F0ZSBmaWxlXG5cCisgICAgICAgICAgICAgZmlsZXR5cGUgLSAob3B0aW9uYWwpIFRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZSwgZGVmYXVsdCBpcyBQRU1cblwKK1JldHVybnM6ICAgTm9uZVxuXAorIjsKK3N0YXRpYyBQeU9iamVjdCAqCitzc2xfQ29udGV4dF91c2VfY2VydGlmaWNhdGVfZmlsZShzc2xfQ29udGV4dE9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY2hhciAqY2VydGZpbGU7CisgICAgaW50IGZpbGV0eXBlID0gU1NMX0ZJTEVUWVBFX1BFTTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xpOnVzZV9jZXJ0aWZpY2F0ZV9maWxlIiwgJmNlcnRmaWxlLCAmZmlsZXR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfZmlsZShzZWxmLT5jdHgsIGNlcnRmaWxlLCBmaWxldHlwZSkpCisgICAgeworICAgICAgICBleGNlcHRpb25fZnJvbV9lcnJvcl9xdWV1ZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyIHNzbF9Db250ZXh0X3VzZV9jZXJ0aWZpY2F0ZV9kb2NbXSA9ICJcblwKK0xvYWQgYSBjZXJ0aWZpY2F0ZSBmcm9tIGEgWDUwOSBvYmplY3RcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbnRleHQgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAgY2VydCAtIFRoZSBYNTA5IG9iamVjdFxuXAorUmV0dXJuczogICBOb25lXG5cCisiOworc3RhdGljIFB5T2JqZWN0ICoKK3NzbF9Db250ZXh0X3VzZV9jZXJ0aWZpY2F0ZShzc2xfQ29udGV4dE9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgc3RhdGljIFB5VHlwZU9iamVjdCAqY3J5cHRvX1g1MDlfdHlwZSA9IE5VTEw7CisgICAgY3J5cHRvX1g1MDlPYmogKmNlcnQ7CisKKyAgICAvKiBXZSBuZWVkIHRvIGNoZWNrIHRoYXQgY2VydCByZWFsbHkgaXMgYW4gWDUwOSBvYmplY3QgYmVmb3JlCisgICAgICAgd2UgZGVhbCB3aXRoIGl0LiBUaGUgcHJvYmxlbSBpcyB3ZSBjYW4ndCBqdXN0IHF1aWNrbHkgdmVyaWZ5CisgICAgICAgdGhlIHR5cGUgKHNpbmNlIHRoYXQgY29tZXMgZnJvbSBhbm90aGVyIG1vZHVsZSkuIFRoaXMgc2hvdWxkCisgICAgICAgZG8gdGhlIHRyaWNrIChyZWFzb25hYmx5IHdlbGwgYXQgbGVhc3QpOiBPbmNlIHdlIGhhdmUgb25lCisgICAgICAgdmVyaWZpZWQgb2JqZWN0LCB3ZSB1c2UgaXQncyB0eXBlIG9iamVjdCBmb3IgZnV0dXJlCisgICAgICAgY29tcGFyaXNvbnMuICovCisKKyAgICBpZiAoIWNyeXB0b19YNTA5X3R5cGUpCisgICAgeworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzp1c2VfY2VydGlmaWNhdGUiLCAmY2VydCkpCisJICAgIHJldHVybiBOVUxMOworCisJaWYgKHN0cmNtcChjZXJ0LT5vYl90eXBlLT50cF9uYW1lLCAiWDUwOSIpICE9IDAgfHwgCisJICAgIGNlcnQtPm9iX3R5cGUtPnRwX2Jhc2ljc2l6ZSAhPSBzaXplb2YoY3J5cHRvX1g1MDlPYmopKQorCXsKKwkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV4cGVjdGVkIGFuIFg1MDkgb2JqZWN0Iik7CisJICAgIHJldHVybiBOVUxMOworCX0KKworCWNyeXB0b19YNTA5X3R5cGUgPSBjZXJ0LT5vYl90eXBlOworICAgIH0KKyAgICBlbHNlCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITp1c2VfY2VydGlmaWNhdGUiLCBjcnlwdG9fWDUwOV90eXBlLAorCQkJICAgICAgJmNlcnQpKQorCSAgICByZXR1cm4gTlVMTDsKKyAgICAKKyAgICBpZiAoIVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlKHNlbGYtPmN0eCwgY2VydC0+eDUwOSkpCisgICAgeworICAgICAgICBleGNlcHRpb25fZnJvbV9lcnJvcl9xdWV1ZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyIHNzbF9Db250ZXh0X3VzZV9wcml2YXRla2V5X2ZpbGVfZG9jW10gPSAiXG5cCitMb2FkIGEgcHJpdmF0ZSBrZXkgZnJvbSBhIGZpbGVcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbnRleHQgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAga2V5ZmlsZSAgLSBUaGUgbmFtZSBvZiB0aGUga2V5IGZpbGVcblwKKyAgICAgICAgICAgICBmaWxldHlwZSAtIChvcHRpb25hbCkgVGhlIGVuY29kaW5nIG9mIHRoZSBmaWxlLCBkZWZhdWx0IGlzIFBFTVxuXAorUmV0dXJuczogICBOb25lXG5cCisiOworc3RhdGljIFB5T2JqZWN0ICoKK3NzbF9Db250ZXh0X3VzZV9wcml2YXRla2V5X2ZpbGUoc3NsX0NvbnRleHRPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGNoYXIgKmtleWZpbGU7CisgICAgaW50IGZpbGV0eXBlID0gU1NMX0ZJTEVUWVBFX1BFTSwgcmV0OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfGk6dXNlX3ByaXZhdGVrZXlfZmlsZSIsICZrZXlmaWxlLCAmZmlsZXR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIE1ZX0JFR0lOX0FMTE9XX1RIUkVBRFMoc2VsZi0+dHN0YXRlKTsKKyAgICByZXQgPSBTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoc2VsZi0+Y3R4LCBrZXlmaWxlLCBmaWxldHlwZSk7CisgICAgTVlfRU5EX0FMTE9XX1RIUkVBRFMoc2VsZi0+dHN0YXRlKTsKKworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgIHsKKyAgICAgICAgZmx1c2hfZXJyb3JfcXVldWUoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKCFyZXQpCisgICAgeworICAgICAgICBleGNlcHRpb25fZnJvbV9lcnJvcl9xdWV1ZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyIHNzbF9Db250ZXh0X3VzZV9wcml2YXRla2V5X2RvY1tdID0gIlxuXAorTG9hZCBhIHByaXZhdGUga2V5IGZyb20gYSBQS2V5IG9iamVjdFxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgQ29udGV4dCBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZTpcblwKKyAgICAgICAgICAgICBwa2V5IC0gVGhlIFBLZXkgb2JqZWN0XG5cCitSZXR1cm5zOiAgIE5vbmVcblwKKyI7CitzdGF0aWMgUHlPYmplY3QgKgorc3NsX0NvbnRleHRfdXNlX3ByaXZhdGVrZXkoc3NsX0NvbnRleHRPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIHN0YXRpYyBQeVR5cGVPYmplY3QgKmNyeXB0b19QS2V5X3R5cGUgPSBOVUxMOworICAgIGNyeXB0b19QS2V5T2JqICpwa2V5OworCisgICAgLyogV2UgbmVlZCB0byBjaGVjayB0aGF0IGNlcnQgcmVhbGx5IGlzIGEgUEtleSBvYmplY3QgYmVmb3JlCisgICAgICAgd2UgZGVhbCB3aXRoIGl0LiBUaGUgcHJvYmxlbSBpcyB3ZSBjYW4ndCBqdXN0IHF1aWNrbHkgdmVyaWZ5CisgICAgICAgdGhlIHR5cGUgKHNpbmNlIHRoYXQgY29tZXMgZnJvbSBhbm90aGVyIG1vZHVsZSkuIFRoaXMgc2hvdWxkCisgICAgICAgZG8gdGhlIHRyaWNrIChyZWFzb25hYmx5IHdlbGwgYXQgbGVhc3QpOiBPbmNlIHdlIGhhdmUgb25lCisgICAgICAgdmVyaWZpZWQgb2JqZWN0LCB3ZSB1c2UgaXQncyB0eXBlIG9iamVjdCBmb3IgZnV0dXJlCisgICAgICAgY29tcGFyaXNvbnMuICovCisKKyAgICBpZiAoIWNyeXB0b19QS2V5X3R5cGUpCisgICAgeworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzp1c2VfcHJpdmF0ZWtleSIsICZwa2V5KSkKKwkgICAgcmV0dXJuIE5VTEw7CisKKwlpZiAoc3RyY21wKHBrZXktPm9iX3R5cGUtPnRwX25hbWUsICJQS2V5IikgIT0gMCB8fCAKKwkgICAgcGtleS0+b2JfdHlwZS0+dHBfYmFzaWNzaXplICE9IHNpemVvZihjcnlwdG9fUEtleU9iaikpCisJeworCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXhwZWN0ZWQgYSBQS2V5IG9iamVjdCIpOworCSAgICByZXR1cm4gTlVMTDsKKwl9CisKKwljcnlwdG9fUEtleV90eXBlID0gcGtleS0+b2JfdHlwZTsKKyAgICB9CisgICAgZWxzZQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6dXNlX3ByaXZhdGVrZXkiLCBjcnlwdG9fUEtleV90eXBlLCAmcGtleSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKCFTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5KHNlbGYtPmN0eCwgcGtleS0+cGtleSkpCisgICAgeworICAgICAgICBleGNlcHRpb25fZnJvbV9lcnJvcl9xdWV1ZSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyIHNzbF9Db250ZXh0X2NoZWNrX3ByaXZhdGVrZXlfZG9jW10gPSAiXG5cCitDaGVjayB0aGF0IHRoZSBwcml2YXRlIGtleSBhbmQgY2VydGlmaWNhdGUgbWF0Y2ggdXBcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbnRleHQgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmUgZW1wdHlcblwKK1JldHVybnM6ICAgTm9uZSAocmFpc2VzIGFuIGV4Y2VwdGlvbiBpZiBzb21ldGhpbmcncyB3cm9uZylcblwKKyI7CitzdGF0aWMgUHlPYmplY3QgKgorc3NsX0NvbnRleHRfY2hlY2tfcHJpdmF0ZWtleShzc2xfQ29udGV4dE9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Y2hlY2tfcHJpdmF0ZWtleSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghU1NMX0NUWF9jaGVja19wcml2YXRlX2tleShzZWxmLT5jdHgpKQorICAgIHsKKyAgICAgICAgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorfQorCitzdGF0aWMgY2hhciBzc2xfQ29udGV4dF9sb2FkX2NsaWVudF9jYV9kb2NbXSA9ICJcblwKK0xvYWQgdGhlIHRydXN0ZWQgY2VydGlmaWNhdGVzIHRoYXQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgKGJhc2ljYWxseVxuXAordGVsbGluZyB0aGUgY2xpZW50IFwiVGhlc2UgYXJlIHRoZSBndXlzIEkgdHJ1c3RcIilcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbnRleHQgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAgY2FmaWxlIC0gVGhlIG5hbWUgb2YgdGhlIGNlcnRpZmljYXRlcyBmaWxlXG5cCitSZXR1cm5zOiAgIE5vbmVcblwKKyI7CitzdGF0aWMgUHlPYmplY3QgKgorc3NsX0NvbnRleHRfbG9hZF9jbGllbnRfY2Eoc3NsX0NvbnRleHRPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGNoYXIgKmNhZmlsZTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpsb2FkX2NsaWVudF9jYSIsICZjYWZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIFNTTF9DVFhfc2V0X2NsaWVudF9DQV9saXN0KHNlbGYtPmN0eCwgU1NMX2xvYWRfY2xpZW50X0NBX2ZpbGUoY2FmaWxlKSk7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBjaGFyIHNzbF9Db250ZXh0X3NldF9zZXNzaW9uX2lkX2RvY1tdID0gIlxuXAorU2V0IHRoZSBzZXNzaW9uIGlkZW50aWZpZXIsIHRoaXMgaXMgbmVlZGVkIGlmIHlvdSB3YW50IHRvIGRvIHNlc3Npb25cblwKK3Jlc3VtcHRpb24gKHdoaWNoLCBpcm9uaWNhbGx5LCBpc24ndCBpbXBsZW1lbnRlZCB5ZXQpXG5cCitcblwKK0FyZ3VtZW50czogc2VsZiAtIFRoZSBDb250ZXh0IG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlOlxuXAorICAgICAgICAgICAgIGJ1ZiAtIEEgUHl0aG9uIG9iamVjdCB0aGF0IGNhbiBiZSBzYWZlbHkgY29udmVydGVkIHRvIGEgc3RyaW5nXG5cCitSZXR1cm5zOiAgIE5vbmVcblwKKyI7CitzdGF0aWMgUHlPYmplY3QgKgorc3NsX0NvbnRleHRfc2V0X3Nlc3Npb25faWQoc3NsX0NvbnRleHRPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgbGVuOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpzZXRfc2Vzc2lvbl9pZCIsICZidWYsICZsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KHNlbGYtPmN0eCwgYnVmLCBsZW4pKQorICAgIHsKKyAgICAgICAgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorfQorCitzdGF0aWMgY2hhciBzc2xfQ29udGV4dF9zZXRfdmVyaWZ5X2RvY1tdID0gIlxuXAorU2V0IHRoZSB2ZXJpZnkgbW9kZSBhbmQgdmVyaWZ5IGNhbGxiYWNrXG5cCitcblwKK0FyZ3VtZW50czogc2VsZiAtIFRoZSBDb250ZXh0IG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlOlxuXAorICAgICAgICAgICAgIG1vZGUgICAgIC0gVGhlIHZlcmlmeSBtb2RlLCB0aGlzIGlzIGVpdGhlciBTU0xfVkVSSUZZX05PTkUgb3JcblwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9WRVJJRllfUEVFUiBjb21iaW5lZCB3aXRoIHBvc3NpYmxlIG90aGVyIGZsYWdzXG5cCisgICAgICAgICAgICAgY2FsbGJhY2sgLSBUaGUgUHl0aG9uIGNhbGxiYWNrIHRvIHVzZVxuXAorUmV0dXJuczogICBOb25lXG5cCisiOworc3RhdGljIFB5T2JqZWN0ICoKK3NzbF9Db250ZXh0X3NldF92ZXJpZnkoc3NsX0NvbnRleHRPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGludCBtb2RlOworICAgIFB5T2JqZWN0ICpjYWxsYmFjayA9IE5VTEw7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPOnNldF92ZXJpZnkiLCAmbW9kZSwgJmNhbGxiYWNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soY2FsbGJhY2spKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGVkIFB5Q2FsbGFibGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlfREVDUkVGKHNlbGYtPnZlcmlmeV9jYWxsYmFjayk7CisgICAgUHlfSU5DUkVGKGNhbGxiYWNrKTsKKyAgICBzZWxmLT52ZXJpZnlfY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICBTU0xfQ1RYX3NldF92ZXJpZnkoc2VsZi0+Y3R4LCBtb2RlLCBnbG9iYWxfdmVyaWZ5X2NhbGxiYWNrKTsKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KKworc3RhdGljIGNoYXIgc3NsX0NvbnRleHRfc2V0X3ZlcmlmeV9kZXB0aF9kb2NbXSA9ICJcblwKK1NldCB0aGUgdmVyaWZ5IGRlcHRoXG5cCitcblwKK0FyZ3VtZW50czogc2VsZiAtIFRoZSBDb250ZXh0IG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlOlxuXAorICAgICAgICAgICAgIGRlcHRoIC0gQW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSB2ZXJpZnkgZGVwdGhcblwKK1JldHVybnM6ICAgTm9uZVxuXAorIjsKK3N0YXRpYyBQeU9iamVjdCAqCitzc2xfQ29udGV4dF9zZXRfdmVyaWZ5X2RlcHRoKHNzbF9Db250ZXh0T2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBpbnQgZGVwdGg7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0X3ZlcmlmeV9kZXB0aCIsICZkZXB0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgU1NMX0NUWF9zZXRfdmVyaWZ5X2RlcHRoKHNlbGYtPmN0eCwgZGVwdGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KKworc3RhdGljIGNoYXIgc3NsX0NvbnRleHRfZ2V0X3ZlcmlmeV9tb2RlX2RvY1tdID0gIlxuXAorR2V0IHRoZSB2ZXJpZnkgbW9kZVxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgQ29udGV4dCBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZSBlbXB0eVxuXAorUmV0dXJuczogICBUaGUgdmVyaWZ5IG1vZGVcblwKKyI7CitzdGF0aWMgUHlPYmplY3QgKgorc3NsX0NvbnRleHRfZ2V0X3ZlcmlmeV9tb2RlKHNzbF9Db250ZXh0T2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBpbnQgbW9kZTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldF92ZXJpZnlfbW9kZSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG1vZGUgPSBTU0xfQ1RYX2dldF92ZXJpZnlfbW9kZShzZWxmLT5jdHgpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlKTsKK30KKworc3RhdGljIGNoYXIgc3NsX0NvbnRleHRfZ2V0X3ZlcmlmeV9kZXB0aF9kb2NbXSA9ICJcblwKK0dldCB0aGUgdmVyaWZ5IGRlcHRoXG5cCitcblwKK0FyZ3VtZW50czogc2VsZiAtIFRoZSBDb250ZXh0IG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlIGVtcHR5XG5cCitSZXR1cm5zOiAgIFRoZSB2ZXJpZnkgZGVwdGhcblwKKyI7CitzdGF0aWMgUHlPYmplY3QgKgorc3NsX0NvbnRleHRfZ2V0X3ZlcmlmeV9kZXB0aChzc2xfQ29udGV4dE9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaW50IGRlcHRoOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0X3ZlcmlmeV9kZXB0aCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGRlcHRoID0gU1NMX0NUWF9nZXRfdmVyaWZ5X2RlcHRoKHNlbGYtPmN0eCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWRlcHRoKTsKK30KKworc3RhdGljIGNoYXIgc3NsX0NvbnRleHRfbG9hZF90bXBfZGhfZG9jW10gPSAiXG5cCitMb2FkIHBhcmFtZXRlcnMgZm9yIEVwaGVtZXJhbCBEaWZmaWUtSGVsbG1hblxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgQ29udGV4dCBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZTpcblwKKyAgICAgICAgICAgICBkaGZpbGUgLSBUaGUgZmlsZSB0byBsb2FkIEVESCBwYXJhbWV0ZXJzIGZyb21cblwKK1JldHVybnM6ICAgTm9uZVxuXAorIjsKK3N0YXRpYyBQeU9iamVjdCAqCitzc2xfQ29udGV4dF9sb2FkX3RtcF9kaChzc2xfQ29udGV4dE9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY2hhciAqZGhmaWxlOworICAgIEJJTyAqYmlvOworICAgIERIICpkaDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpsb2FkX3RtcF9kaCIsICZkaGZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGJpbyA9IEJJT19uZXdfZmlsZShkaGZpbGUsICJyIik7CisgICAgaWYgKGJpbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKworICAgIGRoID0gUEVNX3JlYWRfYmlvX0RIcGFyYW1zKGJpbywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgU1NMX0NUWF9zZXRfdG1wX2RoKHNlbGYtPmN0eCwgZGgpOworICAgIERIX2ZyZWUoZGgpOworICAgIEJJT19mcmVlKGJpbyk7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBjaGFyIHNzbF9Db250ZXh0X3NldF9jaXBoZXJfbGlzdF9kb2NbXSA9ICJcblwKK0NoYW5nZSB0aGUgY2lwaGVyIGxpc3RcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbnRleHQgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAgY2lwaGVyX2xpc3QgLSBBIGNpcGhlciBsaXN0LCBzZWUgY2lwaGVycygxKVxuXAorUmV0dXJuczogICBOb25lXG5cCisiOworc3RhdGljIFB5T2JqZWN0ICoKK3NzbF9Db250ZXh0X3NldF9jaXBoZXJfbGlzdChzc2xfQ29udGV4dE9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY2hhciAqY2lwaGVyX2xpc3Q7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6c2V0X2NpcGhlcl9saXN0IiwgJmNpcGhlcl9saXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoIVNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KHNlbGYtPmN0eCwgY2lwaGVyX2xpc3QpKQorICAgIHsKKyAgICAgICAgZXhjZXB0aW9uX2Zyb21fZXJyb3JfcXVldWUoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorfQorCitzdGF0aWMgY2hhciBzc2xfQ29udGV4dF9zZXRfdGltZW91dF9kb2NbXSA9ICJcblwKK1NldCBzZXNzaW9uIHRpbWVvdXRcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbnRleHQgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAgdCAtIFRoZSB0aW1lb3V0IGluIHNlY29uZHNcblwKK1JldHVybnM6ICAgVGhlIHByZXZpb3VzIHNlc3Npb24gdGltZW91dFxuXAorIjsKK3N0YXRpYyBQeU9iamVjdCAqCitzc2xfQ29udGV4dF9zZXRfdGltZW91dChzc2xfQ29udGV4dE9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgbG9uZyB0LCByZXQ7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6c2V0X3RpbWVvdXQiLCAmdCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0ID0gU1NMX0NUWF9zZXRfdGltZW91dChzZWxmLT5jdHgsIHQpOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcocmV0KTsKK30KKworc3RhdGljIGNoYXIgc3NsX0NvbnRleHRfZ2V0X3RpbWVvdXRfZG9jW10gPSAiXG5cCitHZXQgdGhlIHNlc3Npb24gdGltZW91dFxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgQ29udGV4dCBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZSBlbXB0eVxuXAorUmV0dXJuczogICBUaGUgc2Vzc2lvbiB0aW1lb3V0XG5cCisiOworc3RhdGljIFB5T2JqZWN0ICoKK3NzbF9Db250ZXh0X2dldF90aW1lb3V0KHNzbF9Db250ZXh0T2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBsb25nIHJldDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldF90aW1lb3V0IikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0ID0gU1NMX0NUWF9nZXRfdGltZW91dChzZWxmLT5jdHgpOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcocmV0KTsKK30KKworc3RhdGljIGNoYXIgc3NsX0NvbnRleHRfc2V0X2luZm9fY2FsbGJhY2tfZG9jW10gPSAiXG5cCitTZXQgdGhlIGluZm8gY2FsbGJhY2tcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbnRleHQgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmU6XG5cCisgICAgICAgICAgICAgY2FsbGJhY2sgLSBUaGUgUHl0aG9uIGNhbGxiYWNrIHRvIHVzZVxuXAorUmV0dXJuczogICBOb25lXG5cCisiOworc3RhdGljIFB5T2JqZWN0ICoKK3NzbF9Db250ZXh0X3NldF9pbmZvX2NhbGxiYWNrKHNzbF9Db250ZXh0T2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBQeU9iamVjdCAqY2FsbGJhY2s7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86c2V0X2luZm9fY2FsbGJhY2siLCAmY2FsbGJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhjYWxsYmFjaykpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0ZWQgUHlDYWxsYWJsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBQeV9ERUNSRUYoc2VsZi0+aW5mb19jYWxsYmFjayk7CisgICAgUHlfSU5DUkVGKGNhbGxiYWNrKTsKKyAgICBzZWxmLT5pbmZvX2NhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgU1NMX0NUWF9zZXRfaW5mb19jYWxsYmFjayhzZWxmLT5jdHgsIGdsb2JhbF9pbmZvX2NhbGxiYWNrKTsKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KKworc3RhdGljIGNoYXIgc3NsX0NvbnRleHRfZ2V0X2FwcF9kYXRhX2RvY1tdID0gIlxuXAorR2V0IHRoZSBhcHBsaWNhdGlvbiBkYXRhIChzdXBwbGllZCB2aWEgc2V0X2FwcF9kYXRhKCkpXG5cCitcblwKK0FyZ3VtZW50czogc2VsZiAtIFRoZSBDb250ZXh0IG9iamVjdFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlIGVtcHR5XG5cCitSZXR1cm5zOiAgIFRoZSBhcHBsaWNhdGlvbiBkYXRhXG5cCisiOworc3RhdGljIFB5T2JqZWN0ICoKK3NzbF9Db250ZXh0X2dldF9hcHBfZGF0YShzc2xfQ29udGV4dE9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0X2FwcF9kYXRhIikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgUHlfSU5DUkVGKHNlbGYtPmFwcF9kYXRhKTsKKyAgICByZXR1cm4gc2VsZi0+YXBwX2RhdGE7Cit9CisKK3N0YXRpYyBjaGFyIHNzbF9Db250ZXh0X3NldF9hcHBfZGF0YV9kb2NbXSA9ICJcblwKK1NldCB0aGUgYXBwbGljYXRpb24gZGF0YSAod2lsbCBiZSByZXR1cm5lZCBmcm9tIGdldF9hcHBfZGF0YSgpKVxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgQ29udGV4dCBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZTpcblwKKyAgICAgICAgICAgICBkYXRhIC0gQW55IFB5dGhvbiBvYmplY3RcblwKK1JldHVybnM6ICAgTm9uZVxuXAorIjsKK3N0YXRpYyBQeU9iamVjdCAqCitzc2xfQ29udGV4dF9zZXRfYXBwX2RhdGEoc3NsX0NvbnRleHRPYmogKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIFB5T2JqZWN0ICpkYXRhOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOnNldF9hcHBfZGF0YSIsICZkYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBQeV9ERUNSRUYoc2VsZi0+YXBwX2RhdGEpOworICAgIFB5X0lOQ1JFRihkYXRhKTsKKyAgICBzZWxmLT5hcHBfZGF0YSA9IGRhdGE7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBjaGFyIHNzbF9Db250ZXh0X2dldF9jZXJ0X3N0b3JlX2RvY1tdID0gIlxuXAorR2V0IHRoZSBjZXJ0aWZpY2F0ZSBzdG9yZSBmb3IgdGhlIGNvbnRleHRcblwKK1xuXAorQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbnRleHQgb2JqZWN0XG5cCisgICAgICAgICAgIGFyZ3MgLSBUaGUgUHl0aG9uIGFyZ3VtZW50IHR1cGxlLCBzaG91bGQgYmUgZW1wdHlcblwKK1JldHVybnM6ICAgQSBYNTA5U3RvcmUgb2JqZWN0XG5cCisiOworc3RhdGljIFB5T2JqZWN0ICoKK3NzbF9Db250ZXh0X2dldF9jZXJ0X3N0b3JlKHNzbF9Db250ZXh0T2JqICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBYNTA5X1NUT1JFICpzdG9yZTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldF9jZXJ0X3N0b3JlIikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKChzdG9yZSA9IFNTTF9DVFhfZ2V0X2NlcnRfc3RvcmUoc2VsZi0+Y3R4KSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKiljcnlwdG9fWDUwOVN0b3JlX05ldyhzdG9yZSwgMCk7CisgICAgfQorfQorCitzdGF0aWMgY2hhciBzc2xfQ29udGV4dF9zZXRfb3B0aW9uc19kb2NbXSA9ICJcblwKK0FkZCBvcHRpb25zLiBPcHRpb25zIHNldCBiZWZvcmUgYXJlIG5vdCBjbGVhcmVkIVxuXAorXG5cCitBcmd1bWVudHM6IHNlbGYgLSBUaGUgQ29udGV4dCBvYmplY3RcblwKKyAgICAgICAgICAgYXJncyAtIFRoZSBQeXRob24gYXJndW1lbnQgdHVwbGUsIHNob3VsZCBiZTpcblwKKyAgICAgICAgICAgICBvcHRpb25zIC0gVGhlIG9wdGlvbnMgdG8gYWRkLlxuXAorUmV0dXJuczogICBUaGUgbmV3IG9wdGlvbiBiaXRtYXNrLlxuXAorIjsKK3N0YXRpYyBQeU9iamVjdCAqCitzc2xfQ29udGV4dF9zZXRfb3B0aW9ucyhzc2xfQ29udGV4dE9iaiAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgbG9uZyBvcHRpb25zOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOnNldF9vcHRpb25zIiwgJm9wdGlvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhTU0xfQ1RYX3NldF9vcHRpb25zKHNlbGYtPmN0eCwgb3B0aW9ucykpOworfQorCisKKy8qCisgKiBNZW1iZXIgbWV0aG9kcyBpbiB0aGUgQ29udGV4dCBvYmplY3QKKyAqIEFERF9NRVRIT0QobmFtZSkgZXhwYW5kcyB0byBhIGNvcnJlY3QgUHlNZXRob2REZWYgZGVjbGFyYXRpb24KKyAqICAgeyAgJ25hbWUnLCAoUHlDRnVuY3Rpb24pc3NsX0NvbnRleHRfbmFtZSwgTUVUSF9WQVJBUkdTIH0KKyAqIGZvciBjb252ZW5pZW5jZQorICogQUREX0FMSUFTKG5hbWUscmVhbCkgY3JlYXRlcyBhbiAiYWxpYXMiIG9mIHRoZSBzc2xfQ29udGV4dF9yZWFsCisgKiBmdW5jdGlvbiB3aXRoIHRoZSBuYW1lICduYW1lJworICovCisjZGVmaW5lIEFERF9NRVRIT0QobmFtZSkgeyAjbmFtZSwgKFB5Q0Z1bmN0aW9uKXNzbF9Db250ZXh0XyMjbmFtZSwgTUVUSF9WQVJBUkdTLCBzc2xfQ29udGV4dF8jI25hbWUjI19kb2MgfQorc3RhdGljIFB5TWV0aG9kRGVmIHNzbF9Db250ZXh0X21ldGhvZHNbXSA9IHsKKyAgICBBRERfTUVUSE9EKGxvYWRfdmVyaWZ5X2xvY2F0aW9ucyksCisgICAgQUREX01FVEhPRChzZXRfcGFzc3dkX2NiKSwKKyAgICBBRERfTUVUSE9EKHVzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKSwKKyAgICBBRERfTUVUSE9EKHVzZV9jZXJ0aWZpY2F0ZV9maWxlKSwKKyAgICBBRERfTUVUSE9EKHVzZV9jZXJ0aWZpY2F0ZSksCisgICAgQUREX01FVEhPRCh1c2VfcHJpdmF0ZWtleV9maWxlKSwKKyAgICBBRERfTUVUSE9EKHVzZV9wcml2YXRla2V5KSwKKyAgICBBRERfTUVUSE9EKGNoZWNrX3ByaXZhdGVrZXkpLAorICAgIEFERF9NRVRIT0QobG9hZF9jbGllbnRfY2EpLAorICAgIEFERF9NRVRIT0Qoc2V0X3Nlc3Npb25faWQpLAorICAgIEFERF9NRVRIT0Qoc2V0X3ZlcmlmeSksCisgICAgQUREX01FVEhPRChzZXRfdmVyaWZ5X2RlcHRoKSwKKyAgICBBRERfTUVUSE9EKGdldF92ZXJpZnlfbW9kZSksCisgICAgQUREX01FVEhPRChnZXRfdmVyaWZ5X2RlcHRoKSwKKyAgICBBRERfTUVUSE9EKGxvYWRfdG1wX2RoKSwKKyAgICBBRERfTUVUSE9EKHNldF9jaXBoZXJfbGlzdCksCisgICAgQUREX01FVEhPRChzZXRfdGltZW91dCksCisgICAgQUREX01FVEhPRChnZXRfdGltZW91dCksCisgICAgQUREX01FVEhPRChzZXRfaW5mb19jYWxsYmFjayksCisgICAgQUREX01FVEhPRChnZXRfYXBwX2RhdGEpLAorICAgIEFERF9NRVRIT0Qoc2V0X2FwcF9kYXRhKSwKKyAgICBBRERfTUVUSE9EKGdldF9jZXJ0X3N0b3JlKSwKKyAgICBBRERfTUVUSE9EKHNldF9vcHRpb25zKSwKKyAgICB7IE5VTEwsIE5VTEwgfQorfTsKKyN1bmRlZiBBRERfTUVUSE9ECisKKworLyogQ29uc3RydWN0b3IsIHRha2VzIGFuIGludCBzcGVjaWZ5aW5nIHdoaWNoIG1ldGhvZCB0byB1c2UgKi8KKy8qCisgKiBDb25zdHJ1Y3RvciBmb3IgQ29udGV4dCBvYmplY3RzCisgKgorICogQXJndW1lbnRzOiBpX21ldGhvZCAtIFRoZSBTU0wgbWV0aG9kIHRvIHVzZSwgb25lIG9mIHRoZSBTU0x2Ml9NRVRIT0QsCisgKiAgICAgICAgICAgICAgICAgICAgICAgU1NMdjNfTUVUSE9ELCBTU0x2MjNfTUVUSE9EIGFuZCBUTFN2MV9NRVRIT0QKKyAqICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudHMuCisgKiBSZXR1cm5zOiAgIFRoZSBuZXdseSBjcmVhdGVkIENvbnRleHQgb2JqZWN0CisgKi8KK3NzbF9Db250ZXh0T2JqICoKK3NzbF9Db250ZXh0X05ldyhpbnQgaV9tZXRob2QpCit7CisgICAgU1NMX01FVEhPRCAqbWV0aG9kOworICAgIHNzbF9Db250ZXh0T2JqICpzZWxmOworCisgICAgc3dpdGNoIChpX21ldGhvZCkKKyAgICB7CisgICAgICAgIC8qIFRvbyBiYWQgVExTdjEgc2VydmVycyBjYW4ndCBhY2NlcHQgU1NMdjMgY2xpZW50cyAqLworICAgICAgICBjYXNlIHNzbF9TU0x2Ml9NRVRIT0Q6ICAgIG1ldGhvZCA9IFNTTHYyX21ldGhvZCgpOyAgYnJlYWs7CisgICAgICAgIGNhc2Ugc3NsX1NTTHYyM19NRVRIT0Q6ICAgbWV0aG9kID0gU1NMdjIzX21ldGhvZCgpOyBicmVhazsKKyAgICAgICAgY2FzZSBzc2xfU1NMdjNfTUVUSE9EOiAgICBtZXRob2QgPSBTU0x2M19tZXRob2QoKTsgIGJyZWFrOworICAgICAgICBjYXNlIHNzbF9UTFN2MV9NRVRIT0Q6ICAgIG1ldGhvZCA9IFRMU3YxX21ldGhvZCgpOyAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIk5vIHN1Y2ggcHJvdG9jb2wiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNlbGYgPSBQeU9iamVjdF9HQ19OZXcoc3NsX0NvbnRleHRPYmosICZzc2xfQ29udGV4dF9UeXBlKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKHNzbF9Db250ZXh0T2JqICopUHlFcnJfTm9NZW1vcnkoKTsKKworICAgIHNlbGYtPmN0eCA9IFNTTF9DVFhfbmV3KG1ldGhvZCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHNlbGYtPnBhc3NwaHJhc2VfY2FsbGJhY2sgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBzZWxmLT52ZXJpZnlfY2FsbGJhY2sgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBzZWxmLT5pbmZvX2NhbGxiYWNrID0gUHlfTm9uZTsKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBzZWxmLT5wYXNzcGhyYXNlX3VzZXJkYXRhID0gUHlfTm9uZTsKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBzZWxmLT5hcHBfZGF0YSA9IFB5X05vbmU7CisKKyAgICAvKiBTb21lIGluaXRpYWxpemF0aW9uIHRoYXQncyByZXF1aXJlZCB0byBvcGVyYXRlIHNtb290aGx5IGluIFB5dGhvbiAqLworICAgIFNTTF9DVFhfc2V0X2FwcF9kYXRhKHNlbGYtPmN0eCwgc2VsZik7CisgICAgU1NMX0NUWF9zZXRfbW9kZShzZWxmLT5jdHgsIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX01PREVfQUNDRVBUX01PVklOR19XUklURV9CVUZGRVIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfTU9ERV9BVVRPX1JFVFJZKTsKKworICAgIHNlbGYtPnRzdGF0ZSA9IE5VTEw7CisgICAgUHlPYmplY3RfR0NfVHJhY2soKFB5T2JqZWN0ICopc2VsZik7CisKKyAgICByZXR1cm4gc2VsZjsKK30KKworLyoKKyAqIEZpbmQgYXR0cmlidXRlCisgKgorICogQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbnRleHQgb2JqZWN0CisgKiAgICAgICAgICAgIG5hbWUgLSBUaGUgYXR0cmlidXRlIG5hbWUKKyAqIFJldHVybnM6ICAgQSBQeXRob24gb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlLCBvciBOVUxMIGlmIHNvbWV0aGluZyB3ZW50CisgKiAgICAgICAgICAgIHdyb25nCisgKi8KK3N0YXRpYyBQeU9iamVjdCAqCitzc2xfQ29udGV4dF9nZXRhdHRyKHNzbF9Db250ZXh0T2JqICpzZWxmLCBjaGFyICpuYW1lKQoreworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKHNzbF9Db250ZXh0X21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworfQorCisvKgorICogQ2FsbCB0aGUgdmlzaXRwcm9jIG9uIGFsbCBjb250YWluZWQgb2JqZWN0cy4KKyAqCisgKiBBcmd1bWVudHM6IHNlbGYgLSBUaGUgQ29udGV4dCBvYmplY3QKKyAqICAgICAgICAgICAgdmlzaXQgLSBGdW5jdGlvbiB0byBjYWxsCisgKiAgICAgICAgICAgIGFyZyAtIEV4dHJhIGFyZ3VtZW50IHRvIHZpc2l0CisgKiBSZXR1cm5zOiAgIDAgaWYgYWxsIGdvZXMgd2VsbCwgb3RoZXJ3aXNlIHRoZSByZXR1cm4gY29kZSBmcm9tIHRoZSBmaXJzdAorICogICAgICAgICAgICBjYWxsIHRoYXQgZ2F2ZSBub24temVybyByZXN1bHQuCisgKi8KK3N0YXRpYyBpbnQKK3NzbF9Db250ZXh0X3RyYXZlcnNlKHNzbF9Db250ZXh0T2JqICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKK3sKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmIChyZXQgPT0gMCAmJiBzZWxmLT5wYXNzcGhyYXNlX2NhbGxiYWNrICE9IE5VTEwpCisgICAgICAgIHJldCA9IHZpc2l0KChQeU9iamVjdCAqKXNlbGYtPnBhc3NwaHJhc2VfY2FsbGJhY2ssIGFyZyk7CisgICAgaWYgKHJldCA9PSAwICYmIHNlbGYtPnBhc3NwaHJhc2VfdXNlcmRhdGEgIT0gTlVMTCkKKyAgICAgICAgcmV0ID0gdmlzaXQoKFB5T2JqZWN0ICopc2VsZi0+cGFzc3BocmFzZV91c2VyZGF0YSwgYXJnKTsKKyAgICBpZiAocmV0ID09IDAgJiYgc2VsZi0+dmVyaWZ5X2NhbGxiYWNrICE9IE5VTEwpCisgICAgICAgIHJldCA9IHZpc2l0KChQeU9iamVjdCAqKXNlbGYtPnZlcmlmeV9jYWxsYmFjaywgYXJnKTsKKyAgICBpZiAocmV0ID09IDAgJiYgc2VsZi0+aW5mb19jYWxsYmFjayAhPSBOVUxMKQorICAgICAgICByZXQgPSB2aXNpdCgoUHlPYmplY3QgKilzZWxmLT5pbmZvX2NhbGxiYWNrLCBhcmcpOworICAgIGlmIChyZXQgPT0gMCAmJiBzZWxmLT5hcHBfZGF0YSAhPSBOVUxMKQorICAgICAgICByZXQgPSB2aXNpdChzZWxmLT5hcHBfZGF0YSwgYXJnKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICogRGVjcmVmIGFsbCBjb250YWluZWQgb2JqZWN0cyBhbmQgemVybyB0aGUgcG9pbnRlcnMuCisgKgorICogQXJndW1lbnRzOiBzZWxmIC0gVGhlIENvbnRleHQgb2JqZWN0CisgKiBSZXR1cm5zOiAgIEFsd2F5cyAwLgorICovCitzdGF0aWMgaW50Citzc2xfQ29udGV4dF9jbGVhcihzc2xfQ29udGV4dE9iaiAqc2VsZikKK3sKKyAgICBQeV9YREVDUkVGKHNlbGYtPnBhc3NwaHJhc2VfY2FsbGJhY2spOworICAgIHNlbGYtPnBhc3NwaHJhc2VfY2FsbGJhY2sgPSBOVUxMOworICAgIFB5X1hERUNSRUYoc2VsZi0+cGFzc3BocmFzZV91c2VyZGF0YSk7CisgICAgc2VsZi0+cGFzc3BocmFzZV91c2VyZGF0YSA9IE5VTEw7CisgICAgUHlfWERFQ1JFRihzZWxmLT52ZXJpZnlfY2FsbGJhY2spOworICAgIHNlbGYtPnZlcmlmeV9jYWxsYmFjayA9IE5VTEw7CisgICAgUHlfWERFQ1JFRihzZWxmLT5pbmZvX2NhbGxiYWNrKTsKKyAgICBzZWxmLT5pbmZvX2NhbGxiYWNrID0gTlVMTDsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmFwcF9kYXRhKTsKKyAgICBzZWxmLT5hcHBfZGF0YSA9IE5VTEw7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWFsbG9jYXRlIHRoZSBtZW1vcnkgdXNlZCBieSB0aGUgQ29udGV4dCBvYmplY3QKKyAqCisgKiBBcmd1bWVudHM6IHNlbGYgLSBUaGUgQ29udGV4dCBvYmplY3QKKyAqIFJldHVybnM6ICAgTm9uZQorICovCitzdGF0aWMgdm9pZAorc3NsX0NvbnRleHRfZGVhbGxvYyhzc2xfQ29udGV4dE9iaiAqc2VsZikKK3sKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKChQeU9iamVjdCAqKXNlbGYpOworICAgIFNTTF9DVFhfZnJlZShzZWxmLT5jdHgpOworICAgIHNzbF9Db250ZXh0X2NsZWFyKHNlbGYpOworICAgIFB5T2JqZWN0X0dDX0RlbChzZWxmKTsKK30KKworCitQeVR5cGVPYmplY3Qgc3NsX0NvbnRleHRfVHlwZSA9IHsKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLAorICAgICJDb250ZXh0IiwKKyAgICBzaXplb2Yoc3NsX0NvbnRleHRPYmopLAorICAgIDAsCisgICAgKGRlc3RydWN0b3Ipc3NsX0NvbnRleHRfZGVhbGxvYywKKyAgICBOVUxMLCAvKiBwcmludCAqLworICAgIChnZXRhdHRyZnVuYylzc2xfQ29udGV4dF9nZXRhdHRyLAorICAgIE5VTEwsIC8qIHNldGF0dHIgKi8KKyAgICBOVUxMLCAvKiBjb21wYXJlICovCisgICAgTlVMTCwgLyogcmVwciAqLworICAgIE5VTEwsIC8qIGFzX251bWJlciAqLworICAgIE5VTEwsIC8qIGFzX3NlcXVlbmNlICovCisgICAgTlVMTCwgLyogYXNfbWFwcGluZyAqLworICAgIE5VTEwsIC8qIGhhc2ggKi8KKyAgICBOVUxMLCAvKiBjYWxsICovCisgICAgTlVMTCwgLyogc3RyICovCisgICAgTlVMTCwgLyogZ2V0YXR0cm8gKi8KKyAgICBOVUxMLCAvKiBzZXRhdHRybyAqLworICAgIE5VTEwsIC8qIGFzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywKKyAgICBOVUxMLCAvKiBkb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXNzbF9Db250ZXh0X3RyYXZlcnNlLAorICAgIChpbnF1aXJ5KXNzbF9Db250ZXh0X2NsZWFyLAorfTsKKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgQ29udGV4dCBwYXJ0IG9mIHRoZSBTU0wgc3ViIG1vZHVsZQorICoKKyAqIEFyZ3VtZW50czogZGljdCAtIERpY3Rpb25hcnkgb2YgdGhlIE9wZW5TU0wuU1NMIG1vZHVsZQorICogUmV0dXJuczogICAxIGZvciBzdWNjZXNzLCAwIG90aGVyd2lzZQorICovCitpbnQKK2luaXRfc3NsX2NvbnRleHQoUHlPYmplY3QgKmRpY3QpCit7CisgICAgc3NsX0NvbnRleHRfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIFB5X0lOQ1JFRigmc3NsX0NvbnRleHRfVHlwZSk7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJDb250ZXh0VHlwZSIsIChQeU9iamVjdCAqKSZzc2xfQ29udGV4dF9UeXBlKSAhPSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9zcmMvc3NsL2NvbnRleHQuaCBiL3NyYy9zc2wvY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MmFjZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3NsL2NvbnRleHQuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogY29udGV4dC5oCisgKgorICogQ29weXJpZ2h0IChDKSBBQiBTdHJha3QgMjAwMSwgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIEV4cG9ydCBTU0wgQ29udGV4dCBvYmplY3QgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMuCisgKiBTZWUgdGhlIGZpbGUgUkFUSU9OQUxFIGZvciBhIHNob3J0IGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIG1vZHVsZSB3YXMgd3JpdHRlbi4KKyAqCisgKiBSZXZpZXdlZCAyMDAxLTA3LTIzCisgKgorICogQCgjKSAkSWQ6IGNvbnRleHQuaCx2IDEuNiAyMDAyLzA5LzA0IDIyOjI0OjU5IGlrbyBFeHAgJAorICovCisjaWZuZGVmIFB5T3BlblNTTF9TU0xfQ09OVEVYVF9IXworI2RlZmluZSBQeU9wZW5TU0xfU1NMX0NPTlRFWFRfSF8KKworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisKK2V4dGVybiAgaW50ICAgICAgICAgICAgICAgICAgIGluaXRfc3NsX2NvbnRleHQgICAgICAoUHlPYmplY3QgKik7CisKK2V4dGVybiAgUHlUeXBlT2JqZWN0ICAgICAgc3NsX0NvbnRleHRfVHlwZTsKKworI2RlZmluZSBzc2xfQ29udGV4dF9DaGVjayh2KSAoKHYpLT5vYl90eXBlID09ICZzc2xfQ29udGV4dF9UeXBlKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFNTTF9DVFggICAgICAgICAgICAgKmN0eDsKKyAgICBQeU9iamVjdCAgICAgICAgICAgICpwYXNzcGhyYXNlX2NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgKnBhc3NwaHJhc2VfdXNlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAqdmVyaWZ5X2NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgKmluZm9fY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAqYXBwX2RhdGE7CisgICAgUHlUaHJlYWRTdGF0ZSAgICAgICAqdHN0YXRlOworfSBzc2xfQ29udGV4dE9iajsKKworI2RlZmluZSBzc2xfU1NMdjJfTUVUSE9EICAgICAgKDEpCisjZGVmaW5lIHNzbF9TU0x2M19NRVRIT0QgICAgICAoMikKKyNkZWZpbmUgc3NsX1NTTHYyM19NRVRIT0QgICAgICgzKQorI2RlZmluZSBzc2xfVExTdjFfTUVUSE9EICAgICAgKDQpCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvc3NsL3NzbC5jIGIvc3JjL3NzbC9zc2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDNhYmQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NzbC9zc2wuYwpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIHNzbC5jCisgKgorICogQ29weXJpZ2h0IChDKSBBQiBTdHJha3QgMjAwMSwgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIE1haW4gZmlsZSBvZiB0aGUgU1NMIHN1YiBtb2R1bGUuCisgKiBTZWUgdGhlIGZpbGUgUkFUSU9OQUxFIGZvciBhIHNob3J0IGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIG1vZHVsZSB3YXMgd3JpdHRlbi4KKyAqCisgKiBSZXZpZXdlZCAyMDAxLTA3LTIzCisgKi8KKyNpbmNsdWRlIDxQeXRob24uaD4KKyNkZWZpbmUgU1NMX01PRFVMRQorI2luY2x1ZGUgInNzbC5oIgorCitzdGF0aWMgY2hhciBzc2xfZG9jW10gPSAiXG5cCitNYWluIGZpbGUgb2YgdGhlIFNTTCBzdWIgbW9kdWxlLlxuXAorU2VlIHRoZSBmaWxlIFJBVElPTkFMRSBmb3IgYSBzaG9ydCBleHBsYW5hdGlvbiBvZiBoeSB0aGlzIG1vZHVsZSB3YXMgd3JpdHRlbi5cblwKKyI7CisKK3N0YXRpYyBjaGFyICpDVlNpZCA9ICJAKCMpICRJZDogc3NsLmMsdiAxLjEyIDIwMDQvMDgvMTAgMjE6NDI6NTEgbWFydGluIEV4cCAkIjsKKwordm9pZCAqKmNyeXB0b19BUEk7CisKKy8qIEV4Y2VwdGlvbnMgZGVmaW5lZCBieSB0aGUgU1NMIHN1Ym1vZHVsZSAqLworUHlPYmplY3QgKnNzbF9FcnJvciwgICAgICAgICAgICAgICAgICAgLyogQmFzZSBjbGFzcyAgICAgICAgICAgICAgKi8KKyAgICAgICAgICpzc2xfWmVyb1JldHVybkVycm9yLCAgICAgICAgIC8qIFVzZWQgd2l0aCBTU0xfZ2V0X2Vycm9yICovCisgICAgICAgICAqc3NsX1dhbnRSZWFkRXJyb3IsICAgICAgICAgICAvKiAuLi4gICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgKnNzbF9XYW50V3JpdGVFcnJvciwgICAgICAgICAgLyogLi4uICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICpzc2xfV2FudFg1MDlMb29rdXBFcnJvciwgICAgIC8qIC4uLiAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAqc3NsX1N5c0NhbGxFcnJvcjsgICAgICAgICAgICAvKiBVc2VzIChlcnJubyxlcnJzdHIpICAgICAqLworCitzdGF0aWMgY2hhciBzc2xfQ29udGV4dF9kb2NbXSA9ICJcblwKK1RoZSBmYWN0b3J5IGZ1bmN0aW9uIGluc2VydGVkIGluIHRoZSBtb2R1bGUgZGljdGlvbmFyeSB0byBjcmVhdGUgQ29udGV4dFxuXAorb2JqZWN0c1xuXAorXG5cCitBcmd1bWVudHM6IHNwYW0gLSBBbHdheXMgTlVMTFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlOlxuXAorICAgICAgICAgICAgIG1ldGhvZCAtIFRoZSBTU0wgbWV0aG9kIHRvIHVzZVxuXAorUmV0dXJuczogICBUaGUgQ29udGV4dCBvYmplY3RcblwKKyI7CisKK3N0YXRpYyBQeU9iamVjdCAqCitzc2xfQ29udGV4dChQeU9iamVjdCAqc3BhbSwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaW50IG1ldGhvZDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpDb250ZXh0IiwgJm1ldGhvZCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNzbF9Db250ZXh0X05ldyhtZXRob2QpOworfQorCitzdGF0aWMgY2hhciBzc2xfQ29ubmVjdGlvbl9kb2NbXSA9ICJcblwKK1RoZSBmYWN0b3J5IGZ1bmN0aW9uIGluc2VydGVkIGluIHRoZSBtb2R1bGUgZGljdGlvbmFyeSB0byBjcmVhdGUgQ29ubmVjdGlvblxuXAorb2JqZWN0c1xuXAorXG5cCitBcmd1bWVudHM6IHNwYW0gLSBBbHdheXMgTlVMTFxuXAorICAgICAgICAgICBhcmdzIC0gVGhlIFB5dGhvbiBhcmd1bWVudCB0dXBsZSwgc2hvdWxkIGJlOlxuXAorICAgICAgICAgICAgIGN0eCAgLSBBbiBTU0wgQ29udGV4dCB0byB1c2UgZm9yIHRoaXMgY29ubmVjdGlvblxuXAorICAgICAgICAgICAgIHNvY2sgLSBUaGUgc29ja2V0IHRvIHVzZSBmb3IgdHJhbnNwb3J0IGxheWVyXG5cCitSZXR1cm5zOiAgIFRoZSBDb25uZWN0aW9uIG9iamVjdFxuXAorIjsKKworc3RhdGljIFB5T2JqZWN0ICoKK3NzbF9Db25uZWN0aW9uKFB5T2JqZWN0ICpzcGFtLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBzc2xfQ29udGV4dE9iaiAqY3R4OworICAgIFB5T2JqZWN0ICpzb2NrOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIU86Q29ubmVjdGlvbiIsICZzc2xfQ29udGV4dF9UeXBlLCAmY3R4LCAmc29jaykpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNzbF9Db25uZWN0aW9uX05ldyhjdHgsIHNvY2spOworfQorCisKKy8qIE1ldGhvZHMgaW4gdGhlIE9wZW5TU0wuU1NMIG1vZHVsZSAqLworc3RhdGljIFB5TWV0aG9kRGVmIHNzbF9tZXRob2RzW10gPSB7CisgICAgeyAiQ29udGV4dCIsICAgICAgICBzc2xfQ29udGV4dCwgICAgTUVUSF9WQVJBUkdTLCBzc2xfQ29udGV4dF9kb2MgfSwKKyAgICB7ICJDb25uZWN0aW9uIiwgICAgIHNzbF9Db25uZWN0aW9uLCBNRVRIX1ZBUkFSR1MsIHNzbF9Db25uZWN0aW9uX2RvYyB9LAorICAgIHsgTlVMTCwgTlVMTCB9Cit9OworCisvKgorICogSW5pdGlhbGl6ZSBTU0wgc3ViIG1vZHVsZQorICoKKyAqIEFyZ3VtZW50czogTm9uZQorICogUmV0dXJuczogICBOb25lCisgKi8KK3ZvaWQKK2luaXRTU0wodm9pZCkKK3sKKyAgICBzdGF0aWMgdm9pZCAqc3NsX0FQSVtzc2xfQVBJX3BvaW50ZXJzXTsKKyAgICBQeU9iamVjdCAqc3NsX2FwaV9vYmplY3Q7CisgICAgUHlPYmplY3QgKm1vZHVsZSwgKmRpY3Q7CisKKyAgICBTU0xfbGlicmFyeV9pbml0KCk7CisgICAgRVJSX2xvYWRfU1NMX3N0cmluZ3MoKTsKKworICAgIGltcG9ydF9jcnlwdG8oKTsKKworICAgIGlmICgobW9kdWxlID0gUHlfSW5pdE1vZHVsZTMoIlNTTCIsIHNzbF9tZXRob2RzLCBzc2xfZG9jKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgQyBBUEkgcG9pbnRlciBhcnJheSAqLworICAgIHNzbF9BUElbc3NsX0NvbnRleHRfTmV3X05VTV0gICAgPSAodm9pZCAqKXNzbF9Db250ZXh0X05ldzsKKyAgICBzc2xfQVBJW3NzbF9Db25uZWN0aW9uX05ld19OVU1dID0gKHZvaWQgKilzc2xfQ29ubmVjdGlvbl9OZXc7CisgICAgc3NsX2FwaV9vYmplY3QgPSBQeUNPYmplY3RfRnJvbVZvaWRQdHIoKHZvaWQgKilzc2xfQVBJLCBOVUxMKTsKKyAgICBpZiAoc3NsX2FwaV9vYmplY3QgIT0gTlVMTCkKKyAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIl9DX0FQSSIsIHNzbF9hcGlfb2JqZWN0KTsKKworICAgIC8qIEV4Y2VwdGlvbnMgKi8KKy8qCisgKiBBRERfRVhDRVBUSU9OKGRpY3QsbmFtZSxiYXNlKSBleHBhbmRzIHRvIGEgY29ycmVjdCBFeGNlcHRpb24gZGVjbGFyYXRpb24sCisgKiBpbnNlcnRpbmcgT3BlblNTTC5TU0wubmFtZSBpbnRvIGRpY3QsIGRlcnZpdmluZyB0aGUgZXhjZXB0aW9uIGZyb20gYmFzZS4KKyAqLworI2RlZmluZSBBRERfRVhDRVBUSU9OKF9uYW1lLCBfYmFzZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3NsXyMjX25hbWUgPSBQeUVycl9OZXdFeGNlcHRpb24oIk9wZW5TU0wuU1NMLiIjX25hbWUsIF9iYXNlLCBOVUxMKTtcCisgICAgaWYgKHNzbF8jI19uYW1lID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdvdG8gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICNfbmFtZSwgc3NsXyMjX25hbWUpICE9IDApICAgICAgICAgICBcCisgICAgICAgIGdvdG8gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgc3NsX0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJPcGVuU1NMLlNTTC5FcnJvciIsIE5VTEwsIE5VTEwpOworICAgIGlmIChzc2xfRXJyb3IgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIkVycm9yIiwgc3NsX0Vycm9yKSAhPSAwKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgQUREX0VYQ0VQVElPTihaZXJvUmV0dXJuRXJyb3IsICAgICBzc2xfRXJyb3IpOworICAgIEFERF9FWENFUFRJT04oV2FudFJlYWRFcnJvciwgICAgICAgc3NsX0Vycm9yKTsKKyAgICBBRERfRVhDRVBUSU9OKFdhbnRXcml0ZUVycm9yLCAgICAgIHNzbF9FcnJvcik7CisgICAgQUREX0VYQ0VQVElPTihXYW50WDUwOUxvb2t1cEVycm9yLCBzc2xfRXJyb3IpOworICAgIEFERF9FWENFUFRJT04oU3lzQ2FsbEVycm9yLCAgICAgICAgc3NsX0Vycm9yKTsKKyN1bmRlZiBBRERfRVhDRVBUSU9OCisKKyAgICAvKiBNZXRob2QgY29uc3RhbnRzICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiU1NMdjJfTUVUSE9EIiwgIHNzbF9TU0x2Ml9NRVRIT0QpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG1vZHVsZSwgIlNTTHYzX01FVEhPRCIsICBzc2xfU1NMdjNfTUVUSE9EKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2R1bGUsICJTU0x2MjNfTUVUSE9EIiwgc3NsX1NTTHYyM19NRVRIT0QpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG1vZHVsZSwgIlRMU3YxX01FVEhPRCIsICBzc2xfVExTdjFfTUVUSE9EKTsKKworICAgIC8qIFZlcmlmeSBjb25zdGFudHMgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2R1bGUsICJWRVJJRllfTk9ORSIsIFNTTF9WRVJJRllfTk9ORSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiVkVSSUZZX1BFRVIiLCBTU0xfVkVSSUZZX1BFRVIpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG1vZHVsZSwgIlZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiVkVSSUZZX0NMSUVOVF9PTkNFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfVkVSSUZZX0NMSUVOVF9PTkNFKTsKKworICAgIC8qIEZpbGUgdHlwZSBjb25zdGFudHMgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2R1bGUsICJGSUxFVFlQRV9QRU0iLCAgU1NMX0ZJTEVUWVBFX1BFTSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiRklMRVRZUEVfQVNOMSIsIFNTTF9GSUxFVFlQRV9BU04xKTsKKworICAgIC8qIFNTTCBvcHRpb24gY29uc3RhbnRzICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiT1BfU0lOR0xFX0RIX1VTRSIsIFNTTF9PUF9TSU5HTEVfREhfVVNFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2R1bGUsICJPUF9FUEhFTUVSQUxfUlNBIiwgU1NMX09QX0VQSEVNRVJBTF9SU0EpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG1vZHVsZSwgIk9QX05PX1NTTHYyIiwgU1NMX09QX05PX1NTTHYyKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2R1bGUsICJPUF9OT19TU0x2MyIsIFNTTF9PUF9OT19TU0x2Myk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiT1BfTk9fVExTdjEiLCBTU0xfT1BfTk9fVExTdjEpOworCisgICAgLyogTW9yZSBTU0wgb3B0aW9uIGNvbnN0YW50cyAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG1vZHVsZSwgIk9QX01JQ1JPU09GVF9TRVNTX0lEX0JVRyIsIFNTTF9PUF9NSUNST1NPRlRfU0VTU19JRF9CVUcpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG1vZHVsZSwgIk9QX05FVFNDQVBFX0NIQUxMRU5HRV9CVUciLCBTU0xfT1BfTkVUU0NBUEVfQ0hBTExFTkdFX0JVRyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiT1BfTkVUU0NBUEVfUkVVU0VfQ0lQSEVSX0NIQU5HRV9CVUciLCBTU0xfT1BfTkVUU0NBUEVfUkVVU0VfQ0lQSEVSX0NIQU5HRV9CVUcpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG1vZHVsZSwgIk9QX1NTTFJFRjJfUkVVU0VfQ0VSVF9UWVBFX0JVRyIsIFNTTF9PUF9TU0xSRUYyX1JFVVNFX0NFUlRfVFlQRV9CVUcpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG1vZHVsZSwgIk9QX01JQ1JPU09GVF9CSUdfU1NMVjNfQlVGRkVSIiwgU1NMX09QX01JQ1JPU09GVF9CSUdfU1NMVjNfQlVGRkVSKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2R1bGUsICJPUF9NU0lFX1NTTFYyX1JTQV9QQURESU5HIiwgU1NMX09QX01TSUVfU1NMVjJfUlNBX1BBRERJTkcpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG1vZHVsZSwgIk9QX1NTTEVBWV8wODBfQ0xJRU5UX0RIX0JVRyIsIFNTTF9PUF9TU0xFQVlfMDgwX0NMSUVOVF9ESF9CVUcpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG1vZHVsZSwgIk9QX1RMU19ENV9CVUciLCBTU0xfT1BfVExTX0Q1X0JVRyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiT1BfVExTX0JMT0NLX1BBRERJTkdfQlVHIiwgU1NMX09QX1RMU19CTE9DS19QQURESU5HX0JVRyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiT1BfRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTIiwgU1NMX09QX0RPTlRfSU5TRVJUX0VNUFRZX0ZSQUdNRU5UUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiT1BfQUxMIiwgU1NMX09QX0FMTCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiT1BfQ0lQSEVSX1NFUlZFUl9QUkVGRVJFTkNFIiwgU1NMX09QX0NJUEhFUl9TRVJWRVJfUFJFRkVSRU5DRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiT1BfVExTX1JPTExCQUNLX0JVRyIsIFNTTF9PUF9UTFNfUk9MTEJBQ0tfQlVHKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2R1bGUsICJPUF9QS0NTMV9DSEVDS18xIiwgU1NMX09QX1BLQ1MxX0NIRUNLXzEpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG1vZHVsZSwgIk9QX1BLQ1MxX0NIRUNLXzIiLCBTU0xfT1BfUEtDUzFfQ0hFQ0tfMik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiT1BfTkVUU0NBUEVfQ0FfRE5fQlVHIiwgU1NMX09QX05FVFNDQVBFX0NBX0ROX0JVRyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCAiT1BfTkVUU0NBUEVfREVNT19DSVBIRVJfQ0hBTkdFX0JVRyIsIFNTTF9PUF9ORVRTQ0FQRV9ERU1PX0NJUEhFUl9DSEFOR0VfQlVHKTsKKworICAgIGRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZHVsZSk7CisgICAgaWYgKCFpbml0X3NzbF9jb250ZXh0KGRpY3QpKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGlmICghaW5pdF9zc2xfY29ubmVjdGlvbihkaWN0KSkKKyAgICAgICAgZ290byBlcnJvcjsKKworZXJyb3I6CisgICAgOworfQpkaWZmIC0tZ2l0IGEvc3JjL3NzbC9zc2wuaCBiL3NyYy9zc2wvc3NsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkM2U5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zc2wvc3NsLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIHNzbC5oCisgKgorICogQ29weXJpZ2h0IChDKSBBQiBTdHJha3QgMjAwMSwgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIEV4cG9ydCBmdW5jdGlvbnMgYW5kIGV4Y2VwdGlvbnMgZnJvbSB0aGUgU1NMIHN1YiBtb2R1bGUuCisgKiBTZWUgdGhlIGZpbGUgUkFUSU9OQUxFIGZvciBhIHNob3J0IGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIG1vZHVsZSB3YXMgd3JpdHRlbi4KKyAqCisgKiBSZXZpZXdlZCAyMDAxLTA3LTIzCisgKgorICogQCgjKSAkSWQ6IHNzbC5oLHYgMS42IDIwMDIvMDQvMDggMTk6MjU6NDMgbWFydGluIEV4cCAkCisgKi8KKyNpZm5kZWYgUHlPcGVuU1NMX1NTTF9IXworI2RlZmluZSBQeU9wZW5TU0xfU1NMX0hfCisKKyNpbmNsdWRlIDxQeXRob24uaD4KKyNpbmNsdWRlICJjb250ZXh0LmgiCisjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgIi4uL3V0aWwuaCIKKyNpbmNsdWRlICIuLi9jcnlwdG8vY3J5cHRvLmgiCisKK2V4dGVybiBQeU9iamVjdCAqc3NsX0Vycm9yLCAgICAgICAgICAgICAgIC8qIEJhc2UgY2xhc3MgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgKnNzbF9aZXJvUmV0dXJuRXJyb3IsICAgICAvKiBVc2VkIHdpdGggU1NMX2dldF9lcm9yciAqLworICAgICAgICAgICAgICAgICpzc2xfV2FudFJlYWRFcnJvciwgICAgICAgLyogLi4uICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAqc3NsX1dhbnRXcml0ZUVycm9yLCAgICAgIC8qIC4uLiAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgKnNzbF9XYW50WDUwOUxvb2t1cEVycm9yLCAvKiAuLi4gICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICpzc2xfU3lzQ2FsbEVycm9yOyAgICAgICAgLyogVXNlcyAoZXJybm8sZXJyc3RyKSAgICAgKi8KKworI2lmZGVmIGV4Y2VwdGlvbl9mcm9tX2Vycm9yX3F1ZXVlCisjICB1bmRlZiBleGNlcHRpb25fZnJvbV9lcnJvcl9xdWV1ZQorI2VuZGlmCisjZGVmaW5lIGV4Y2VwdGlvbl9mcm9tX2Vycm9yX3F1ZXVlKCkgICAgZG8geyBcCisgICAgUHlPYmplY3QgKmVycmxpc3QgPSBlcnJvcl9xdWV1ZV90b19saXN0KCk7IFwKKyAgICBQeUVycl9TZXRPYmplY3Qoc3NsX0Vycm9yLCBlcnJsaXN0KTsgXAorICAgIFB5X0RFQ1JFRihlcnJsaXN0KTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBzc2xfQ29udGV4dF9OZXdfTlVNICAgICAgIDAKKyNkZWZpbmUgc3NsX0NvbnRleHRfTmV3X1JFVFVSTiAgICBzc2xfQ29udGV4dE9iaiAqCisjZGVmaW5lIHNzbF9Db250ZXh0X05ld19QUk9UTyAgICAgKGludCBtZXRob2QpCisKKyNkZWZpbmUgc3NsX0Nvbm5lY3Rpb25fTmV3X05VTSAgICAxCisjZGVmaW5lIHNzbF9Db25uZWN0aW9uX05ld19SRVRVUk4gc3NsX0Nvbm5lY3Rpb25PYmogKgorI2RlZmluZSBzc2xfQ29ubmVjdGlvbl9OZXdfUFJPVE8gIChzc2xfQ29udGV4dE9iaiAqY3R4LCBQeU9iamVjdCAqc29jaykKKworI2RlZmluZSBzc2xfQVBJX3BvaW50ZXJzICAgICAgICAgIDIKKworI2lmZGVmIFNTTF9NT0RVTEUKKworZXh0ZXJuIHNzbF9Db250ZXh0X05ld19SRVRVUk4gICAgc3NsX0NvbnRleHRfTmV3ICAgIHNzbF9Db250ZXh0X05ld19QUk9UTzsKK2V4dGVybiBzc2xfQ29ubmVjdGlvbl9OZXdfUkVUVVJOIHNzbF9Db25uZWN0aW9uX05ldyBzc2xfQ29ubmVjdGlvbl9OZXdfUFJPVE87CisKKyNlbHNlIC8qIFNTTF9NT0RVTEUgKi8KKworZXh0ZXJuIHZvaWQgKipzc2xfQVBJOworCisjZGVmaW5lIHNzbF9Db250ZXh0X05ldyBcCisgKCooc3NsX0NvbnRleHRfTmV3X1JFVFVSTiAoKilzc2xfQ29udGV4dF9OZXdfUFJPVE8pIHNzbF9BUElbc3NsX0NvbnRleHRfTmV3X05VTV0pCisjZGVmaW5lIHNzbF9Db25uZWN0aW9uX05ldyBcCisgKCooc3NsX0Nvbm5lY3Rpb25fTmV3X1JFVFVSTiAoKilzc2xfQ29ubmVjdGlvbl9OZXdfUFJPVE8pIHNzbF9BUElbc3NsX0Nvbm5lY3Rpb25fTmV3X05VTV0pCisKKyNkZWZpbmUgaW1wb3J0X1NTTCgpIFwKK3sgXAorICBQeU9iamVjdCAqbW9kdWxlID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJPcGVuU1NMLlNTTCIpOyBcCisgIGlmIChtb2R1bGUgIT0gTlVMTCkgeyBcCisgICAgUHlPYmplY3QgKm1vZHVsZV9kaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtb2R1bGUpOyBcCisgICAgUHlPYmplY3QgKmNfYXBpX29iamVjdCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZV9kaWN0LCAiX0NfQVBJIik7IFwKKyAgICBpZiAoUHlDT2JqZWN0X0NoZWNrKGNfYXBpX29iamVjdCkpIHsgXAorICAgICAgc3NsX0FQSSA9ICh2b2lkICoqKVB5Q09iamVjdF9Bc1ZvaWRQdHIoY19hcGlfb2JqZWN0KTsgXAorICAgIH0gXAorICB9IFwKK30KKworI2VuZGlmIC8qIFNTTF9NT0RVTEUgKi8KKworI2VuZGlmIC8qIFB5T3BlblNTTF9TU0xfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy91dGlsLmMgYi9zcmMvdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZTcyYzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdXRpbC5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiB1dGlsLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIEFCIFN0cmFrdCAyMDAxLCBBbGwgcmlnaHRzIHJlc2VydmVkCisgKgorICogVXRpbGl0eSBmdW5jdGlvbnMuCisgKiBTZWUgdGhlIGZpbGUgUkFUSU9OQUxFIGZvciBhIHNob3J0IGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIG1vZHVsZSB3YXMgd3JpdHRlbi4KKyAqCisgKiBSZXZpZXdlZCAyMDAxLTA3LTIzCisgKi8KKyNpbmNsdWRlIDxQeXRob24uaD4KKyNpbmNsdWRlICJ1dGlsLmgiCisKK3N0YXRpYyBjaGFyICpDVlNpZCA9ICJAKCMpICRJZDogdXRpbC5jLHYgMS41IDIwMDEvMDgvMDkgMTE6MjY6MzYgbWFydGluIEV4cCAkIjsKKworCisvKgorICogRmx1c2ggT3BlblNTTCdzIGVycm9yIHF1ZXVlIGFuZCByZXR1cm4gYSBsaXN0IG9mIGVycm9ycyAoYSAobGlicmFyeSwKKyAqIGZ1bmN0aW9uLCByZWFzb24pIHN0cmluZyB0dXBsZSkKKyAqCisgKiBBcmd1bWVudHM6IE5vbmUKKyAqIFJldHVybnM6ICAgQSBsaXN0IG9mIGVycm9ycyAobmV3IHJlZmVyZW5jZSkKKyAqLworUHlPYmplY3QgKgorZXJyb3JfcXVldWVfdG9fbGlzdCh2b2lkKQoreworICAgIFB5T2JqZWN0ICplcnJsaXN0LCAqdHVwbGU7CisgICAgbG9uZyBlcnI7CisKKyAgICBlcnJsaXN0ID0gUHlMaXN0X05ldygwKTsKKworICAgIHdoaWxlICgoZXJyID0gRVJSX2dldF9lcnJvcigpKSAhPSAwKQorICAgIHsKKwl0dXBsZSA9IFB5X0J1aWxkVmFsdWUoIihzc3MpIiwgRVJSX2xpYl9lcnJvcl9zdHJpbmcoZXJyKSwKKwkJICAgICAgICAgICAgICAgICAgICAgICBFUlJfZnVuY19lcnJvcl9zdHJpbmcoZXJyKSwKKwkJCQkgICAgICAgRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcoZXJyKSk7CisgICAgICAgIFB5TGlzdF9BcHBlbmQoZXJybGlzdCwgdHVwbGUpOworICAgICAgICBQeV9ERUNSRUYodHVwbGUpOworICAgIH0KKworICAgIHJldHVybiBlcnJsaXN0OworfQorCisvKgorICogRmx1c2ggT3BlblNTTCdzIGVycm9yIHF1ZXVlIGFuZCBpZ25vcmUgdGhlIHJlc3VsdAorICoKKyAqIEFyZ3VtZW50czogTm9uZQorICogUmV0dXJuczogICBOb25lCisgKi8KK3ZvaWQKK2ZsdXNoX2Vycm9yX3F1ZXVlKHZvaWQpCit7CisgICAgUHlfREVDUkVGKGVycm9yX3F1ZXVlX3RvX2xpc3QoKSk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy91dGlsLmggYi9zcmMvdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MjY2MGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdXRpbC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogdXRpbC5oCisgKgorICogQ29weXJpZ2h0IChDKSBBQiBTdHJha3QgMjAwMSwgQWxsIHJpZ2h0cyByZXNlcnZlZAorICoKKyAqIEV4cG9ydCB1dGlsaXR5IGZ1bmN0aW9ucyBhbmQgbWFjcm9zLgorICogU2VlIHRoZSBmaWxlIFJBVElPTkFMRSBmb3IgYSBzaG9ydCBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBtb2R1bGUgd2FzIHdyaXR0ZW4uCisgKgorICogUmV2aWV3ZWQgMjAwMS0wNy0yMworICoKKyAqIEAoIykgJElkOiB1dGlsLmgsdiAxLjggMjAwMi8wOC8xNiAxMDowODowOSBtYXJ0aW4gRXhwICQKKyAqLworI2lmbmRlZiBQeU9wZW5TU0xfVVRJTF9IXworI2RlZmluZSBQeU9wZW5TU0xfVVRJTF9IXworCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworLyoKKyAqIHB5bWVtY29tcGF0IHdyaXR0ZW4gYnkgTWljaGFlbCBIdWRzb24gYW5kIGxldHMgeW91IHByb2dyYW0gdG8gdGhlCisgKiBQeXRob24gMi4zIG1lbW9yeSBBUEkgd2hpbGUga2VlcGluZyBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eS4KKyAqLworI2luY2x1ZGUgInB5bWVtY29tcGF0LmgiCisKK2V4dGVybiAgUHlPYmplY3QgKmVycm9yX3F1ZXVlX3RvX2xpc3Qodm9pZCk7CitleHRlcm4gIHZvaWQgICAgICBmbHVzaF9lcnJvcl9xdWV1ZSh2b2lkKTsKKworLyoKKyAqIFRoZXNlIGFyZSBuZWVkZWQgYmVjYXVzZSB0aGVyZSBpcyBubyAib2ZmaWNpYWwiIHdheSB0byBzcGVjaWZ5CisgKiBXSEVSRSB0byBzYXZlIHRoZSB0aHJlYWQgc3RhdGUuCisgKi8KKyNpZmRlZiBXSVRIX1RIUkVBRAorIyAgZGVmaW5lIE1ZX0JFR0lOX0FMTE9XX1RIUkVBRFMoc3QpICAgIFwKKyAgICB7IHN0ID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsgfQorIyAgZGVmaW5lIE1ZX0VORF9BTExPV19USFJFQURTKHN0KSAgICAgIFwKKyAgICB7IFB5RXZhbF9SZXN0b3JlVGhyZWFkKHN0KTsgc3QgPSBOVUxMOyB9CisjZWxzZQorIyAgZGVmaW5lIE1ZX0JFR0lOX0FMTE9XX1RIUkVBRFMoc3QpCisjICBkZWZpbmUgTVlfRU5EX0FMTE9XX1RIUkVBRFMoc3QpICAgICAgeyBzdCA9IE5VTEw7IH0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUFlfTUFKT1JfVkVSU0lPTikgfHwgUFlfVkVSU0lPTl9IRVggPCAweDAyMDAwMDAwCitzdGF0aWMgaW50CitQeU1vZHVsZV9BZGRPYmplY3QoUHlPYmplY3QgKm0sIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpvKQoreworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIGlmICghUHlNb2R1bGVfQ2hlY2sobSkgfHwgbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZGljdCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBuYW1lLCBvKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihvKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQoUHlPYmplY3QgKm0sIGNoYXIgKm5hbWUsIGxvbmcgdmFsdWUpCit7CisgICAgcmV0dXJuIFB5TW9kdWxlX0FkZE9iamVjdChtLCBuYW1lLCBQeUludF9Gcm9tTG9uZyh2YWx1ZSkpOworfQorCitzdGF0aWMgaW50IFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IoUHlPYmplY3QgKm8pCit7CisgICAgaW50IGZkOworICAgIFB5T2JqZWN0ICptZXRoOworCisgICAgaWYgKFB5SW50X0NoZWNrKG8pKSB7CisgICAgICAgIGZkID0gUHlJbnRfQXNMb25nKG8pOworICAgIH0KKyAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2sobykpIHsKKyAgICAgICAgZmQgPSBQeUxvbmdfQXNMb25nKG8pOworICAgIH0KKyAgICBlbHNlIGlmICgobWV0aCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobywgImZpbGVubyIpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlPYmplY3QgKmZubyA9IFB5RXZhbF9DYWxsT2JqZWN0KG1ldGgsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYobWV0aCk7CisgICAgICAgIGlmIChmbm8gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBpZiAoUHlJbnRfQ2hlY2soZm5vKSkgeworICAgICAgICAgICAgZmQgPSBQeUludF9Bc0xvbmcoZm5vKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmbm8pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVjayhmbm8pKSB7CisgICAgICAgICAgICBmZCA9IFB5TG9uZ19Bc0xvbmcoZm5vKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmbm8pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImZpbGVubygpIHJldHVybmVkIGEgbm9uLWludGVnZXIiKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmbm8pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJndW1lbnQgbXVzdCBiZSBhbiBpbnQsIG9yIGhhdmUgYSBmaWxlbm8oKSBtZXRob2QuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiZmlsZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSBhIG5lZ2F0aXZlIGludGVnZXIgKCVpKSIsIGZkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gZmQ7Cit9CisjZW5kaWYKKworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdHNhZmUucHkgYi90c2FmZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjVmMWEyCi0tLSAvZGV2L251bGwKKysrIGIvdHNhZmUucHkKQEAgLTAsMCArMSwyOCBAQAorZnJvbSBPcGVuU1NMIGltcG9ydCBTU0wKK19zc2wgPSBTU0wKK2RlbCBTU0wKKworaW1wb3J0IHRocmVhZGluZworX1JMb2NrID0gdGhyZWFkaW5nLlJMb2NrCitkZWwgdGhyZWFkaW5nCisKK2NsYXNzIENvbm5lY3Rpb246CisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5fc3NsX2Nvbm4gPSBhcHBseShfc3NsLkNvbm5lY3Rpb24sIGFyZ3MpCisgICAgICAgIHNlbGYuX2xvY2sgPSBfUkxvY2soKQorCisgICAgZm9yIGYgaW4gKCdnZXRfY29udGV4dCcsICdwZW5kaW5nJywgJ3NlbmQnLCAnd3JpdGUnLCAncmVjdicsICdyZWFkJywKKyAgICAgICAgICAgICAgJ3JlbmVnb3RpYXRlJywgJ2JpbmQnLCAnbGlzdGVuJywgJ2Nvbm5lY3QnLCAnYWNjZXB0JywKKyAgICAgICAgICAgICAgJ3NldGJsb2NraW5nJywgJ2ZpbGVubycsICdzaHV0ZG93bicsICdjbG9zZScsICdnZXRfY2lwaGVyX2xpc3QnLAorICAgICAgICAgICAgICAnZ2V0cGVlcm5hbWUnLCAnZ2V0c29ja25hbWUnLCAnZ2V0c29ja29wdCcsICdzZXRzb2Nrb3B0JywKKyAgICAgICAgICAgICAgJ21ha2VmaWxlJywgJ2dldF9hcHBfZGF0YScsICdzZXRfYXBwX2RhdGEnLCAnc3RhdGVfc3RyaW5nJywKKyAgICAgICAgICAgICAgJ3NvY2tfc2h1dGRvd24nLCAnZ2V0X3BlZXJfY2VydGlmaWNhdGUnLCAnd2FudF9yZWFkJywKKyAgICAgICAgICAgICAgJ3dhbnRfd3JpdGUnLCAnc2V0X2Nvbm5lY3Rfc3RhdGUnLCAnc2V0X2FjY2VwdF9zdGF0ZScsCisgICAgICAgICAgICAgICdjb25uZWN0X2V4JywgJ3NlbmRhbGwnKToKKyAgICAgICAgZXhlYyAiIiJkZWYgJXMoc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gYXBwbHkoc2VsZi5fc3NsX2Nvbm4uJXMsIGFyZ3MpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNlbGYuX2xvY2sucmVsZWFzZSgpXG4iIiIgJSAoZiwgZikKKwpkaWZmIC0tZ2l0IGEvdmVyc2lvbi5weSBiL3ZlcnNpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjMjhiMQotLS0gL2Rldi9udWxsCisrKyBiL3ZlcnNpb24ucHkKQEAgLTAsMCArMSwxMSBAQAorIworIyB2ZXJzaW9uLnB5CisjCisjIENvcHlyaWdodCAoQykgQUIgU3RyYWt0IDIwMDEtMjAwNCwgQWxsIHJpZ2h0cyByZXNlcnZlZAorIworIyAkSWQ6IHZlcnNpb24ucHksdiAxLjIgMjAwNC8wOC8xMyAxODo0NjowNCBtYXJ0aW4gRXhwICQKKyMKKyIiIgorcHlPcGVuU1NMIC0gQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIE9wZW5TU0wgbGlicmFyeQorIiIiCitfX3ZlcnNpb25fXyA9ICcwLjYnCg==